AIを作ってみたい

はいどーもこんにちは遺伝子組換えだろうがなんだろうが食べられるなら何も気にならないツミオです。
本日はAIを作ってみようと思いますよ。
と言っても、当然僕はAI作りなんて過去にしたことはありません。
『マッチ箱の脳』の最初の数十ページを読んだだけですw

ちゅーわけで、めちゃくちゃ簡単なAIを今回は作ってみます。
ゲームへの実用性は皆無なのであしからず。

遺伝的アルゴリズムを使ってみる

『マッチ箱の脳』の最初の方に「遺伝的アルゴリズム」を用いたAIの作成方法が載っています。
そのAIが解決する問題は以下のようなものです。

・3択式の問題が10問
・答えは変わらない
・全問正解でクリア
・AIはだんだん賢くなる

要は、3択式の問題を全問正解するまでAIに解かせよう、そしてAIを進化させていこう、という話です。

今回用いるAIは「遺伝的アルゴリズム」です(詳しくはwikiでも見てください)。
その中でも、かなりシンプルな方法を取ります(僕が理解できなくなるためw)。

・交叉前に全ての個体をシャッフル(ランダム性を加えるため)
・最も優れた2つの個体を交叉
・生まれた子は必ず一箇所突然変異させる
・最も劣っている2つの個体を破棄

こんな感じでしょーか。

とりあえずコードをドン。

ご覧の通り、かなりゴチャゴチャとしています。
『マッチ箱の脳』にはコードがそもそも書かれていないので(プログラミングできない人でも読めるようにしているため)、僕なりに解釈しつつC#に直したのが上記のコードとなります。
AI作成に慣れていないこともあって、かなり読みにくいです。
「とりあえず動く」というレベルなので、マネしない方がよいですw
ネストは深いし、重複はあるし、もうダメダメですね。
そのうち気が向いたらリファクタリングします……。

実行結果は

さて遺伝的アルゴリズムを使っていますので、世代をまたぐごとに賢く(望みの結果が手に入る)はずです。
今回の場合ですと全問正解を目指しているわけですね。
実行すると、確かに世代をまたぐごとに正答数が増えていくのがわかると思います。
AIの作成成功ですね。

僕が最近ちょこちょこプログラミングを教えてもらっている人曰く、この遺伝的アルゴリズムは「マリオとかのアクションゲームでも使える」そうです。
ちょっとまだ実装方法を思いつきませんが、遺伝的アルゴリズムはシンプルな割になかなか奥深いようですよ。

ニューラルネットワークを使ってみる

さてお次はニューラルネットワークを使ってみましょう(こっちもwikiでも見てください)。

今回のお題はこんな感じです。

・お菓子が9個あり、各お菓子には値段が決まっている(300円から18000(!)円)
・ユーザーの全財産は2万円
・各お菓子を組み合わせ、AIはその組み合わせが全財産から溢れるのか溢れないのかを当てる
・AIはだんだん賢くなる

若干ややこしいですが、AIは「これとこれとこれとこれなら全財産をオーバーしないはず(あるいはオーバーするはず)」と予想し、それが実際に当たっているのかどうかをチェック→当たっていたら成功というわけです。
こちらも『マッチ箱の脳』にはコードが載っていませんので、「こんな感じかな~」と考えながらC#に書き起こしてみました。
勉強したデザインパターンの知識(ステートパターン)も一部使ってみてますw

というわけでコードをドン。

先ほどよりはコードがマシかなと思いますw
でもやはりまだかなり汚いので、参考にはしない方がよいですね。
AI作成に慣れたらコードをきちんと書き直したいですねえ……。

実行してみると、こんな結果になりました。

一回目→正解:350 不正解:161
二回目→正解:420 不正解:91
三回目→正解:457 不正解:54
四回目→正解:480 不正解:31
五回目→正解:491 不正解:20
六回目→正解:501 不正解:10
七回目→正解:506 不正解:5
八回目→正解:506 不正解:5
九回目→正解:508 不正解:3
十回目→正解:509 不正解:2
十一回目→全問正解

確かに徐々に賢くなっていますね。

最初からやけに正解数が高いのは、恐らく一回一回の判定ごとにAIを賢くしているせいではないかなーと思いました。
つまり一回目の試行から、前半で学習したことを後半で活かして正答率をめちゃくちゃ上げてるわけですねw
この辺も実際のゲームで使う場合は調整するか、そもそも試行するとき「全要素」ではなく「特定の要素」のみのチェックにする必要があるのかなあと思いました。
この「特定の要素」のみチェックし、結果を訂正していく場合はDoFirstLearningメソッドが輝くのかなあ……と思いました。よくわからんですが。

あと、コード中にも記している通り、CombinationsExtensionクラスの中身はhttp://cs.hatenablog.jp/entry/2013/12/08/234600からお借りしました。
ありがとうございます!

終わりに

というわけで本日はごく簡単なAIを作ってみました。
「AIなんて難しいの僕に作れるわけねえやろバカ野郎!」と思ってずっと避けていましたが、やってみると意外と面白かったです。
本格的なものになると数学の知識が必須なのでしょうが、ゲームでちょこっと使えるくらいのものなら、それほど数学の知識もいらないのかもしれません。
もう少し勉強してみようかなという気になれました。

なお『マッチ箱の脳』では遺伝的アルゴリズムやニューラルネットワークを使ってどのようなゲームを作ったのか、という話も載っています。
今回の記事ではめんどくさくてコードの解説をほとんどしていませんので、興味のある方は『マッチ箱の脳』を買って、それを自分でコードに起こしてみてもよいんではないでしょーか。
マッチ箱をモチーフにして、びっくりするくらいわかりやすく書いてくれてますw

ほなそんな感じでまた。

フォローする