アリの戦いのルール

現在進行中のGoogle AIチャレンジのルールを引き続き理解しています 。 その後、アリの戦いの結果を計算するための公式ルールの翻訳を読むことができます。

戦闘結果の主なルール


戦闘の結果は、2つの異なる角度から決定されます。
攻撃距離にいる敵が少数の(または同じ)自分の敵に囲まれている場合、アリは死にます。

または

私たちのアリは、攻撃の距離にある敵がそのターゲットよりも多くの(または同じ)敵に囲まれている場合、敵を殺します。

これがまだ明確でない場合は、絶望しないでください。詳細な説明があります。

アリの世界についての明らかな事実

アリは非常に単純な生き物です。 実際、彼は自分で2つのことしかできません。
1つ目は、食べ物から新しいアリを作成することです。 もちろん、この行動はアリにとっては非常に難しく、正確で骨の折れる作業が必要です(そのため、食物に近づく必要があります)。 結果は非常に簡単ですが、食べ物が十分に近い場合、同じ色の別のアリが表示されます。 例外は、異なる色のいくつかのアリが同時に食物に近づく場合です。 彼らがそれを収集しようとすると、食べ物は破壊されます。
2つ目は、敵のアリを攻撃することです。 これは誕生よりもはるかに単純であり、はるかに長い距離で発生する可能性があります(詳細は確実にはわかりませんが、足をすばやく整理する必要があります)。 結果は、出生時よりも理解しにくい場合があります。

最も単純なケースでは、異なる色の2つの別々のアリが互いに接近しているため、彼らが戦闘に参加する場合、すべての注意は敵に集中します。 同等の注意を払って、敵はお互いを殺します。

一人のアリが同時に2人の敵と衝突するとき、彼は敵の間で彼の注意を分けなければなりません。 敵は完全にアリに集中しています。 これは、一人のアリが迷って死ぬことを意味し、他の2匹は生き残ります。 生存のために、蟻の濃度は敵の濃度よりも高くなければなりません。 アリの注意がいずれかの対戦相手の注意と同等かそれ以下の場合、アリは死亡します。

アリは敵を色で区別しません。 たとえば、緑、赤、青などの3色のアリが互いに攻撃の距離を置いて出現した場合、各アリの注意は2人の敵に分割され、3人のアリはすべて死亡します。 しかし、緑のアリの片側に赤が、もう片側に青があり、赤と青が離れすぎて互いに攻撃できない場合、緑だけが死にます。 結局のところ、彼の注意は2人の対戦相手の間で分散され、各敵はグリーンのみに集中します。

この説明が、戦闘の結果を計算する原理を理解するのに役立つことを願っています。 理解を深めるために、戦闘のより複雑な例を考えてみましょう。

2匹の青アリのシドとサム、2匹の赤アリのケントとカイトが世界を探検しました。 そして、次の動きの後、サムは両方の赤アリの攻撃距離に行きましたが、シドはケントだけを攻撃できます。 質問はあなたのためです。 誰が死に、誰が生き残るのか?
質問に答えるまでフォローアップしないでください。
 -> .. ...  -> . <-  ... .. <-  

すでに回答を受け取っていますか? 受け取るまで続けないでください。
この状況では、青アリのサムと赤アリのケントは2人の敵に分けられます。 シドとカイトはそれぞれ唯一の敵に集中しており、敵の注意は分かれています。 したがって、サムとケントはこの戦いで死にます、そして、シドとカイトは将来戦うために生き残ります。

かなり簡単ですね。 もちろん。 各戦闘は同じように進行します。 アリの注意が各対戦相手の注意よりも少ない対戦相手に分かれている場合、彼は生き残ります。 これで、このドキュメントをさらに掘り下げて、技術的な詳細の説明と追加の例を見つける準備ができました。

いくつかの技術的な詳細

攻撃の距離にある各アリは、複数の敵を持つことができます。 彼はこれらのアリとの戦いで「忙しい」と信じられています。 各アリは、その注意を「占有」する独自の数の敵を持つことができます。 より少ない敵で忙しいアリは、より多くの敵と戦うアリよりもこれらの敵を殺すことに集中しています。 同様に忙しいアリはお互いを殺すことができます。
 ......C CABC ......C 
各アリは複数のアリを殺すことができ、各アリは複数のアリによって殺されることができます。 同じアリはアリを殺すことができ、1ターンで別のアリに殺されます。
手動で戦闘を数えるには、各アリの周囲の敵の数を数えるだけです:
 ......1 1 2 4 1 ......1 

その後、アリの隣に同数以下の敵がいる場合、アリは死にます。
 ......C CxxC ......C 

オプション


いずれの場合も、攻撃半径の2乗は5であり、攻撃距離は図のような形式になります(計算された半径の2乗を使用)
 ....... ...9... ..xxx.. .85458. .xxxxx. .52125. .xxAxx. 9410149 .xxxxx. .52125. ..xxx.. .85458. ....... ...9... 

一対一

両方とも死ぬ
 ..... ..... ..... .AB -> .1.1. -> .xx ..... ..... ..... 

1対2

死ぬ
 ...B. ...1. ...B. .A... -> .2... -> .x... ...B. ...1. ...B. 

3人の戦闘機が一緒に来ました

すべてが死んだ
 ...B. ...2. ...x. .A... -> .2... -> .x... ...C. ...2. ...x. 

アリサンドイッチ

アリは中央で死滅します。 AとCは生き残ります。
 ..... ..... ..... ABC -> 1.2.1 -> AxC ..... ..... ..... 

ペアvsシングル2

BとCが死ぬ
 ...B. ...3. ...x. .AA -> .2.2. -> .AA ...C. ...3. ...x. 

壁を打つ

多くが死んだ
 AAAAAAAAA 013565310 AAxxxxxAA ...BBB... -> ...555... -> ...xxx... ...BBB... ...333... ...xBx... 

アリBは、それぞれがより忙しい3つの中央アリAによってのみ攻撃されるため、生き残ります。 次に、これら3つの中央アリAの死に影響します。
 ???AAA??? ???565??? AAxxxxxAA ...???... -> ...???... -> ...xxx... ...?B?... ...?3?... ...xBx... 

エッジからのアリAは、より忙しいアリBだけに攻撃されるため生き残ります。
 ?A??????? ?1??????? AAxxxxxAA ...B??... -> ...5??... -> ...xxx... ...???... ...???... ...xBx... 

シドとサム対ケントとカイト:
上アリと下アリは互いに接触しません。
両側に1人が死亡
 ...... ..1.... ...... ..... -> ..2.2.. -> ..xx. ...... ....1.. ...... 


数学


ant xの位置について、関数敵(x)を定義します。これは、xからの攻撃距離に位置する敵の数に等しくなります。
アリの位置aの場合、
同様に、アリaの位置については、

擬似コード:


 //        :        :  (    ) >= (    )        

Python


 #           #      nearby_enemies = {} for ant in self.current_ants.values(): nearby_enemies[ant] = self.nearby_ants(ant.loc, self.attackradius, ant.owner) #     ants_to_kill = [] for ant in self.current_ants.values(): #     (1/power) weakness = len(nearby_enemies[ant]) # ,          if weakness == 0: continue #      min_enemy_weakness = min(len(nearby_enemies[enemy]) for enemy in nearby_enemies[ant]) #  ,         if min_enemy_weakness <= weakness: ants_to_kill.append(ant) 

Source: https://habr.com/ru/post/J131071/


All Articles