Robocode



What's Robocode?

IBM alphaWorks開発のJava言語によるロボット格闘プログラム。
http://www-6.ibm.com/jp/event/robocode/home/index.html
導入にはJDK1.3以降が必要。
Windows、Linux等で動作する。
Javaでロボットのアルゴリズムを書いて
他の人の書いたロボットアルゴリズムと対戦させる形式。
細かい情報は
http://www.javadeveloper.jp/static/robocode/robolink.html
を見るととてもわかり易い。

現在までに
世界規模のRobocode Rumble、
日本国内でのRobocode ジャパン・カップといった
大きなコンテストが開催された。
2003/1現在、有志によるランキングがいくつか行われている。
私が作った愚ロボ(と言うのか?)が参加させていただいている
ランキングサイトは分かっている限り以下のとおり。
(ランキングサイトはこの他にも有名なものがあります。)

Eternal Rumble
http://eternal-rumble.com/index.jsp


Robocode face2face competiton
http://www.geocities.com/albert_pv/


Robocode置き場
http://robocode.port5.com/


Robocode愛好家のページ
http://www.02.246.ne.jp/~sr2200/

その他、有志によるJapanCup againの兆しがあります。


Robocodeの世界も
MiniBot(コードサイズ1500K未満)、
MicroBot(コードサイズ750K未満)、もっと小さい奴やら
ParceptualBot(クラス変数やファイル使っちゃいけないらしい)
といった制限を設けて
世界のRobocoderは腕を競っているようですが、
私の自作ロボットは超重量級です。
本当の事を言えばまず重量級ロボットを作り
後にダイエットさせよう、と考えましたが挫折しました。
アルゴリズムにも燃焼しきれない熱量がありますと声を大にして言いたい。



Robocodeにおける強いロボットとは(独断)?

軽く聞き流して。


共通

敵よりも多くの弾をあて、敵よりも多くの弾をかわすロボット。

敵に多くの弾をあてるアルゴリズムは、2003/1現在
・Guess Factor Aiming
・Pattern Matching
が代表的。

敵よりも多くの弾をかわすには、
2003/1現在、上記2つのアルゴリズムに当てられにくい
動きを行うこと。

・対Guess Factor Aiming
本アルゴリズムは大筋で
「敵に対して弾を撃ち目標位置に弾が到着するまでの時間に敵が動ける距離は
多くとも、まっすぐ最大速で前後に走った距離だから
その範囲で存在位置の統計を取り、存在確率の高いところに弾を撃てば
平均より高い確率で弾があたるよん」なので(意訳すぎですが)、
敵から見える存在確率が平均化するように動く。
具体的には、「すごくまっすぐ動いてすごく曲がる」など。

・対Pattern Matching
本アルゴリズムは
「敵の動きをログっておいて、
現在の動きが過去のログにある程度マッチしたら、
アルゴリズム的に似たような軌跡を辿ると仮定して
軌跡を先読みしてそこに弾を撃つ」
なので、
自分でも予測困難なくらい角速度、速度変化を不確定にする。
見た目に視線追従できないくらい変な動きなら安全か。
また、Pattern Matchingは
「そのパターンに本当にマッチするか?」の確定タイムラグがよく発生するので
たまにまっすぐ動くのも、たまに止まるのも、意外と安全。


いずれにせよ、どう動いても「敵弾にあたるときはあたる」と思っていたほうがいい。
敵弾命中率10%を下回る回避行動をどの敵にも取れるロボットを作れば、
はっきり言ってpe.SandboxDT1.61より強い。
(2003/1現在、命中率13%〜15%あたりが強いロボットにおける壁と思われる(DRM調べ)。)

敵弾予測は、できるならやったほうがいいと思う。
「敵弾の照準方法が何なのか予測不能」というのはあるが、
「どんな照準方法でも似たようなとこ撃ってくるような私の動き」という手はある。



1on1

敵を倒すのみ。
位置は中央が有利。
敵を四隅に追い詰めていれば理想的。
ただ「なるべく隅に行かないロボット」は自分に足かせをはめている
(隅に行かないという動きを敵に読まれやすい)ので難しいと思う。


Melee

