Unity
遺伝的アルゴリズム
実数値遺伝的アルゴリズム

[Unity]遺伝的アルゴリズムでサッカーボールを蹴ってみた

こちらはUnityゆるふわサマーアドベントカレンダー 2018の8/25記事になります

遺伝的アルゴリズムを使ってどれだけ遠くにサッカーボールを蹴り飛ばせるかやってみました


結果


1世代目


最終世代


全過程


ざっくりとした方法説明


遺伝的アルゴリズムとは

キャプチャ.PNG

遺伝子をたくさん用意して

交配させて 

最適な遺伝子を見つけ出す…

要するに最適化です

今回は足のモデルをたくさん用意して

シミュレーションを行い

できるだけ遠くにボールを蹴りだした上位20足のみに交配することを許しました

なお,100位以内にランクインしなかった足は子孫を残す機会を失うことにしました…


サッカーボールを蹴る方法


足のモデル

足のモデルはこんな感じです

赤い部分が関節の可動域です(平面での動きに制限しました)

キャプチャ.PNG

ひざから下の部分(第2足)にのみ力をかけて足を動かしていきます


遺伝子には何の情報を入れるか

遺伝子には足にかける力(正確にはトルク)の値を入れました(範囲は-60~100)

キャプチャ.PNG

上の画像のように,時間がたつと左の値から順にトルクをかける仕組みです

つまりこの問題は正確に言うと,

時間内にサッカーボールをできるだけ遠くに蹴り飛ばせる遺伝子はなにか

ということになります


遺伝的アルゴリズムの設定

細かい設定は次の通りです 

符号化:実数値(符号化しない)

評価:ボールの到達距離

選択:エリート主義(ボールの最長到達距離のフォームを知りたいため)

交叉:SPX(変数間に依存関係がある可能性があるため)

突然変異:必要ない(SPX,BLXでは親個体の分布よりも子個体の分布のほうが広い傾向があるため)

SPXについての参考リンク


まとめ

これくらい簡単な問題だと結構すぐ最適化されちゃうんですね

10世代くらいでもう変化がなくなってきました

拡張率を大きく設定しすぎてSPXがうまく働いていない気が…

GitHubで公開しました: SocckerGA