ブロック崩し 1
ブロック崩しをGAで学習させる方法を考える
sasamijp/breakout_solver · GitHub
まず評価関数を出すためにブロック崩しのシミュレーターが必要。スピードが命なので、めっちゃ速いのを作った。
これは乱数でバーの跳ね返り角度を決めてゲームをやらせているところで、ブロックが全部壊れると辿った軌道が表示される。
ステージは124本の1次方程式でできていて、軌道との交点を算出して傾きを反転した線を再定義する処理を繰り返してボールの動きを出している。
ボールの大きさとか考えてないけど、ひとまずこれでやる。
遺伝子の設計をする。
スーパーマリオブラザーズを学習させてみた(1-1) ‐ ニコニコ動画:GINZA
この動画を参考に設計した。
マリオの遺伝子は大体こんなんなってる。tが時間で、aが行動だと思ってほしい。ある時間に対して、ある行動が定義される。
ブロック崩しの遺伝子。eはボールがバーに当たる瞬間のことで、aが行動。ある衝突に対して、ある行動が定義される。要は、ボールが上にいる間も遺伝子に基づいた行動をしてたら無駄なので省いたことでtがeに変わった。
このモデルをいい感じにバイナリにして一個体を表現する。
遺伝子にそれぞれ6ビットの行動が入っている。n番目の衝突まで遺伝子を持たせようとすると、6nビットのビット列が遺伝子として必要。
交叉方法を考えた。
赤いとこ始点からずっと一緒やん!青いとこ交換したろ!みたいな感じ。正直自分でもよくわかってない。ここはもう少し考えなくてはいけない。
動かしてみる。
進化しとるやんけワレ!導き出された個体を見てみる。
まあなんか早いっちゃ早いんだけどもうちょっとがんばれない君?みたいな感じですね。
乱数で跳ね返り位置決めるとどんなもんになるか試す。
ん...?
GAの解超えとるやんけワレ!
乱数でもGAと同じぐらいいいやつ出ることがわかった。よく考えてみたら3回跳ね返すパターンは21万ぐらいしかないので乱数でも出てきそうなものである そりゃそうだろ
反省
GAを使う意味があまりないことがわかった。全体的に考えなおしていきたい 。