全ての敵を相手にするのは無謀。
全ての敵の平均座標位置は死地なので近寄らない。
平均的に弾が当たらない動きをしながら多くの敵を「敵の塊」と考え
「敵の塊を少しずつ溶かしていく」要領で攻撃。
「敵の塊の「場」VS自分の「場」」と戦局を捕らえ、
自分を守るより自分の「場」or「縄張り」を守る、と考える戦略も有効。
自分のロボットはMelee弱いんで、これ以上は分かりません。


その他

そのロボットが強い理由がわかるロボットがやっぱり強い。
「柔」のロボットと「剛」のロボットのどっちが強いか?といえば、多分作り手の好みの方。

「この動きに対しこの動きが強い」というインスピレーションは、
怠けずにこつこつとノウハウとして蓄積すれば幸せになれそうな気がする。
そしてノウハウの総計が100ならば、
60〜70位のものを最適化してロボットを実装するとか。

自分は思いつきで作ってますが。


My bot



CobraBora

誰もが皆知っている808stateのCobra Bora(特に'94Liveにインスパイアされ)より命名。
http://www.808state.com/
リンクしてみればいつの間にかunreleased demo versionがアップされてて
涙が出るほど嬉しい&早速ダウンロード。いい。

最新版:drm.CobraBora_1.11.jar


まったく関係ないけど上記808stateサイトから
pacific.mid(pacificのMIDI版)をダウンロードしてGXSCCで聴くと、
あまりの偏ったミニマルな郷愁的近未来ザ・ワールドに
昭和50年生まれくらいまでのあれな方ならまず二度と現実に帰ってこれない位に
トリップしてしまうことでしょう。


特長

・Pattern Matching照準
・Anti Gravity Move(反重力点、反重力線による)
・最適な威力の弾丸発射アルゴリズム
・なかなか確定しない敵別動作変化アルゴリズム
・勝利の踊りCobra Dance


反重力点、反重力線によるAnti Gravity Moveについて

1.反重力点によるAntiGravityMove

(理屈)
戦場の所定位置に斥力を発生させるポイントを置いて、
重力に従順に自分が動くようにすれば
斥力ポイント(=反重力点)に近づかないランダムな動きができていいじゃないの!
また、係数符号を逆転すると斥力ではなく引力になるので、
目的位置に移動するBotができるね。

------------------
以下、斥力ポイントを反重力点、引力ポイントを重力点と呼ぶ。

(どこに反重力点を設置するのか?)
・敵(常時)
・敵全体のX座標、Y座標平均位置(Melee時常時)
・四隅(ランダム)
・自分の近辺ランダム位置(ランダム)

(どこに重力点を設置するのか?)
・縄張り:中心もしくは四隅近辺で、斥力合計の少なめなところ(ランダム:Melee1on1で微妙に位置を調整)
・Guess Factor Aimingかく乱位置(ランダム:この位置を設定したときは斥力無視)
・Cobra Dance踊り位置(勝利時)


重力の強さは、基本値(Melee1on1で異なる)からランダムで揺らがせる。
ランダム要素は相手に応じて調整し、外部ファイル化。
ただし値の調整はなかなか確定しない。
確定すれば、敵にこちらの動きを確定される危険があるから。

不確定要素を増やすほどに、Botは基本動作アルゴリズムの優秀さを試すプラットホームとなるかなあと夢を見る。
究極は、
「弱いとされるBotにも、強いとされるBotにもまったく同じ勝率を示すBot」と思う。
だって、そのBotを完全に負かすBotが存在し得ないことを経験から示すことになるから。



2.反重力線によるAntiGravityMove

(理屈)
点を並べて線。

(どこに反重力線を設置するのか?)
・壁(常時)
・敵予測弾丸位置から、進行方向に弾丸速度×係数の位置にかけて(常時)
・被弾時、被弾弾丸位置から、進行方向に外周の位置にかけて(ランダム)


前にも述べたが、弾丸予測はやらないよりやったほうがいいと思う。
回避する動きを読む相手は、「どのくらい回避するか」というパラメータを固定で判断することが割と多い。
こちらは気ままに回避すれば良いのだ。
確率の収斂する値が体感でも予測できるなら、それを前提にして実装したほうが早いんだってホント!
仕事じゃないんだし。
余裕ができたら体感と実測の差異を調整してみればいいしね。



最適な威力の弾丸発射アルゴリズムについて

自分のエネルギー:myEnergy
自分の弾丸命中率:myHitRate
自分の弾丸威力平均:myBulletPowerAVL

敵のエネルギー:yourEnergy
敵の弾丸命中率:yourHitRate
敵の弾丸威力平均:yourBulletPowerAVL

これらから、
弾丸の最適な威力myBulletPowerを算出する。

ただし前提として、
myBulletPowerの変化によって自分の弾丸命中率が変化するものとする。
その変化率r(n)は、
r(myBulletPower) = (myBulletPowerの弾丸速度)/(myBulletPowerAVLの弾丸速度)

多分違うんだろうなあ。ざっくり。

また前提として、
次のような関数があるとする。

double getBulletDamage(double d):威力dの弾丸を当てたときのダメージを求める。
double calcGunHeat(double d):威力dの弾丸を撃ったときの銃身の熱量を求める。
double getBulletGain(double d):威力dの弾丸を当てたときに得られるエネルギーを求める。

そして次のような変数があるとする。
double coolingRate:銃身冷却率。

更に前提。弾は連射しつづけるものとする。

------------------
自分の弾丸命中率(変化後):mhr = myHitRate * r(myBulletPower)
単位時間あたりの自分のダメージ:myDmgPT =
yourHitRate * getBulletDamage(yourBulletPowerAVL) / (calcGunHeat(yourBulletPowerAVL) / coolingRate)
+ (myBulletPower - getBulletGain(myBulletPower) * mhr) / (calcGunHeat(myBulletPower) / coolingRate)
単位時間当たりの敵のダメージ:yourDmgPT =
mhr * getBulletDamage(myBulletPower) / (calcGunHeat(myBulletPower) / coolingRate)
+ (yourBulletPowerAVL - getBulletGain(yourBulletPowerAVL) * yourHitRate) / (calcGunHeat(yourBulletPowerAVL) / coolingRate)

両式とも、a = b + cの形式で、
bは単位時間当たりに相手から受けるダメージを、
-cは単位時間当たりに相手から得られるエネルギーを示す。

自分の予測戦闘時間:myFightTime = myEnergy / myDmgPT(ただしmyDmgPT>0のとき。myDmgPT≦0なら「十分大きな時間」とする。)
敵の予測戦闘時間:yourFightTime = yourEnergy / yourDmgPT(ただしyourDmgPT>0のとき。yourDmgPT≦0なら「十分大きな時間」とする。)

また、
自分の予測獲得ポイント:myFightGain =
(getBulletGain(myBulletPower) * mhr) / (calcGunHeat(myBulletPower) / coolingRate) * myFightTime + 各種ボーナス
敵の予測獲得ポイント:yourFightGain =
(getBulletGain(yourBulletPowerAVL) * yourHitRate) / (calcGunHeat(yourBulletPowerAVL) / coolingRate) * yourFightTime + 各種ボーナス


で、
myFightGain - yourFightGainが最大となるmyBulletPowerを選択すればいいんですね。
もしポイントより生き残り重視なら、
myFightTime - yourFightTimeが最大となるmyBulletPowerを選択する。



わかりますでしょうか?


Magazine

漫画雑誌は関係なく、モジュール組換え方式のアーキテクチャから命名。
ちなみにジャパン・カップでは「Jump」というロボットにやたらとリーグ競合した挙句
あっさり負けましたが何かを暗示するものでは本当にないです。

最新版:drm.Magazine_0.38.jar



特長

・Pattern Matching照準
・Shadow Move(敵の動き丸写し)
・基本的にDodgeBot
Meleeはおまけ


アーキテクチャについて

Magazine(実はCobraBoraも)は、以下のパーツの集合体である。
・Brain
敵情報の保存、射撃アルゴリズム
・Driver
Brain、Radar、Gun、Motorの制御
・Radar
レーダー制御
・Gun
銃身制御
・Motor
移動制御

それぞれのパーツは、1tickごとに動的に入れ替え可能。
Magazineでは、Driverについて
MeleeDriver
・AssaultDriver
・ShadowDriver
の3つを状況に応じて入れ替えている。
(ちなみにCobraBoraでは専用Driverを1種類のみ実装し、他パーツはMagazineの流用。)

RobocodeAPI制御と動作ロジックを分けることは、
ソースが肥大化するデメリットがあるものの
純粋なアルゴリズム検討が行いやすくなるメリットがある。
また、再開発時に最初からある程度の強さが確保できるのはかなり気分が良くモチベーション維持につながる。


back


DRM is Atsushi Sugiyama.
E-mail: nudi-drm@boreas.dti.ne.jp