poipoiです。

技術的ななにかと、そうじゃないなにか。

Unityで遺伝的アルゴリズムやってみた

f:id:poipoides:20170204212506g:plain

Unityくらいそろそろ使えないとマズそうな気がしてきて勉強を開始してみたところ、

「あれ?これって物理シミュレータ代わりとして意外といけてるんじゃね?」

「前からやりたかった物理シミュレータ x 遺伝的アルゴリズムできるんじゃね?」

ってなったので試しに作ってみたやーつ。

遺伝的アルゴリズムとは?

遺伝子が進化していく様子を模した近似解の探索アルゴリズム

まあ要はいろんな個体を用意して、試して、優秀な子を残して進化させていくみたいな。

詳しくは Wiki みてください。

で、これをゲームとかシミュレータとかに適用してる人が結構いて、 そういう動画を見るのが結構好きだったんですね。

Flexible Muscle-Based Locomotion for Bipedal Creatures from John Goatstream on Vimeo.

普通は割とガチな物理シミュレータ(OpenDynamicEngineとかJigLibXとか)でやるっぽいんだけど、

Unity でサクッと作れたらお得じゃない?ってことで試しに作ってみた。

結果

GA001a from poipoi on Vimeo.

  • コースの形はアルファベットの中でも一番周りにくそうな「B」の形。
  • 死亡条件は「壁にぶつかる」or 「遅い速度がしばらく続いたら」。
  • 移動した総距離を優劣の判断材料とした。
  • 遺伝子は車をコントロールするためのボタン(上下左右)の押し方の羅列。

一応できたっぽい。

ただしばらくすると結果が頭打ちになっちゃうのでぐるぐる何周も回るまでには至らない。 f:id:poipoides:20170204211637p:plain (一番上のグラフが各世代のトップの遺伝子の成績。1周半くらいで頭打ちっぽい。)

多分パラメーターとかアルゴリズムを調整しないとなんだろうなーと思う。

締め

ヒマ(と要望が)あったらもう少しちゃんとしたアルゴリズム解説書く。

一応コードは以下に挙げておく。

github.com

おわり。