Amazonでボードゲームを探す

分析3

人間らしくプレーするAIについての考察

人間らしくプレーするAIは、どのような戦略を取ればいいのでしょうか。 必勝方法を知っているなら、先の必勝のためのAIと同じになりますから、ここではそのような擬人は除外しましょう。

思いつくまま候補をあげてみます。

  1. でたらめに山を選び、でたらめに石を取る
  2. 特定の大局観にもとづいて局面を評価し、先読みする
  3. 先のAIに加えて対戦毎に学習して、評価関数を自動で調整する

さすがに、でたらめ君は対戦してもおもしろくないでしょう。

二番目の先読み機能の実現には、nimだと指手の選択肢が限られているので、 先読みの結果必勝AIと同じ結果になることが予測できます。 ですので、三番目はもちろん、二番目でも対人では強すぎてしまうでしょう。

必勝戦略を緩めて、特定の山にだけ注目して、最善手を指すようなAIはどうでしょうか。 nimでは、全体の山の調和を考慮しないと、結局ランダムに指手を選択しているのと 同じことになってしまいます。この戦略では弱すぎるAIになるでしょう。

他に、有効な戦略はないでしょうか。

必勝戦略を知っている人間がプレーしていても、時々安定状態の判定や 適切な山と石の個数の計算を間違えることがあります。 この要素を入れることで、ほどほど強いAIをめざすことにしましょう。 間違える頻度を調節すれば、弱くも強くもできるはずです。

それでは、プログラムとして戦略を実現してみましょう。

filenim3.rb
AIの選択を、レベルも含めてできるように変更しました。
filenim_board1.rb
前回のものをそのまま使います。
filenim_human1.rb
前回のものをそのまま使います。
filenim_ai1.rb
基本は、前回のものをそのまま使います。継承することを考慮して、method名称を変更しました。
filenim_ai2.rb
基本は、前回のものをそのまま使います。継承することを考慮して、method名称を変更しました。
filenim_ai3.rb
人間らしくプレーする要素(乱数による間違え)を挿入したAI。nim_ai1.rbのAI1を継承しています。
filenim_ai4.rb
人間らしくプレーする要素(乱数による間違え)を挿入したAI。nim_ai2.rbのAI1を継承しています。

nim_ai3.rb, nim_ai4.rbのAI3, AI4クラスで、インスタンス変数(0.0 <= ) @strength ( < 1.0 )を定義して、乱数による間違え発生のしきい値を 指定しています。@strengthは値が小さいほど間違えが発生しにくくなります。

分析の結果と次のステップ

ここまでのプロトタイプ制作によって、nimをプレーするコンピューターの基本機能の実現に確信が持てました。

次のフェーズでは、Webアプリケーションとしてプログラムを実装していきます。


...つづく (2009/4/6)

SEE ALSO

Last-modified: 2014-08-23 (土) 17:58:11