こちらはUnityゆるふわサマーアドベントカレンダー 2018の8/25記事になります
遺伝的アルゴリズムを使ってどれだけ遠くにサッカーボールを蹴り飛ばせるかやってみました
結果
1世代目
### 最終世代遺伝的アルゴリズム1世代目 pic.twitter.com/Idat2iMmIz
— ふみ (@hitsumasf) 2018年8月25日
### 全過程最終世代 pic.twitter.com/jxaQEcf8sq
— ふみ (@hitsumasf) 2018年8月25日
— ふみ (@hitsumasf) 2018年8月25日# ざっくりとした方法説明 ## 遺伝的アルゴリズムとは ![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/196266/88135009-d3ca-964a-2019-1b1012eca695.png) 遺伝子をたくさん用意して 交配させて 最適な遺伝子を見つけ出す… 要するに__最適化__です
今回は足のモデルをたくさん用意して
シミュレーションを行い
できるだけ遠くにボールを蹴りだした上位20足のみに交配することを許しました
なお,100位以内にランクインしなかった足は子孫を残す機会を失うことにしました…
サッカーボールを蹴る方法
足のモデル
足のモデルはこんな感じです
赤い部分が関節の可動域です(平面での動きに制限しました)
ひざから下の部分(第2足)にのみ力をかけて足を動かしていきます
遺伝子には何の情報を入れるか
遺伝子には足にかける力(正確にはトルク)の値を入れました(範囲は-60~100)
上の画像のように,時間がたつと左の値から順にトルクをかける仕組みです
つまりこの問題は正確に言うと,
時間内にサッカーボールをできるだけ遠くに蹴り飛ばせる遺伝子はなにか
ということになります
遺伝的アルゴリズムの設定
細かい設定は次の通りです
符号化:実数値(符号化しない)
評価:ボールの到達距離
選択:エリート主義(ボールの最長到達距離のフォームを知りたいため)
交叉:SPX(変数間に依存関係がある可能性があるため)
突然変異:必要ない(SPX,BLXでは親個体の分布よりも子個体の分布のほうが広い傾向があるため)
まとめ
これくらい簡単な問題だと結構すぐ最適化されちゃうんですね
10世代くらいでもう変化がなくなってきました
拡張率を大きく設定しすぎてSPXがうまく働いていない気が…
GitHubで公開しました: SocckerGA