
जैसा कि आप जानते होंगे कि कल से
Google AI चैलेंज शुरू हो गया था। इस विषय में मैं संक्षेप में बताना चाहता हूं कि कहां से शुरू करना है, कम या ज्यादा विस्तार से वर्णन करें खेल के नियम और एपीआई की सूक्ष्मताएं, जो आधिकारिक दस्तावेज में खोजना मुश्किल या असंभव है। इससे पहले कि आप हैबरकट में आते हैं, मैं दृढ़ता से अनुशंसा करता हूं कि आप, यदि आपने पहले से ऐसा नहीं किया है, तो इस बारे में पढ़ें कि वास्तव में Google AI चैलेंज क्या है। यह, उदाहरण के लिए,
हालब्रतोपिका में किया जा सकता है।
1. नीचे तक पहुँचना
1.1। बॉट के नजरिए से गेमप्ले
सबसे पहले, मैं आपको बताता हूं कि बॉट की सहभागिता और सत्यापन प्रणाली (चेकर) कैसे काम करती है। टूर्नामेंट आयोजकों ने फैसला किया कि इस इंटरैक्शन को व्यवस्थित करने का सबसे अच्छा तरीका प्रत्येक रोबोट को एक अलग प्रक्रिया घोषित करना है, और इसके साथ मानक इनपुट और आउटपुट का उपयोग करके संवाद करना है। हम इस बारे में चर्चा नहीं करेंगे कि यह एक अच्छा निर्णय है या नहीं, लेकिन बस इसे मान लें। यह कैसे लग सकता है के विपरीत खेल, बारी आधारित है। प्रत्येक मोड़ के लिए, बॉट स्टड पर खेल की वर्तमान स्थिति का विवरण प्राप्त करता है। इसमें शामिल हैं:
- मानचित्र पर सभी ग्रहों का वर्णन; प्रत्येक ग्रह के लिए निम्नलिखित ज्ञात है:
- ग्रह की अनूठी आईडी
- इसका कार्तीय निर्देशांक है
- ग्रह के स्वामी की आईडी ( NB: यदि ग्रह तटस्थ है, तो आईडी शून्य है , यदि वह खिलाड़ी का है, तो आईडी एक है )
- ग्रह पर जहाजों की संख्या
- शिप ग्रोथ रेट
- उड़ान में सभी बेड़े का विवरण:
- फ्लीट ओनर आईडी
- बेड़े में जहाजों की संख्या
- जिस ग्रह से उड़ान भर रही है, उसकी आईडी
- जिस ग्रह का बेड़े उड़ान भर रहा है, उसकी आईडी
- कितनी और चालें उड़ेंगी बेड़े ( NB: बेड़े की चालों की संख्या ग्रह A से ग्रह B पर जाने में खर्च होगी, A और B के बीच गोल दूरी पर यूक्लिडियन दूरी के बराबर है)
इसके जवाब में, बॉट स्टैडआउट को आदेशों का एक क्रम लिखता है, और फिर कहता है कि इसने अपनी बारी खत्म कर दी है। केवल एक टीम है: ग्रह
ए से ग्रह
बी तक
एक्स जहाज भेजें
। कृपया ध्यान दें कि यदि ग्रह A आपके पास नहीं है, या ग्रह A या B मौजूद नहीं है, या ग्रह A या X पर X जहाजों की संख्या शून्य से कम है, तो आपको मैच से अयोग्य घोषित कर दिया जाएगा।1.2। रेटिंग कैसे मानी जाती है
आमतौर पर, रेटिंग को किसी तरह से चमकदार माना जाता है। डेवलपर्स के
आश्वासन के अनुसार, यह एक प्रणाली के अनुसार माना जाता है जो पेशेवर शतरंज टूर्नामेंट में उपयोग किया जाता है। वास्तव में, सब कुछ इस तरह दिखता है: जैसे ही कोई खिलाड़ी बॉट का नया संस्करण डाउनलोड करता है, उसकी रेटिंग रीसेट हो जाती है (या शायद नहीं, मुझे अभी भी यह पूरी तरह से समझ में नहीं आया है), कुछ एल्गोरिदम के अनुसार, अन्य प्रतिभागियों के साथ रोबोट की लड़ाई शुरू होती है। एल्गोरिथ्म भ्रामक है और पूरी तरह से स्पष्ट नहीं है। उदाहरण के लिए, मैंने एक नया बॉट अपलोड करने के बाद (जो, सौ में से 97 कार्ड पर मेरे परीक्षणों के अनुसार, अतीत को तोड़ दिया), मेरी रेटिंग कम हो गई। यह मुझे लगता है कि यह प्रतिद्वंद्वी पसंद एल्गोरिदम की चमक या दोष के साथ ठीक से जुड़ा हुआ है: किसी कारण से, मैं लगातार उन लोगों के साथ लड़ता हूं जो मेरे से कम रेटिंग वाले हैं, लेकिन उच्च रेटिंग वाले लोगों के साथ नहीं लड़ते हैं। हालांकि,
रेटिंग बहुत महत्वपूर्ण नहीं है, क्योंकि अंतिम परिणाम इस पर निर्भर नहीं करता है (मुझे खेद है, मैं प्रूफ़लिंक नहीं खोज सकता), और समय दो महीने से अधिक है।
2. व्यवसाय के लिए नीचे उतरना
2.1। पंजीकरण
कहने के लिए कुछ भी विशेष नहीं है, सिवाय इसके कि कई खाते होना असंभव है और यह कि उन्हें बदलना असंभव है, यहां तक कि पासवर्ड भी। यदि आप किसी टीम में खेलना चाहते हैं, तो आपको तुरंत जीवनी में यह इंगित करना होगा।
2.2। स्टार्टर पैकेज को पहचानना
प्रतिभागियों की सुविधा के लिए, आयोजकों ने मुख्य भाषाओं के लिए विशेष स्टार्टर पैकेज बनाए। इन पैकेजों में एक चेकर, एक रिप्ले पहरेदार, कुछ सरल उदाहरण बॉट और अपना बॉट बनाने के लिए एक टेम्पलेट शामिल हैं। आप
यहां से अपनी पसंदीदा भाषा के लिए स्टार्टर किट डाउनलोड कर सकते
हैं । मुझे जावा बहुत पसंद है, और इसलिए मैं इस भाषा के उदाहरण पर बात करना जारी रखूंगा। उन लोगों की खुशी के लिए जो मेरी भावनाओं को साझा नहीं करते हैं, अन्य भाषाओं के लिए सब कुछ अलग है।
आपके द्वारा .zip संग्रह डाउनलोड करने और उसे अपनी पसंद की जगह पर अनज़िप करने के बाद, आपको निम्न फ़ोल्डर संरचना दिखाई देगी:
java_starter_package/ |-- example_bots/ |-- maps/ |-- tools/ |-- Fleet.java |-- MyBot.java |-- Planet.java |-- PlanetWars.java
उदाहरण_बॉट्स फ़ोल्डर में, जैसा कि आप अनुमान लगा सकते हैं, स्रोत कोड के साथ सरल उदाहरण बॉट हैं, और मैप्स फ़ोल्डर में, जैसा कि कोई सुझाव देता है, नक्शे हैं। टूल फ़ोल्डर पहले से ही अधिक दिलचस्प है (वैसे, इसकी सामग्री सभी भाषाओं में स्टार्टर किट के लिए समान है): वहाँ दो जार फाइलें हैं, बिना स्रोत के। पहला एक PlayGame.jar है, जो एक चेकर है। आपको इसे इस तरह उपयोग करने की आवश्यकता है:
java -jar tools/PlayGame.jar maps/map1.txt 1000 1000 log.txt "java -jar my_bots/trunk/MyBot.jar" "java -jar example_bots/ProspectorBot.jar"
बस के मामले में, मैं समझाता हूं: पहला तर्क नक्शे का रास्ता है, दूसरा तर्क मिलीसेकंड में अधिकतम स्ट्रोक की लंबाई है (
हां, समय में कदम सीमित है : यदि कोई भी बॉट बहुत लंबा लगता है, तो यह स्वचालित रूप से खो जाएगा , तीसरा तर्क अधिकतम है। चाल की संख्या। तर्कों में अगला लॉग के लिए फ़ाइल का नाम है, कमांड जिसे आपको पहले बॉट शुरू करने के लिए निष्पादित करने की आवश्यकता है, और दूसरी के लिए कमांड। सिद्धांत रूप में, इंजन बड़ी संख्या में खिलाड़ियों का समर्थन करता है; आप उन्हें कमांड लाइन पर भी निर्दिष्ट कर सकते हैं। हालांकि, एक टूर्नामेंट में सभी मैच आमने-सामने होते हैं।
उपकरण फ़ोल्डर में दूसरी फ़ाइल ShowGame.jar है, जो मैच की कल्पना करती है, जिसके विवरण के लिए उसे मानक इनपुट पर सबमिट करना होगा। यह विशेष रूप से किया जाता है ताकि आप परीक्षक के उत्पादन को सीधे विज़ुअलाइज़र में स्थानांतरित कर सकें:
java -jar tools/PlayGame.jar params | java -jar tools/ShowGame.jar
इसके बाद, रूट * .java फाइलें रहती हैं। फ्लीट.जावा और प्लैनेट.जावा का उद्देश्य स्पष्ट है - उनमें क्रमशः बेड़े और ग्रह का वर्णन करने वाले वर्ग शामिल हैं। PlanetWars वर्ग पहले से ही अधिक सार्थक है: यह पार्स कर सकता है कि चेकर स्टड पर बॉट को क्या भेजता है और परिणाम को अधिक या कम उपयोगकर्ता के अनुकूल तरीके से प्रस्तुत करता है। इंटरफ़ेस (जो, हालांकि, स्पष्ट रूप से इंगित नहीं किया गया है) कुछ इस तरह है:
public interface IPlanetWars { int NumPlanets(); Planet GetPlanet(int planetID); int NumFleets(); Fleet GetFleet(int fleetID); List<Planet> Planets(); List<Fleet> Fleets(); int Distance(int sourcePlanet, int destinationPlanet); void IssueOrder(int sourcePlanet, int destinationPlanet, int numShips); void FinishTurn(); }
मैंने कहा "के बारे में" क्योंकि मैंने बातचीत के तंत्र को समझने के लिए आवश्यक इंटरफ़ेस का केवल मुख्य भाग प्रदान किया; वास्तव में, कुछ और तरीके उपलब्ध हैं, लेकिन वे सुविधा के लिए पहले से ही सबसे अधिक भाग के लिए हैं। वैसे, यह देखते हुए कि जावा कोडिंग कन्वेंशनों से संबंधित कोड कितना कम है, यह अत्यधिक संभावना है कि यह भाषा से भाषा में अर्ध-स्वचालित रूप से अनुवादित किया गया था, और इसलिए उनके बीच बिल्कुल भी अंतर नहीं था।
पहले समीक्षा की गई सभी फाइलें वैकल्पिक हैं। आप उन्हें सुरक्षित रूप से बदल सकते हैं (
वैसे, मैं अत्यधिक अनुशंसा करता हूं: वे उपयोगकर्ता की सुविधा के दृष्टिकोण से लिखे गए हैं बल्कि कमजोर हैं ) या यहां तक कि हटाएं। लेकिन फ़ाइल MyBot.java को हटाया नहीं जा सकता है, और मुख्य विधि भी इसमें होनी चाहिए, क्योंकि इसे परीक्षक द्वारा बुलाया जाएगा। उदाहरण में सभी तर्क DoTurn पद्धति में हैं, जिसमें इनपुट पर PlanetWars वर्ग का एक उदाहरण है।
स्टार्टर पैकेज में कोड कम या ज्यादा शालीनता से टिप्पणी करता है, इसलिए आप आसानी से यह पता लगा सकते हैं कि इसका उपयोग कैसे करें और अपना पहला सरल बॉट लिखें।
मैं सिर्फ यह कहना चाहता हूं कि धाराओं को बनाने और किसी फाइल पर लिखने की अनुमति नहीं है।2.3। समाधान प्रस्तुत करें
समाधान भेजने के लिए, आपको सभी (सभी!) स्रोत (!) फ़ाइलों की आवश्यकता होती है जो आपके बॉट को संकलन करने के लिए आवश्यक हैं, उन्हें ज़िप संग्रह में पैक करें, और
इस लिंक का उपयोग करके उन्हें डाउनलोड करें। कृपया ध्यान दें कि संग्रह का आकार दो मेगाबाइट से अधिक नहीं होना चाहिए। यद्यपि, आप निश्चित रूप से, इतना कोड लिखने की संभावना नहीं है;)। कुछ समय बाद, आपको मेल में एक पत्र प्राप्त होगा जिसमें संकलन स्क्रिप्ट आपके काम का परिणाम आपके साथ साझा करेगी। यदि सब कुछ ठीक रहा, तो पाठ कुछ इस तरह होगा:
यह आपको केवल यह बताने के लिए है कि Google AI चैलेंज में आपके नवीनतम सबमिशन सफलतापूर्वक संकलित किए गए हैं। यदि आप जिज्ञासु हैं, तो संकलित स्क्रिप्ट का आउटपुट यहां दिया गया है:
मिली प्रविष्टि। ज़िप अनपैक करने का प्रयास कर रहा है।
unzip -u entry.zip > /dev/null 2> /dev/null
मिली MyBot.java। इस प्रविष्टि को जावा के रूप में संकलित करना
javac Bot.java Fleet.java MyBot.java Planet.java PlanetWars.java SimpleBot.java jar cfe MyBot.jar MyBot Bot.class PlanetWars.class Planet.class Fleet.class MyBot.class SimpleBot$1.class SimpleBot.class
निष्ठा से,
संकलित लिपि
उसके कुछ समय बाद, एक नोट बताते हुए कि आपने बॉट भेजा है, आपके व्यक्तिगत खाते में दिखाई देगा:

और कुछ समय के बाद, आपका दिमाग़ बाकी बॉट्स के साथ बहादुरी से लड़ना शुरू कर देगा:

इस तरह की प्रत्येक लड़ाई को दाईं ओर "व्यू गेम" लिंक पर क्लिक करके देखा जा सकता है। आप अपनी रेटिंग या तो
वर्तमान रैंकिंग अनुभाग में, या अपनी प्रोफ़ाइल में देख सकते हैं।
मैं यह भी जोड़ना चाहता हूं कि आपको बॉट को तुरंत नहीं भेजना चाहिए, पहले इसे अलग-अलग कार्डों पर खुद पर परीक्षण करना अधिक उचित है। ऐसा करने के लिए, स्थानीय कारीगरों (आपके विनम्र सेवक सहित) ने एक स्क्रिप्ट बनाई जो स्वचालित रूप से सभी कार्ड और उदाहरणों से सभी बॉट (और आपके अन्य बॉट, यदि कोई हो) पर बॉट चलाता है और जीत पर आंकड़े देता है। आप इस स्क्रिप्ट को
यहां ले जा सकते हैं।
वह सब है। मुझे सवालों, स्पष्टीकरणों और सुधारों की खुशी होगी।
खूनी लड़ाई और आपके लिए मीठे सपने! ©
UPD: अफसोस की बात है कि प्रतियोगिता स्थल है। पीड़ितों के लिए, मैंने
इस टिप्पणी में बॉट्स के परीक्षण के लिए लिपियों के लिंक दिए हैं। जावा के लिए स्टार्टर पैकेज को
यहां डाउनलोड किया जा सकता
है । यदि कोई अन्य भाषाओं के लिए स्टार्टर किट से लिंक साझा करता है, तो यह अच्छा होगा! ;)
UPD2: उठाया, लेकिन अभी तक आंशिक रूप से। वे सप्ताहांत के अंत तक सब कुछ ठीक करने का वादा करते हैं। वैसे, अब प्रतियोगिता
पूरी तरह से खुली हो गई है!