見出し画像

オセロAIの教科書 8 【定石】 定石の使用

こんにちは、にゃにゃんです。

この記事集「オセロAIの教科書」は私の世界1位AIの技術を中心に、オセロAI(オセロの相手をしてくれるプログラム)を初歩から段階を踏んで作っていく記事集です。全編無料でこちらから読めます。

この記事について、わかりにくい点や疑問点、おかしな点がありましたら気楽にコメントとかTwitterとかで教えて下さい。みなさんの力で記事を洗練したいです。


この記事を読むのに必要な知識

この記事を読むのに必要な(ある程度前提とする)知識を列挙します。これらの知識がない状態で読んでもある程度理解できるとは思いますが、途中でわからなくなったらキーワードとして使ってください。

  • オセロのルール

  • 基礎的なプログラミングの知識・経験

  • C++

  • Python

  • データ構造(ハッシュテーブル)


定石の必要性

私は個人的に、定石の必要性について3つの考えを持っています。

序盤の評価関数は当てにならない

前回パターン評価で作った評価関数は、最終石差を推測する関数です。序盤は少しの変化で終局の様子が変わることを考えれば、序盤の評価関数が信用できないことはなんとなく想像できると思います。

実際私が世界1位AIの評価関数を作るときも、序盤の誤差の大きさには苦労しました。

評価関数には誤差がある

前回の記事で評価関数を機械学習で調整した人はすでにわかっていることかもしれませんが、この記事で作った評価関数は平均で実際の最終石差と6石程度の誤差があります。つまり、ある程度接戦の戦いであれば、評価関数の誤差によって負ける手を選んでしまうかもしれないのです。

序盤はパターン数が少ない

手が進むにつれて可能な局面が指数関数的に増えていくとは言え、序盤の可能局面数はそんなに多くありません。また、明らかに相手が悪い手を打ったときには評価関数に頼っても逆転されることはほとんどないので、ほぼ互角な序盤の進行のみを定石として持っておけば良いです。


定石生成

公開している自己対戦を使った定石はすでに作って以下で公開してあります。
この記事で言う定石は人間にとっての定石ではなくて、「こう打ってきたらこう返す」という、正確に言えばキラー応手のことです(いわゆるbookとも少し違います)。

どうやって生成しても良いですし、手動で生成しても良いですが、今回は私の世界1位AIの自己対戦2万局を使うことにします。評価関数制作に使ったのと同じ棋譜です。ただし、定石生成に使う棋譜としては2万局は少ない気がしています。もう少したくさんの棋譜を集めて作り直しても良さそうです。

とりあえずこの記事ではシンプルに作ります。

自己対戦の棋譜から、ある手筋から次に何の手を何回打って平均何石差で終局したかを計算します。この結果を使って有利な手のみを保存しておきます。

また、簡単のためにAIの打つ手は予め1つの盤面につき1手としておきますが、必ずしもそうする必要はありません。

定石生成のスクリプトはこちらです。


定石読み込み

定石は棋譜としてテキストファイルに書いたので、C++から読み込んで、盤面の情報に変換して、ハッシュテーブルに盤面の情報と共に入れておきます。盤面で検索したら次に打つべき手がわかる状態にしておくのです。


実装

定石の実装はこちらです

初手をf5で限定して自己対戦の棋譜は作ってあるので、定石もf5始まりのデータになっています。それを4方向対応できるように実装してあります。


実行

以下のコマンドで実行できます。

$ g++ -O3 ai7_book.cpp -o ai.out
$ python3 main.py

最初の方は探索せずに定石の手を打っていることがわかったでしょうか…?


まとめ

正直私が公開している自己対戦ではまともな定石は作れません。実際適当に私が打ってみたら、若干不利と一般的に言われている定石を打つようになっていました。

ぜひ棋譜を集めて自分で強化してみてください。私は自分のオセロの勉強も兼ねて暇な時に手動で強化したりしています。

なお、今回紹介した方法の場合、定石は棋譜データから生成しているので、オセロにおける違う手筋でも同じ局面の状態になること(猫定石と虎定石、牛定石の回転すると同じ状態など)を考慮した方が良いです。今回は面倒なのでサボりましたが…

何はともあれ、とりあえずここまででオセロAIの三本柱、「定石、探索、評価」が解説できました(長かった…)


次回予告

次回からは発展的な内容です。

次回はその中でも特に重要な、終盤の必勝読みと完全読みを解説します。


スキと投げ銭で喜びます

noteではログインなしでスキできます!役に立ったぞ、面白かったぞ、という方はぜひハートマークをポチッと押してください!

この記事は全編無料ですが、投げ銭してくれたら私が喜びます。喜ぶだけです。何も見返りはありません。「役に立ったし投げ銭してやっても良いぞ」という方はポチっとしてくださると嬉しいです。

ここから先は

0字

¥ 100

この記事が気に入ったらサポートをしてみませんか?