人間らしくプレーするAIは、どのような戦略を取ればいいのでしょうか。 必勝方法を知っているなら、先の必勝のためのAIと同じになりますから、ここではそのような擬人は除外しましょう。
思いつくまま候補をあげてみます。
さすがに、でたらめ君は対戦してもおもしろくないでしょう。
二番目の先読み機能の実現には、nimだと指手の選択肢が限られているので、 先読みの結果必勝AIと同じ結果になることが予測できます。 ですので、三番目はもちろん、二番目でも対人では強すぎてしまうでしょう。
必勝戦略を緩めて、特定の山にだけ注目して、最善手を指すようなAIはどうでしょうか。 nimでは、全体の山の調和を考慮しないと、結局ランダムに指手を選択しているのと 同じことになってしまいます。この戦略では弱すぎるAIになるでしょう。
他に、有効な戦略はないでしょうか。
必勝戦略を知っている人間がプレーしていても、時々安定状態の判定や 適切な山と石の個数の計算を間違えることがあります。 この要素を入れることで、ほどほど強いAIをめざすことにしましょう。 間違える頻度を調節すれば、弱くも強くもできるはずです。
それでは、プログラムとして戦略を実現してみましょう。
nim_ai3.rb, nim_ai4.rbのAI3, AI4クラスで、インスタンス変数(0.0 <= ) @strength ( < 1.0 )を定義して、乱数による間違え発生のしきい値を 指定しています。@strengthは値が小さいほど間違えが発生しにくくなります。
ここまでのプロトタイプ制作によって、nimをプレーするコンピューターの基本機能の実現に確信が持てました。
次のフェーズでは、Webアプリケーションとしてプログラムを実装していきます。
...つづく (2009/4/6)