遺伝的アルゴリズムでsnakegameを学習したかった

方針

入力を

  1. 頭の1マス左に壁があるか
  2. 頭の1マス正面に壁があるか
  3. 頭の1マス右に壁があるか
  4. 頭の1マス左に自分の体があるか
  5. 頭の1マス正面に自分の体があるか
  6. 頭の1マス右に自分の体があるか
  7. 頭の左側に餌があるか
  8. 頭の前側に餌があるか
  9. 頭の右側に餌があるか

の9つ、出力を

  1. 左に進む
  2. 前に進む
  3. 右に進む

の3つからなるニューラルネットワークを考える。入力は0か1で右とか左とかは絶対的なものではなく蛇の進行方向から見てである。
今回はそのニューラルネットワークの重みを遺伝的アルゴリズムで進化させていく。

適応度の設定

最初は餌を食べたら10ポイント、1ターン生きたら1ポイント増やす方向で考えていたが、どうやらそれだと蛇が同じところをぐるぐる回るように進化してしまうので、餌に近づいたら1ポイント、餌から離れたら-2ポイントというようにした。調べてみると、もっと複雑にしている人もいるようだが今回は簡単のためこれにした。
また、適用度計算のときはたまたま運良く点数が高かった物が選ばれる状況を避けるため、50回ほどループを回し平均を最終的な値とした。

その他いろいろあるが割愛。

結果

f:id:busongames:20180915170212g:plain
1世代目
f:id:busongames:20180915170222g:plain
2世代目

(GIFの大きさが違うのは目をつぶってください)
2世代目で既にうまくいっている。逆に自分のコードではここから世代を重ねてもあまり変わらなかった。餌と頭を繋いだ直線上に体があった時餌を優先してしまい体にあたりゲームオーバーということがなんど世代を重ねても直らなかった。悔しい。でもそれなりにうまくいったと思う。

↓参考にした動画。


AI learns to play snake using Genetic Algorithm and Deep learning


GTC japanも行ってモチベーション上げた。