このサイトでは、C言語でのオセロ(リバーシ)のプログラム開発方法を解りやすく説明しています。初級者、初心者でも作れるオセロ実装のコツが満載です。
この評価関数の基本となる考え方は、石の位置によりその価値が異なる、すなわち隅は価値があり、隅の隣は良くない、というようなことを実現するのに適しています。
メリットとしては、この評価関数をプログラムするのは非常に簡単です。また、多くのプログラマーにとって、この方法でも作者本人よりも強いプログラムが作れることが多いと言うことです。
静的な評価方法に「重み付けの方法」があります。
通常は、8X8=64マスのそれぞれに評価値をつけ、自分の石が置かれていればその値を加算、相手の石が置かれていれば減算という様なことをして値を求めます。
右図はとある人工知能の教科書に掲載されていたオセロの評価値の例です。この図では隅に重みを上げ、隅の周りのマスの重みを下げていることが分かります。
この考えは悪くはありません。しかしながら、この評価値の付け方だと「隅を取ると有利になる」ことしか満たしていません。
例えば、左の局面を上記の評価値を用いて計算すると、
白:+33
黒:+13
となります。したがって、この局面では白が評価値20ほど有利だと言えます。
しかしながらこれは誤りです。この場面では黒が有利と判定されなければなりません。
このように、打った石の位置のみに注目する方法では、どうしても強いプログラムにはならないと思われます。
ただし、この方法でも作者がリバーシの初心者であれば、本人よりも強いプログラムが作れることが多いと思います。
【参考】P. Novig: "Paradigms of Artificial Intelligence Programming,"
Case Studies in Common Lisp, Morgan Kaufmann, 1992.
それでも、石の位置による評価で強くしたいのであれば、少々工夫が要ります。
石の位置による評価での上手な方法があるので紹介します。
それは、各マスの評価点は、中央の方が点数が高くなるように、また基本的に負の値に設定する方法です。
こうすると、自分の石が多いほど合計点が小さくなることは分かりますね。負にすることで何のメリットがあるのでしょうか?
実はこの方法だと、「相手に囲ませる」、「石を多くとらない」といった、「リバーシ」の必勝通りの戦法になります。
例えば、一例として右のような重み付けをしたとすると、先ほどの局面は、
白:-23
黒:-18
となり、黒が優勢となります。
また、「序盤は隅が非常に重要だが、終盤はそれほど重要でない」など、石の位置の重みも変化してくるので、この評価値を「序盤」「中盤」「終盤」などに分けて数パターン作成しておきます。
且つ、これだけでは隅の周辺の扱いが不十分な為、確定石(二度とひっくり返されることのない石)の数を数えて、それを加味します。この方法をとればかなり強いプログラムが作成できます。
ただ、「強い」と言っても2、3級程度が関の山だと思います。また、この方法だと、どうしても中盤の終わり程度から弱くなっていく傾向があるようです。
オセロに強くなりたい人は下記を読むことをお勧めします。
オセロ(将棋等)のプログラムを開発したい人・ゲームプログラマーになりたい人は下記は持っていて損はないでしょう。
Copyright ©2024 pl_kyo.(since 2001/11/18)