潜在的な勝利| JavaScript
このボットの推奨色は#1600a6
です。
function (me, others, coins)
{
let huntingTimer = botNotes.getData("huntingTimer");
let huntedIndex = botNotes.getData("huntedIndex");
if(!huntingTimer)
huntingTimer = 0;
else if(huntingTimer >0)
huntingTimer--;
else if(huntingTimer == -1)
huntingTimer = Math.ceil(20*(1+Math.log2(me.coins/25)));
else
huntingTimer++;
function distanceFromMe(X, Y) { return Math.abs(me.locationX - X) + Math.abs(me.locationY - Y); }
function U(x, y)
{
function distance(X, Y) { return Math.abs(X-x) + Math.abs(Y-y); }
function gravitation(k, X, Y) { return - k / ( distance(X, Y) + .2 ); }
function exponential(k, q, X, Y) { return - 5*k * Math.exp(- q * distance(X,Y)); }
// No going away from the arena.
if(!((0 <= x) && (x < me.arenaLength) && (0 <= y) && (y < me.arenaLength)))
{
return Infinity;
}
let reachability = [1, 1, 1, 1, 1];
let distances = coins.map(c => distanceFromMe(c[0], c[1]));
for(let i = 0; i < others.length; i++)
{
for(let coin = 0; coin < 5; coin++)
reachability[coin] += (Math.abs(others[i][0] - coins[coin][0]) + Math.abs(others[i][1] - coins[coin][1])) < distances[coin];
}
let potential = gravitation(40, coins[0][0], coins[0][1]) / (reachability[0]); // Gold
// Silver
for(let i = 1; i < 5; i++)
{
potential += gravitation(10, coins[i][0], coins[i][1]) / (reachability[i]);
}
others.sort((a, b) => b[2] - a[2]);
// Other bots
for(let i = 0; i < others.length; i++)
{
if(
((Math.abs(me.locationX - others[i][0]) + Math.abs(me.locationY - others[i][1])) < 3) &&
(huntingTimer == 0) &&
(me.coins > 25) &&
(me.coins < (others[0][2]*.9)) &&
(others[i][2] < me.coins-5) && (others[i][2] >= 10)
)
{
huntingTimer = -10;
huntedIndex = i;
}
if((huntingTimer < 0) && (huntedIndex == i))
potential += exponential(30, 1, others[i][0], others[i][1]);
if(others[i][2] >= me.coins)
{
// Otherwise, they could eat us, and we will avoid them.
potential += exponential(-1400, 3, others[i][0], others[i][1]);
}
}
return potential;
}
// All possible squares we can move to, with their names.
let movements = [
[ "north", U(me.locationX, me.locationY - 1)],
[ "south", U(me.locationX, me.locationY + 1)],
[ "east", U(me.locationX + 1, me.locationY)],
[ "west", U(me.locationX - 1, me.locationY)],
[ "none", U(me.locationX, me.locationY)]
];
botNotes.storeData("huntingTimer", huntingTimer);
botNotes.storeData("huntedIndex", huntedIndex);
// Sort them according to the potential U and go wherever the potential is lowest.
movements.sort((a, b) => a[1] - b[1]);
return movements[0][0];
}
(ずさんなフォーマットの謝罪、このサイトの4つのスペースのインデントは、タブを使用する私の習慣とうまくいきません。)
大まかな説明
ここで、式の説明を更新する試みを辞任します。係数は絶えず変化しており、説明を最新に保つのは少し難しいです。それでは、一般的な原則について説明します。
各コインと各ボットは、潜在的な力の場を生成します。私はすべてのポテンシャルをまとめて追加するだけで、ボットはポテンシャルが最も低い場所に移動します。(明らかに、この考えは物理学から盗まれています。)
私は2種類のポテンシャルを使用します。最初のものは、擬似重力(任意の範囲で作用する)
kは、フィールドの「強さ」である、と、看板のこの選択で、可能性は魅力的です。R、ここでは(および他の場所)タクシーメートル、距離ではr = |、X1 - x₂| + |y₁-y₂| 。
うん=−kr+15⋅11+n.
ゴールドコインにはk = 40、シルバーコインにはk = 10を使用します。nは、私たちよりも特定のコインに近いボットの数です。そうでない場合、他のボットは絶対に無視します(より強力なボットの邪魔になると逃げますが、それだけです)。それ以外の場合、主に金を常に追いかけるボットが私を打ち負かすので、私は金貨を価値がある以上に評価します。
2番目の可能性は、指数関数的に減衰する可能性(非常に短い距離でのみ効果的に作用します)です。これは、他の、主により強力なボットによって生成されます。
これらは、フィールドを生成します
この力は0〜1の範囲では非常に強力ですが、距離が遠くなるとほとんど減衰しません。(距離+ 1は力を1/20で切ることを意味します。)
U=−5×1400e−3r.
通常、他のボットを意図的に攻撃することはありません(もちろん、彼らが私たちの邪魔をして踏み込んだ場合、それは彼らのせいです)が、それを行う可能性があります。いくつかの厳しい条件が満たされた場合、単一のボットに焦点を合わせてハンティングモードに入ることがあります。ハンティングモードに入るには:
- 少なくとも25枚のコインが必要です。(最初にコインを入手する必要があります。)
- 彼らは多くても(私たちのコイン-5)コイン、そして少なくとも10コインを持っている必要があります。(1枚のコインをつかみ、突然より強力になった人物を狩りたくはありません。また、ゼロコインボットを追跡したくありません。)
- コインの少なくとも1/10だけ、現在の主要なボットに遅れをとる必要があります。(何かを狩るには幸運である必要があるので、私たちの運を試すためだけに良い地位を与える必要はありません。)
- 狩りのクールダウンをしてはいけません(下記参照)。
これらすべてが満たされると、ハンティングモードがアクティブになります。次の10ラウンドでは、狩られたボットは潜在的なのみを放出し
これらの10ラウンドが経過した後、ハンティングクールダウンに入ります。この間、ハンティングモードに再び入ることはできません。(これは、1つのボットを無限に無益に追いかけ、他のすべてのボットが幸福にコインをつかむのを防ぐためです。)ハンティングクールダウンは、25枚のコインがある場合は20ラウンドで、2倍になるごとに20コインずつ増加します。(つまり、クールダウンは。)(エンドゲームでは、すべての狩り可能なボットが死んでいる可能性が最も高いため、狩りが無駄になる可能性が最も高いため、これを使用します。そのため、無駄な時間を制限したいと思います。 。しかし、時々、幸運な終盤のゲームでの食事はすべてを変える可能性があるため、可能性を維持しています。
U=−150e−r。
20(1 + log2(c / 25))
最後に、アリーナ全体が無限の可能性のある井戸に配置され、ボットの脱出を防ぎます。