歴史3位ロシアAIカップ2017

みなさんこんにちは! この記事では、過去のロシアAIカップ人工知能プログラミング競技会における私の戦略の要点を簡単に説明したいと思います。







ロシアのAIカップについて少し



イベントの本質は、ゲームのボットを作成する必要があり、そのルールは主催者によって設定され、イベント中に変更されたということでした。



今年のタスクの特徴は、多数の戦闘ユニットを制御する人工知能を作成する必要があったことです。



ルールはこちらにあります



私について少し



私のプロフィールはレオです。



私はそのようなイベントに二度目に参加しました。



最初の経験は2015年でした-ロシアAIカップ2015、CodeRacing。 それから私が成し遂げたのは、第2ラウンドに入ることです。 これで、すべてが終わり、歴史はありませんでしたが、Habréで、受賞者の1人の記事に出くわしました。 その瞬間から、私はそのようなイベントに参加する次の機会を待っていました。



2016年は逃した-軍。



このコンペティションでは、私はオープンベータテストの最初からほとんど参加し始めました。



戦略



最初の有意義な戦略は、単純なサンドイッチと独立して行動する戦闘機でした。



しかし、第2ラウンドではサンドイッチが効果的ではないことは明らかであったため、他のものを探す必要がありました。 潜在的なフィールドが尋ねていたので、 GreenTeaから実際にそれらを見ると、それらを使用することが明らかになりました。



2番目の戦略は小さなサンドイッチでした(大きなサンドイッチは10個のグループに分割されました)。 戦闘機はまだ独立して行動しました。

以下は、彼女が最初のラウンドでさまざまな敵の戦略に対してどのように働いたかの例です:

敵にはいくつかのグループがあります: russianaicup.ru/game/view/106992

敵にはサンドイッチがあります: russianaicup.ru/game/view/124483



この戦略の主な利点は、多数の負傷ユニットを持つグループを安全な距離に連れて行くことができ、すべてのARRVが使い果たされることでした。



しかし、欠点はより重要でした。





3番目の戦略は、5つのグループをそのまま使用することでした。 これはおそらく、決勝の参加者のほとんどがこれに来たので、軍隊を分割するための最も最適な戦略です。



進行順序



最初のバージョンでは、10ティックごとに順番にグループに移動し、敵の核攻撃によってのみ順序が違反されました。



各グループの最終バージョンでは、移動の必要性を数えます。 移動の必要性は、対応するグループの最大電位差によって決定され、敵の核攻撃は個別に考慮されます。 十分に移動する必要のあるグループが存在しない場合、何もしません。



ここでは、いくつかのアクションが連続して複数のアクションを必要とすることにも注意する価値があります(たとえば、グループの選択と移動)。 したがって、アクションが1つのコマンドで構成されていない場合にキャプチャされるモニターを取得し、モニターがキャプチャされると、その所有者のみがアクションを実行できます。



コマンド行はありませんでした。 すでに選択されているグループを再選択しないために、現在選択されているグループを常に覚えています。



電位差に基づいた優先グループの選択



すべてのグループについて計算されたポテンシャル。



64の異なる方向にふるいにかけられました。 まず、式:



画像






どこで 画像 -中央のグループの可能性、

画像 k番目のポイントのポテンシャルは、

画像 -k番目のポイントに到達するために必要なティックの数。



実は 画像 相対的な電位差です。 各方向で計算しました。 ポイント 画像 -これらは、特定の距離で離れているこの方向のいくつかのポイントです。



同じ式を使用して、現在の移動方向の相対電位差を計算しました- 画像



最大の差があるグループが最高の優先度と見なされました。 画像



潜在的な計算



私は、ポテンシャルの選択に重点を置きました。 実際、数学はたくさんあるはずですが、要点だけを書きます。



3種類のポテンシャルがありました:





ポテンシャルを生成する4つのオブジェクトがありました。



1)地図の境界線



強く減少し、反発する可能性があるため、コーナーにならないように、マップの端に衝突しないようにします。



2)同盟部隊





ここでは、空軍がデフォルトで地面を覆うように、最後の2つの可能性が戦争の霧の導入とともに追加されました。



