잠재적으로 승리 | 자바 스크립트
이 봇의 기본 색상은 #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 칸 들여 쓰기는 탭 사용에 대한 사용자 정의와 잘 맞지 않습니다.)
대략적인 설명
나는 공식의 설명을 업데이트하려는 시도에서 사임했다. 계수는 끊임없이 변하고 있으며 설명을 최신으로 유지하기가 다소 어렵습니다. 일반적인 원리를 설명하겠습니다.
각 코인과 각 봇은 잠재력이있는 힘장을 생성합니다. 나는 모든 것의 잠재력을 합치면 봇은 잠재력이 가장 낮은 곳으로 간다. (물론이 아이디어는 물리학에서 도난당했습니다.)
저는 두 가지 가능성을 사용합니다. 첫 번째는 의사 중력이며 (모든 범위에서 작동)
k는기호의 선택과 함께, 가능성은 매력적이다 필드의 "힘"이며,. 여기서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 라운드 들어, 사냥 봇은 잠재적 방출
이 10 라운드가 경과 한 후에는 사냥 쿨 다운에 들어가고, 그 동안 사냥 모드로 다시 들어 가지 않을 수 있습니다. (이것은 우리가 하나의 봇을 끝없이 쫓아가는 동안 다른 모든 동전을 행복하게 잡는 것을 막는 것입니다.) 사냥 쿨 다운은 25 개의 동전이있을 때 20 라운드이며, 두 배가 될 때마다 20 동전이 증가합니다. 즉, 재사용 대기 시간은
U=−150e−r.
20(1 + log2(c / 25))
.) (우리는 최종 게임에서 모든 사냥 가능한 봇이 죽었을 가능성이 높기 때문에 모든 사냥이 헛된 것입니다. 그로 인해 우리는 낭비되는 시간을 제한하려고합니다. 게임 식사는 모든 것을 바꿀 수 있으므로 가능성을 유지하십시오.)
마지막으로, 전체 경기장은 봇이 탈출하는 것을 막는 무한한 잠재적 우물에 배치됩니다.