2015年10月25日日曜日

遺伝的アルゴリズムでオセロのAIを学習させてみた[C#]

 最近何かとネットに上がっている遺伝的アルゴリズムを自分でも実装してみた。

 本当は先々週ぐらいにもう完成してたけれどネットが繋がらなくなったりパソコンが起動しなくなったりと,結構面倒なことが起きたので遅れてしまった。まるで何か大きな力が私を止めようとしていたのか……?何事もなければいいのだが。

1.動画

 自分が人工知能や人工生命みたいなワードに興味を持ったきっかけの一つが,むにむに教授さんがやってた遺伝的アルゴリズムシリーズ。今回はそれに便乗してオセロのAIを作ってみて,その評価関数を最適化するのに遺伝的アルゴリズムを使ってみた。そんでもって,せっかくなので動画にしてみた。この動画に刺激されてこういう分野に興味を持ってくれる人が出てくると嬉しい。

 動画編集は初めてで苦戦したし自分でもうまくできていないのはわかっているが,まぁ一度やってみたかったからいいんだ。楽しかったし。

2.解説

 まぁ詳しい内容は割りと動画内でしたつもりだが,もう少しプログラムの詳細をここでは書く。あ,一応述べておくけれど動画内では学習とかなんとか言ってたけどただの最適化だからね。学習って聞くと誤解する人がいそうだから本当は避けるべきだったのかもしれない。

 評価に際して対戦させたわけだが,実際はバックグラウンドで行った。あとAIはすべて1手先しか読んでいない。ミニマックス法で実装したら割りと学習には時間がかかりそうだったしめんどくさいし……。

 交配は64の個体のうち,勝った回数が最も多かった上位10個体から行った。その上位10個体の遺伝子はそのまま引き継ぐ。

 今回は150世代までやったわけだけれども,実際には条件をちょっと変えて行ってみたのだが,大体同じ感じになった。だが対戦相手が変わるため,遺伝子が収束しないというのがちょっと問題かな。あれ?なんか問題多いな。まぁいいか。

3.学習結果

 一応どうなるのかを予想してみた。イメージではこんな感じになると思っていた。

 カドの点数は絶対高いだろうというのは間違いないだろうと思っていた。カドの周りの点数が下がり,自分がそこに置かないようにするというのもまぁ想定の範囲内だった。だが端(一番外側)の部分は,ほとんど高くなると思っていたが実際は違った。

 端(一番外側)の部分でも,中央寄りの部分は点数が下がっている。また中央の部分が下がっている。その辺が驚きだった。いやだって取れるもんはとったほうがいいじゃん?と思っていましたので。

 これについてちょっと考えていたのだが,おそらく「すぐひっくり返されるところ」の点数が下がっていき,「ひっくり返されにくいところ」の得点が高くなっているのだろうと思う。彼らの対戦をすべて保存して状態を解析してみないとわからないのだが,間違いなく相関関係はあるだろうね。

 まぁ実を言うとオセロのAIを作るのは人生で2回目。1回目のプログラムはちゃんとミニマックス法を実装してた。その時の経験から言わせてもらうと,終盤は正直カドを取るということよりも量を取る方に評価関数を変えたほうが強くなった。確か40手ぐらい打ったらもうカドよりも量を取る方に評価関数を変えて,深読みさせたほうが強かった。終盤だとカドを取るべきと取らざるべきがあるからね。そう考えるとこの学習もミニマックス法を実装したほうが良かったかもしれない。

 ソースコードは公開しようと思ったけれど,いじっている間にスパゲティになったので公開はしないつもり。でもオセロはここで書いたやつを使いまわしてる。

1 件のコメント: