সম্ভাব্য বিজয়ী | জাভাস্ক্রিপ্ট
এই বটের জন্য পছন্দসই রঙ #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 টি স্পেস ইন্ডেন্টেশন আমার ট্যাবগুলি ব্যবহার করার পদ্ধতিতে ভাল যায় না))
রুক্ষ ব্যাখ্যা
সূত্রগুলির ব্যাখ্যা আপডেট করার প্রয়াসে আমি পদত্যাগ করছি। গুণাগুণগুলি ক্রমাগত পরিবর্তন করে চলেছে এবং ব্যাখ্যাটি আপ টু ডেট রাখা খুব কঠিন। সুতরাং আমি কেবল সাধারণ নীতিটি ব্যাখ্যা করব।
প্রতিটি মুদ্রা এবং প্রতিটি বট কিছু সম্ভাবনা সহ একটি বল ক্ষেত্র তৈরি করে। আমি কেবল সমস্ত কিছু থেকে একসাথে সম্ভাব্যতা যোগ করি এবং সম্ভাবনা সর্বনিম্ন যেখানেই বট যায় is (অবশ্যই এই ধারণা পদার্থবিজ্ঞান থেকে চুরি করা হয়েছে।)
আমি দুই ধরণের সম্ভাবনা ব্যবহার করি। প্রথমটি হ'ল সিউডো-মহাকর্ষীয় এক (যা কোনও পরিসীমাতে কাজ করে),
ট একটি ক্ষেত্র এর "ক্ষমতা", এবং, চিহ্নের এই পছন্দ সঙ্গে, সম্ভাব্য আকর্ষণীয়। এখানে আর (এবং অন্য যে কোনও জায়গায়) ট্যাক্সিক্যাব মেট্রিকের দূরত্ব, r = | x₁ - x₂ | + | y₁ - y₂ | ।
ইউ= - কেr + 15। 11 + এন।
আমি সোনার মুদ্রার জন্য k = 40 এবং রূপালী মুদ্রার জন্য k = 10 ব্যবহার করি। n হ'ল আমাদের তুলনায় নির্দিষ্ট মুদ্রার নিকটবর্তী যে বটগুলির সংখ্যা। অন্যথায়, আমরা অন্যান্য বটগুলি একেবারে উপেক্ষা করি (যদি আমরা আরও শক্তিশালী বোটের পথে চলে যাই তবে আমরা পালিয়ে যাই, তবে এটিই)। আমি সোনার মুদ্রাগুলিকে মূল্যবান বলে মনে করি সেগুলির চেয়ে আমি মূল্যবান কারণ অন্যথায় যে বটগুলি মূলত সারাক্ষণ সোনার পরে যায় তা আমাকে মারধর করে।
দ্বিতীয় সম্ভাবনাটি হ'ল দ্রুত ক্ষয়কারী একটি (যা কার্যকরভাবে কেবল খুব কম দূরত্বে কাজ করে)। এটি অন্য দ্বারা উত্পন্ন হয়, প্রধানত আরও শক্তিশালী, বটগুলি।
এগুলি সহ একটি ক্ষেত্র উত্পাদন করে
এই বাহিনীটি 0-1 পরিসরে রেফারেন্সিয়ালি শক্তিশালী, তবে বড় দূরত্বে প্রায় কিছুই করার সিদ্ধান্ত নেয় না to (দূরত্ব + 1 এর অর্থ 1/20 এ বল কাটা।
ইউ= - 5 × 1400 ই- 3 আর।
আমরা সাধারণত অন্যান্য বটগুলিকে ইচ্ছাকৃতভাবে আক্রমণ করি না (অবশ্যই তারা যদি আমাদের পথে চলে যায় এবং আমরা তাদের উপর পা রাখি তবে এটি তাদের দোষ), তবে এটি করার সম্ভাবনা রয়েছে। যদি কিছু কঠোর শর্ত পূরণ হয়, তবে আমরা একক বটকে কেন্দ্র করে, শিকারের মোডে প্রবেশ করতে পারি । শিকারের মোডে প্রবেশ করতে:
- আমাদের অবশ্যই কমপক্ষে 25 টি কয়েন থাকা উচিত। (আমাদের প্রথমে কিছু মুদ্রা নেওয়া দরকার))
- তাদের অবশ্যই সর্বাধিক (আমাদের কয়েন - 5) মুদ্রা এবং কমপক্ষে 10 টি মুদ্রা থাকতে হবে। (আমরা এমন কোনও ব্যক্তির শিকার হতে চাই না যে একটি মুদ্রা ধরে ফেলে এবং হঠাৎ আরও শক্তিশালী এবং আমরা শূন্য-কয়েনের বটগুলিও অনুসরণ করতে চাই না))
- আমাদের অবশ্যই বর্তমানে শীর্ষস্থানীয় বট থেকে তার কয়েনের কমপক্ষে 1/10 দ্বারা পিছিয়ে থাকতে হবে। (কোনও কিছুর খোঁজ করার জন্য আপনার ভাগ্যবান হওয়া দরকার, তাই কেবল আমাদের ভাগ্য চেষ্টা করার জন্য একটি ভাল অবস্থান দেওয়ার দরকার নেই))
- আমাদের অবশ্যই শিকারের কলোডাউন এ থাকা উচিত নয় (নীচে দেখুন)।
এই সমস্ত সন্তুষ্ট হলে, শিকার মোড সক্রিয় করা হয়। পরবর্তী 10 রাউন্ডের জন্য, শিকার করা বট কেবলমাত্র সম্ভাব্য নির্গত করে
এই 10 টি রাউন্ড অতিক্রান্ত হওয়ার পরে, আমরা শিকারের সমুদ্রসীমায় প্রবেশ করি, যার মধ্যে আমরা আবার শিকারের মোডে প্রবেশ করতে পারি না। (এটি আমাদের অবিরাম এবং নিরর্থকভাবে একটি বট তাড়ানোর সময় প্রতিরোধ করতে পারে যখন অন্য সমস্ত আনন্দের সাথে মুদ্রা দখল করে)) আমাদের কাছে 25 টি কয়েন রয়েছে যখন শিকারের সমুদ্রসীমা 20 রাউন্ড এবং এটির দ্বিগুণ হয়ে প্রতি 20 কয়েন বেড়ে যায়। (অন্য কথায়, কোলডাউনটি হয় )) (আমরা এটি ব্যবহার করি কারণ এন্ডগেমে, সমস্ত শিকারযোগ্য বটগুলি সম্ভবত মৃত, এবং তাই কোনও শিকার খুব সম্ভবত নিরর্থক হয়। এর কারণে, আমরা নষ্ট সময়কে সীমাবদ্ধ করতে চাই । তবে কখনও কখনও, দেরি-খেলায় দেরি করে খাওয়া সবকিছু বদলে দিতে পারে, তাই আমরা সম্ভাবনাটি রেখেছি)
ইউ= - 150 ই- আর।
20(1 + log2(c / 25))
অবশেষে, পুরো আখড়াটি একটি অসীম সম্ভাব্য কূপে স্থাপন করা হয়েছে যা বটকে পালাতে বাধা দেয়।