Robocodeについて - Entangled について

since: 2002-12-02 update: 2002-12-02 count: 11217

説明

Robocode ジャパンカップ に向けて私が作成したロボット、Entangled のアルゴリズムの紹介です。

例のごとく兼備忘録、です。 わかりにくく書いている自信がそこはかとなくあります。 すいません。

ソース & クラス。 三年後に「これ君が書いたの?」って聞かれたら恥ずかしくて とてもはいとは言えないことが容易に予測できる酷いソースです。 だから忘れないうちにこの文章を書いています。

Robocode について、基本的なことは知っていることを前提として書きますが、 一応外部にリンク張りながらやるので、 全く知らない人がちょっと覗いてみる的にも使えるかもしれません。 では…

レーダー

普通。 あっきーさんの分類 では 3。 適当にやってもさほど問題は無いと思う。

パワー調整

普通。遠い敵とかは弱く撃つ。

敵位置予測

射撃の精度に関わるから超重要。 パターンマッチを採用。 速度と角度変化を記憶しておき、 現在のものと最も一致する過去を再生する。 完璧なドキュメント

この作者は他の情報は不必要でむしろ邪魔だとしているが、 私はそうは考えない。 ただ、他の情報は単純なバロメータにしにくいので、 実際問題として、他の情報は使いにくい。 うまく使いこなせれば、相当強いロボットができると思う。

私は、射撃の瞬間を記憶しておき、 射撃の瞬間が一致する場合に多少のボーナスを与えている。 これにより、射撃に反応して少し移動するタイプの標的への命中率が良くなった。

また、集めた情報を有効に使うため、 速度と角速度が逆転しているパターンにもマッチするようにしている。

非常に重い処理なので、最適化している。

これは、線型予測、 円形予測 振動予測 を含む方法なので、 これらの射撃アルゴリズムは不要。

ありえる組み合わせとして、 敵が高度にランダム性の高い動きをしている時の対策として、 pe.SandboxLumpの方法 を組み合わせることを考えたが、 うまくいかなかったため、射撃アルゴリズムは一つだけになった。

敵弾の扱い

敵弾は敵のエネルギーが 0.1 - 3 減少した時に放たれ、 敵にとって自分が一番近い標的であるとき、 自分の座標を狙っている放たれたものとしている。

自分の動きに対して様々な予測をする手法があることは知っているが、 その利益に関しては甚だ疑問。 勝手な予測に基ずいた敵弾を怯えて、 単純な自機狙い弾も回避できなければ本末転倒。

しかし ak.Fermat の卓越した回避能力を見ていると意味があるのかもしれない。

移動

移動はたくさん実装した。 明らかに動的に差し替える必要があるのはこの部品のみ。

1on1 で重要なことは様々な種類の行動を持つこと。 基本的に、パターンマッチにかかりにくいように、 多様な行動をとれるようにする。

特に重要なのは、大きく動くアルゴリズムと、 小さく動くアルゴリズムを併用すること。

反重力移動 (1on1)

敵と弾と壁に斥力。 敵と垂直方向に強い力をかけ、直角に近い角度を保つようにしている。 この時方向は壁に遠い方を選び、同じ方向に移動する傾向が続く。 大きく動くアルゴリズムにあたる。

反射 (1on1)

敵弾が近くに来たら動く。 小さく動くアルゴリズムにあたる。

回転反射 (1on1)

オリジナル。 回転をしておいて、敵弾が近くに来たら回転を停止して移動。 回転終了時の方向は敵と直角になるに決まっているが、 大抵のパターンマッチは相対角度を考慮していないため、 事実上どの方向に移動するか予測できなくなることを意図した。 小さく動くアルゴリズムにあたる。

はまれば強いが、反応が遅れることも多い。

反重力移動 (Melee)

敵と弾と壁に斥力。 現在のターゲットと垂直方向に弱い力をかけ、 直角に近い角度を保つ傾向がある。

目的地法なるものを考案。 壁際のランダムな点を選び、その点の重力を調べ、 その重力が少ない場合、目的地として、引力を与える。 800x600 で試合が行われると勘違いしていた時に、 よく起こる密集地帯からの脱出に使って効果を上げたもの。 1000x1000 では今一つ役にたっていない。

四隅振動 (Melee)

Melee では、四隅は特別有利な地点なので、 その付近に近寄れた時は、その恩恵を極限まで引き出すべきである。 反重力移動で端を好むようにする方法も考えられるが、 端への固執から、四隅で微少振動を繰り返してしまうか、 固執の弱さから、四隅を他のロボットに譲ってしまいがちなので、 別アルゴリズムで実装すべきだと考えた。

右上隅で説明する。 基本は隅、隅より下、隅、隅より左、の繰り返しが良い。 ただ、そこで単調にやってしまうと、パターン認識の餌食なので、 同時に弾を避けることによって、適当なランダム性を実現した。

また、移動方向に平行に撃たれると命中率が高くなってしまうので、 適当に回避するようにしてある。

他のロボットでは pe.SandboxLump, ms.Ares に見られる。

まとめ

オリジナリティさして無し、ていうか不要。 CVSを眺めると随分たくさんのコードを捨てたものだと悲しくなる。 神は細部に宿る。


home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h