中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

robocode・パターン予測

パターン射撃

この手の処理の常套手段は機械学習なのだが1tick内の処理時間制限(15ms)がある為難しい。
よってより軽量な実装を考えなければならない。

パターン射撃モード

前述の通常射撃モードに加え2種のパターン射撃を考案した。

単純移動パターン
敵の軌道パターンを単純に過去比較する。
MyFirstRobotなどの反復移動をするロボットに特に有効な他
敵機の情報が集まって来る終盤では事実上の通常射撃となる。

パターン射撃&ピンポイント射撃機(jar)

射撃反応パターン
こちらの射撃に対するリアクションを記録しておき最も似た状況を再現する。
高度な機体は確実に回避コードを実装している為、高機能機キラー要素として考案した。
自分の射撃回数分の情報しか無いため絶対的に情報量が少なくパターン収集に時間がかかる。

パターン射撃&ピンポイント射撃機(jar)


どちらのパターンも強力で十分にデータを集れば主戦力になる。

特に射撃反応パターンは1戦目の最終盤辺りにとデータが集まり始め3戦目辺りからやっと精度が上がってくる位。
しかし10戦分の情報が集まった時の威力は絶大。

単純移動パターンの評価法

前述の通り複雑な計算や広大なメモリは使えないので、簡易かつ高速な方法を考案した。

tick毎、1〜1000 tick前の敵加速度を使って敵機の座標を(現時刻-1)の敵機データから予測しその誤差分をスコア化して評価する。

予測
具体的には(現時刻-1)の敵機座標に敵加速度を足すだけ
誤差
ただ引き算。
スコアリング
前述の手法

こうする事でMyFirstRobotの反復移動は74 tick前のスコアが突出して高くなり反復運動が検出できる。
狙う時も74 tick前の加速度を使えば必ず当たる。

追記
実際は1000tick前では無く過去分全てを扱っている。
射撃反応パターンの評価法

3つのパラメータから状況を判断している。

自機と敵機を結んだ線と敵機の進行方向が成す角度
射線に対する敵機の向きは回避運動に大きく関わる。
敵機の速度
減速、逆進、旋回と色々な回避があるが、ある程度速度に依存するだろう。
敵機との距離
距離により弾到達までの時間が異なり当然回避運動も変わるハズ。

射撃再評価

射撃の結果どのモードを採用したら当たったのか?を再評価してポイント化している。
画像は2種のパターン再評価の様子


これは予測大成功の例。

赤太丸
予測開始地点
実際の軌道(グリーンに隠れて見難い)
グレー
単純移動パターンで採用した過去データ
単純移動パターンによる予測軌道
射撃反応型パターンによる予測軌道


予測に失敗するとこうなり、遥か左の見当違いの地点を撃つ事になる。

射撃モードの有用性

ターゲット機
射撃に反応し慣性射撃されたものとして回避する。
total : 25.14 % (634/2522)
ピンポイント : 21.39 % (126/ 589)
慣性偏差   : 25.00 % (  1/  4) 
加速度偏差  : 17.07 % ( 21/ 123)
移動パターン : 23.89 % (301/1260)
射撃反応   : 33.88 % (185/ 546)
戦いの流れ
  • 慣性&加速度偏差射撃は効果が薄い事がわかる。(再評価の成績が悪過ぎて選択されない)
  • 最初ピンポイント狙いで(敵機が逆進した所を)撃ち。
  • パターンが溜まったら移動パターンにシフトする。
  • 射撃反応の情報があればそちらを採用する。

各射撃モードの特徴が良く表れている。

特化機の問題

色々な射撃モードを持っていると汎用性が高く総合力がつくが特化機に負けてしまう。

ピンポイント射撃&リアクションパターンだけのリアクションキラー特化機と全モード入りの汎用機が戦うと勝負にならない・・・

射撃モードの判断が遅いのかもしれないがもうちょっと考える余地がありそう。

>>移動&回避