ชัยชนะที่อาจเกิดขึ้น 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 รายการสำหรับไซต์นี้ไม่เป็นไปด้วยดีกับการใช้แท็บที่กำหนดเอง)
คำอธิบายที่หยาบ
ฉันขอลาออกจากความพยายามที่จะอัพเดทคำอธิบายของสูตร สัมประสิทธิ์มีการเปลี่ยนแปลงอยู่ตลอดเวลาและเป็นการยากที่จะอธิบายให้ทันสมัยอยู่เสมอ ดังนั้นฉันจะอธิบายหลักการทั่วไป
แต่ละเหรียญและแต่ละบอทสร้างสนามพลังที่มีศักยภาพ ฉันแค่เพิ่มศักยภาพจากทุกอย่างเข้าด้วยกันและบอทก็จะไปที่ใดก็ตามที่มีศักยภาพต่ำที่สุด (เห็นได้ชัดว่าความคิดนี้ถูกขโมยจากฟิสิกส์)
ฉันใช้ศักยภาพสองแบบ อันแรกคือแบบหลอก - ความโน้มถ่วงอันหนึ่ง (ซึ่งทำหน้าที่ในทุกช่วง) ด้วย
kคือ "ความแรง" ของสนามและมีทางเลือกของสัญลักษณ์นี้มีศักยภาพเป็นที่น่าสนใจ Rนี่ (และทุกที่อื่น) เป็นระยะทางในรถแท็กซี่ตัวชี้วัดที่r = | x₁ - x₂ | + | y₁ - y₂ | .
ยู= - kr + 15⋅ 11 + n.
ฉันใช้k = 40สำหรับเหรียญทองและk = 10สำหรับเหรียญเงิน nคือจำนวนบอทที่ใกล้เคียงกับเหรียญที่เราต้องการมากกว่า มิฉะนั้นเราจะไม่สนใจบ็อตอื่น ๆ อย่างแน่นอน (ถ้าเราเข้าไปในบ็อตที่แข็งแกร่งกว่าเราก็วิ่งหนี แต่นั่นมัน) ฉันให้ความสำคัญกับเหรียญทองมากกว่าที่พวกเขามีค่าเพราะอย่างอื่นบอทที่ไปหลังจากทองคำตลอดเวลาเอาชนะฉัน
ศักยภาพที่สองคือการสลายตัวแบบเอกซ์โปเนนเชียลอย่างใดอย่างหนึ่ง (ซึ่งทำได้อย่างมีประสิทธิภาพเฉพาะในระยะทางที่น้อยมาก) สิ่งนี้สร้างขึ้นโดยคนอื่น ๆ ส่วนใหญ่มีประสิทธิภาพมากขึ้นบอท
เหล่านี้ผลิตข้อมูลที่มี
พลังนี้มีความแข็งแกร่งในระดับ 0-1 แต่จะสลายตัวจนแทบไม่มีอะไรในระยะทางไกล (ระยะทาง + 1 หมายถึงการตัดกำลังใน 1/20)
ยู= - 5 × 1400 e- 3 r.
โดยทั่วไปเราจะไม่โจมตีบ็อตอื่นโดยเจตนา (แน่นอนถ้าพวกเขาเข้ามาขวางทางเราและเหยียบพวกเขามันเป็นความผิดของพวกเขา) แต่มีความเป็นไปได้ที่จะทำเช่นนั้น หากเงื่อนไขที่โหดร้ายบางอย่างเกิดขึ้นเราอาจเข้าสู่โหมดการล่าสัตว์โดยมุ่งไปที่บอทเดี่ยว ในการเข้าสู่โหมดการล่าสัตว์:
- เราต้องมีอย่างน้อย 25 เหรียญ (เราต้องได้รับเหรียญก่อน)
- พวกเขาจะต้องมีมากที่สุด(เหรียญของเรา - 5)เหรียญและอย่างน้อย 10 เหรียญ (เราไม่ต้องการที่จะตามล่าใครสักคนที่คว้าเหรียญหนึ่งเหรียญและมีพลังมากขึ้นในทันทีและเราก็ไม่ต้องการที่จะไล่ล่าบอทศูนย์เหรียญเช่นกัน)
- เราจะต้องล้าหลัง bot ที่เป็นผู้นำในปัจจุบันโดยอย่างน้อย 1/10 ของเหรียญของเขา (คุณต้องโชคดีในการตามล่าบางอย่างดังนั้นไม่จำเป็นต้องให้ตำแหน่งที่ดีเพียงเพื่อลองเสี่ยงโชคของเรา)
- เราจะต้องไม่อยู่ในคูลดาวน์การล่าสัตว์ (ดูด้านล่าง)
หากสิ่งเหล่านี้พอใจโหมดการล่าสัตว์จะเปิดใช้งาน สำหรับ 10 รอบถัดไปบอทที่ถูกล่าจะปล่อยพลังงาน
หลังจากผ่านไป 10 รอบเราจะเข้าสู่คูลดาวน์การล่าสัตว์ในระหว่างที่เราไม่สามารถเข้าสู่โหมดการล่าสัตว์ได้อีก (นั่นคือเพื่อป้องกันเราจากการไล่ล่าบอทหนึ่งอันไม่มีที่สิ้นสุดและไร้ผลในขณะที่ทุกคนคว้าเหรียญอย่างมีความสุข) คูลดาวน์การล่าคือ 20 รอบเมื่อเรามี 25 เหรียญและเพิ่มขึ้น 20 เหรียญต่อการเพิ่มขึ้นสองเท่า (กล่าวอีกนัยหนึ่งคูลดาวน์คือ
ยู= - 150 e- ร.
20(1 + log2(c / 25))
.) (เราใช้สิ่งนั้นเพราะใน endgame บอทที่ล่าได้ทั้งหมดน่าจะตายและดังนั้นการล่าสัตว์ใด ๆ ก็น่าจะไร้ประโยชน์ด้วยเหตุนี้เราจึงต้องการ จำกัด เวลาที่สูญเปล่า แต่บางครั้งโชคดีมาสาย - การกินเกมสามารถเปลี่ยนแปลงทุกสิ่งได้ดังนั้นเราจึงมีความเป็นไปได้)
ในที่สุดเวทีทั้งหมดจะถูกวางในหลุมที่ไม่มีที่สิ้นสุดซึ่งป้องกันไม่ให้บอทหนี