3)敵ユニット



戦闘シミュレーターを使用して符号と係数が計算された中程度の減少ポテンシャル。



4)施設



潜在的に弱くなります。これについては、さらに詳しく説明します。



構造のキャプチャ



すべてのグループの各構造から係数を計算しました。 重点は次のことです。





私はここで難解なものを発明しませんでした。すべてをあたかも処方し、試行錯誤によって適切な係数を選択しました。



機械製造



製造された機器のタイプは、戦闘シミュレーターを使用して決定されました。



テクノロジーの新しいグループへの組み合わせは、新しいグループの潜在的な違いが非常に大きいときに発生しました。 同時に、これらのグループでは敵の可能性と建物の可能性のみが考慮されました(これは決勝戦の間に修正されたため、決勝戦の初日に多くの不愉快な敗北を経験しました)。



バトルシミュレーター



すでに2回言及されていますが、特別なことは何もありません。 シミュレータの目標は、あるグループが別のグループよりもどれだけ強いかを判断することでした。



2つのグループが戦いに参加します。 すべての機能(地上/空気、機器の種類、ARRVの回復)を考慮して、私は彼らの完全な健康と損傷を考慮します。

その後、反復プロセスを開始します。 各反復でのダメージは、現在のヘルスに比例します。 各反復でのヘルスは、敵のダメージの量だけ減少します。

最新バージョンの反復回数は10回でした。



一般に、それはうまく機能し、私の部隊は小競り合いに負けないようになりました。



クラスタリング



当然、敵のグループを決定する必要がありました。 ここでは、スタブとして単純なアルゴリズムを作成しましたが、それは最後まで残りました。



エリアを8x8のタイルに分割し、9未満の距離で隣接するタイルに敵ユニットがいる場合、それらを1つのグループに結合しました。



敵グループの近似



楕円で近似された敵グループ。 明らかに間違ったアルゴリズムです。これは再びスタブとして使用されましたが、私と一緒に終わりました。



主軸とその法線を決定し、それぞれグループ内の最も遠いテクニックの方向とグループに垂直な方向にグループの中心を通過しました。 次に、半径を決定しました。



戦争の霧



彼は戦争の霧の導入で特別なものを発明しませんでした。 彼は敵の位置を思い出し、空軍が地面を覆うように追加の可能性を追加しました。



ビジュアライザー



ビジュアライザーではあまり気にしませんでした。 潜在的なフィールドのみをレンダリングしました。 そしてゲームを分析するとき、彼はそれを地元のランナーと組み合わせて使用​​しました。



写真があるように、いくつかの例を追加します。







ここでは、脂っこい緑色のスポットが私のヘリコプターであり、潜在的なフィールドがそれらのために構築されています。



青色は正の電位に対応し、赤-負、赤の背景に黒-非常に大きなモジュラスの負になります。



ヘリコプターを引き付ける右下の3つの敵の地上グループ。 中央には敵の戦闘機があり、私のヘリコプターはそれを恐れています。 大きな黒い斑点-私の戦闘機、遭遇することはできません。







主人公が私のIFVである別の例。 ここでは、敵のすべてのグループと右側の2つのグループが正の突撃です。



黒い斑点は、グループとの衝突により移動するのが望ましくない場所に対応します。 左下の構造は、ARRVチームが既にキャプチャするために前進しているため、効果がありません。



両方の例は、この戦いから取ったものです-russianaicup.ru/game/view/310222、730および1800ティック。



コード



これが私のリポジトリへのリンクです。

私はJavaで書いた。 コードの品質-現状では、私が書いたとき、誰もがそれを見るとは思わなかった。 まあ、私はジャビストではありません。JavaコースはAIキャップと同時に行われました。



それだけですか?



合計:多くの松葉杖とスタブ、単純なアルゴリズムはありません。



まったく感情がなく、少し乾燥していることが判明しましたが、誰かが自分にとって有益なものを見つけることを願っています。



PSみなさん、明けましておめでとうございます! :)



更新:携帯電話で表示される数式を修正しました。



All Articles