Darkside(リンクエラー修正しました)

2017年4月26日(水) 21:43

モンテカルロ法


 この右旋回では、最初に左旋回を少し行ってガードビームから車体を離し、続いて直進を少し行う。それからフルハンドルを右に切る。
 つまり、フル旋回の前に「左旋回フレーム数」「直進フレーム数」という2つのパラメーターが存在する。

 これら2つのパラメーターをどう設定するのがベストかというのは結構厄介な問題であり、簡易判定しているものの決定版がない。パラメーターを適切に設定しないと速い解は出て来ないが、速い解を探す計算コストが極めて大きい。S-JET の適切なブレーキタイミングは自明ではなく、しかし片っ端から試したのでは実行時間が実用にならない。
 2つのパラメーターを絞り込んでから、集中的に調べたい。

 ここでふと思い付いた。だったら、有望パラメーター探しに、モンテカルロ法はどうだろう?

 フル右旋回では、まず S-JET のブレーキタイミングを計算する。これは、意味がありそうなタイミングの範囲を計算するものだ。そして、その範囲内でブレーキタイミングを変化させて操作結果を調べる。この計算と試行は、S-JET の速度ループが1周するごとに行う。
 右旋回で8周期とか9周期が当たり前なので、ブレーキタイミングのバリエーション数が8乗とか9乗された操作パターン数になる。とても全数調査できないので、ガードビームに弾かれずに右旋回を最後まで無事に行えるかどうかを重視している。最後まで走れれば類似の走行パターンは調査せず切り捨てる。
 どうやらこの手法で、速い解が切り捨てられているフシがある。

 かと言って全部調べるのは無理。ならば、ブレーキタイミング候補の中からランダムに1候補だけ選んで試行。これで最後まで右旋回させ、結果をチェックする。ランダムに何度か繰り返せば、速そうな解が存在しそうかどうか見当が付くのでは?

 やってみると、思った以上にうまく機能した。
 モンテカルロ法では、有望そうな選択肢に絞って乱数を使うのが効果的である。このスクリプトでは、もともとブレーキタイミングとして有望な範囲を計算しているから、その中からランダムに選んでも悪くはない。

 また、並列実行が容易というメリットも大きい。
 普通のスクリプトを並列実行する場合、試行パラメーターが重複しないよう管理する手間が掛かる。また、途中でスクリプトを止めると重複回避は困難になる。
 しかしランダムなプレイアウトを行うモンテカルロ法であれば、スクリプトをいっさい書き換えずに並列実行できる。許容できる実行時間内で、ただ走らせれば良い。非常に使い勝手が良い。そして期待通り、従来のスクリプトでは発見できない解を見つけ出してくれた。

 さっそく、デスウインド2の S-JET 右旋回スクリプトも、モンテカルロ版を用意した。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4