弾幕回避アルゴリズムについて3

この後、あんまり深く読まなくても、現在の状況をすべて関数にぶちこむと最適な方向をぱっと示してくれる関数をつくれないかなーと思ってRBFネットワークだの使っていろいろ試していたが、結局うまくいかなかった。関数が複雑になりすぎるわりに使い物にならなかった・・
また、tankも回避アルゴリズムの対象にはなり得たが、ちょっと試してみるとこれは2次元加速度回避になっていて、左に旋回するだけでも角速度ではなく角加速度を加えるみたいな玄人向けの仕様になっていたことがわかったので挫折。今もちょっと距離をおいている。

そして今週、固定弾幕+2次元速度回避を計算しまくって回避しようと思い立って、GA(遺伝的アルゴリズム)やらMCMC(マルコフ連鎖モンテカルロ法)やら色々使ってみた。はじめは経路探索といったらGAだろということで、GAで遺伝子らしく各frameごとの動きを駄々並べして交叉やら突然変異やらやっていた。評価値は100点満点で

100/(シミュレーションで当たった数+0.01*(ストローク数-1)+0.0001*(移動数)

とした。ストローク数はなるべく小さく、そして不移動を多めにするように後ろ側に項を気持ち付け足した。
それなりにいい結果は出るのだが、各frameごとにいじるのでやっぱりストローク数は多く、人間離れした動きになってしまう。これはこれでいいのだが・・

ここでふと考える。ストローク数を小さくするには、やはりストロークベースで考えた方がいいのではないかと。そして、求めているのは全く当たらない解なので、1回当たった瞬間にシミュレーションをやめて計算を端折ろうということになって、新しい評価値を

100-(シミュレーションで最初に当たった時間+0.1*(ストローク数-1)+0.01*(移動数))/シミュレーションの全時間*100

として、MCMCでやってみた。MCMCにおける遷移は、適当な時間にストロークを加える分割と、ランダムに選んだストロークを削除する結合を等確率で行った。

MCMCでの最適化において欠かせないアニーリングは、きつめにかけた。完全回避解がみつかりさえすればいいというのと、不移動ストロークを開始点として、あまり遠くに(ストローク数を増やす方向に)行って欲しくないためである。

こうしてできた回避が下のFlash。Replayをクリックで開始。

ストローク数が少ないのに変態チックな動きである。