潜在的胜利 的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个空格缩进与我习惯使用的制表符不太匹配。)
粗略的解释
在此,我辞职以尝试更新公式的解释。系数在不断变化,很难及时更新说明。因此,我将仅解释一般原理。
每个硬币和每个机器人都会产生具有一定潜力的力场。我只是将所有事物的潜力相加,然后该机器人会去到潜力最低的地方。(显然,这个想法是从物理学中窃取的。)
我使用两种潜力。第一个是伪重力(在任何范围内起作用),其中
该ķ是该领域的“实力”,而且,这种选择的标志,潜力诱人。这里(以及其他所有地方)的r是出租车类度量中的距离,r = |x₁-x²| + |y₁-y²| 。
U=−kr+15⋅11+n.
对于金币,我使用k = 40,对于银币,我使用k = 10。n是比我们更接近特定硬币的机器人数量。否则,我们绝对会忽略其他机器人(如果我们遇到了功能更强大的机器人,我们就会逃跑,仅此而已)。我认为金币的价值超出其价值,因为否则,那些一直追逐金币的机器人会击败我。
第二个电位是指数衰减的电位(仅在很小的距离内有效地起作用)。这是由其他机器人(主要是功能更强大的机器人)生成的。
它们产生一个的字段
在0-1范围内,该力过强,但在较大距离处衰减几乎为零。(距离+1表示将力减小1/20。)
U=−5×1400e−3r.
我们通常不会故意攻击其他机器人(当然,如果它们挡住了我们的脚步,我们踩到了它们,那是他们的错),但是有可能这样做。如果满足一些苛刻的条件,我们可能会进入狩猎模式,只专注于单个机器人。要进入搜索模式:
- 我们必须至少有25个硬币。(我们需要先获得一些硬币。)
- 他们最多只能有(我们的硬币-5)个硬币,以及至少10个硬币。(我们不想猎取一个硬币并且突然变得更强大的人,我们也不想追求零硬币机器人。)
- 我们必须落后于目前领先的机器人至少其硬币的1/10。(您需要幸运地找到一些东西,因此不必为了尝试自己的运气就放弃良好的职位。)
- 我们一定不能处于狩猎冷却状态(见下文)。
如果满足所有这些条件,则激活搜索模式。在接下来的10个回合中,被搜寻到的漫游器仅发出潜在的
经过这十轮之后,我们进入狩猎冷却时间,在此期间我们可能不再进入狩猎模式。(这是为了防止我们无休止地追逐一个机器人,而其他所有机器人都快乐地抓取硬币。)当我们有25个硬币时,狩猎冷却时间为20发,每增加一倍,则增加20个硬币。(换句话说,冷却时间为。)(我们之所以这样使用,是因为在最终游戏中,所有可搜索的漫游器都很可能死了,因此任何搜索都将无济于事。因此,我们想限制浪费的时间但有时候,幸运的游戏后期饮食可以改变一切,所以我们保持了可能性。
ü= - 150 Ë- - [R。
20(1 + log2(c / 25))
最后,整个竞技场都放置在无限的潜孔中,以防止机器人逃脱。