यह पाक्षिक चुनौती # 3 है। थीम: जेनेटिक एल्गोरिदम
यह चुनौती थोड़ी प्रयोग की है। हम देखना चाहते थे कि आनुवंशिक एल्गोरिदम के साथ हम क्या कर सकते हैं, चुनौती दे सकते हैं। सब कुछ इष्टतम नहीं हो सकता है, लेकिन हमने इसे सुलभ बनाने की पूरी कोशिश की। अगर यह काम करता है, जो जानता है कि हम भविष्य में क्या देख सकते हैं। शायद पहाड़ी के एक आनुवंशिक राजा?
युक्ति काफी लंबी है! हमने द बेसिक्स में युक्ति को अलग करने की कोशिश की है - नंगे न्यूनतम जिसे आपको फ्रेमवर्क के साथ खेलना शुरू करने और उत्तर प्रस्तुत करने की आवश्यकता है - और द गोरी विवरण - पूर्ण युक्ति, नियंत्रक के बारे में सभी विवरणों के साथ, जिसके आधार पर आप अपना लिख सकता था।
यदि आपके कोई प्रश्न हैं, तो हमसे चैट में शामिल होने के लिए स्वतंत्र महसूस करें !
आप व्यवहार मनोविज्ञान में एक शोधकर्ता हैं। यह शुक्रवार की शाम है और आप और आपके सहकर्मी थोड़ी मस्ती करने और थोड़ी चूहा दौड़ के लिए अपने लैब चूहों का उपयोग करने का निर्णय लेते हैं। वास्तव में, इससे पहले कि हम उनके साथ भावनात्मक रूप से जुड़ जाएं, हम उन्हें नमूना कहते हैं ।
आपने नमूनों के लिए थोड़ा रेस ट्रैक स्थापित किया है, और इसे और अधिक दिलचस्प बनाने के लिए, आपने ट्रैक के पार कुछ दीवारें और जाल और टेलीपोर्टर्स लगाए हैं। अब, आपके नमूने अभी भी चूहों हैं ... उन्हें कोई पता नहीं है कि एक जाल या एक टेलीफ़ोनर क्या है। वे सभी देखते हैं कि विभिन्न रंगों में कुछ चीजें हैं। उनके पास किसी भी प्रकार की मेमोरी नहीं है - वे जो भी कर सकते हैं वे अपने वर्तमान परिवेश के आधार पर निर्णय ले सकते हैं। मुझे लगता है कि प्राकृतिक चयन उन नमूनों को बाहर निकाल देगा जो जानते हैं कि उन लोगों के जाल से कैसे बचें (यह दौड़ थोड़ी देर तक नहीं होती है ...)। खेल शुरू किया जाय! †
इस चुनौती के निर्माण में the४,४६५ नमूनों को नुकसान पहुंचाया गया था।
मूल बातें
यह एक एकल-खिलाड़ी गेम है (आप और आपके सहकर्मी आबादी को मिलाना नहीं चाहते थे, इसलिए हर एक ने अपना रेस ट्रैक बनाया)। रेस ट्रैक एक आयताकार ग्रिड, 15 सेल लंबा और 50 सेल चौड़ा है। आप बाएं किनारे पर यादृच्छिक (आवश्यक रूप से अलग नहीं) कोशिकाओं पर 15 नमूनों से शुरू करते हैं (जहां x = 0 )। आपके नमूनों को लक्ष्य तक पहुंचने का प्रयास करना चाहिए जो कि x 0 49 और 0 ≤ y ( 14 पर कोई भी सेल है (नमूने सही करने के लिए ट्रैक का निरीक्षण कर सकते हैं)। हर बार ऐसा होता है, आपको एक बिंदु मिलता है। आप 1 अंक के साथ खेल भी शुरू करते हैं। आपको 10,000 मोड़ के बाद अपने बिंदुओं को अधिकतम करने की कोशिश करनी चाहिए ।
कई नमूने एक ही सेल पर कब्जा कर सकते हैं और बातचीत नहीं करेंगे।
प्रत्येक मोड़ पर, प्रत्येक नमूना अपने आस-पास (केंद्र में) के साथ 5x5 ग्रिड देखता है। उस ग्रिड के प्रत्येक सेल में एक रंग -1
होगा 15
। -1
उन कोशिकाओं का प्रतिनिधित्व करता है जो सीमा से बाहर हैं। यदि यह सीमा से बाहर चला जाता है तो आपका नमूना मर जाता है। अन्य रंगों के लिए, वे खाली कोशिकाओं, जाल, दीवारों और टेलीपोर्टर्स का प्रतिनिधित्व करते हैं। लेकिन आपका नमूना यह नहीं जानता कि कौन सा रंग क्या दर्शाता है और न ही आप। हालांकि कुछ अड़चनें हैं:
- 8 रंग खाली कोशिकाओं का प्रतिनिधित्व करेंगे।
- 4 रंग एक रिपोर्टर का प्रतिनिधित्व करेंगे। एक टेलीफ़ोनर अपने 9x9 पड़ोस में एक निश्चित सेल को नमूना भेजेगा। यह ऑफसेट एक ही रंग के सभी टेलीपोर्टर्स के लिए समान होगा।
- 2 रंग दीवारों का प्रतिनिधित्व करेंगे। एक दीवार में ले जाना अभी भी खड़ा है।
- 2 रंग एक जाल का प्रतिनिधित्व करेंगे। एक जाल इंगित करता है कि एक इसके तत्काल पड़ोस में 9 कोशिकाओं के घातक (जरूरी नहीं जाल में ही सेल) है। यह ऑफसेट एक ही रंग के सभी जाल के लिए समान होगा।
अब, उस प्राकृतिक चयन के बारे में ... प्रत्येक नमूने में एक जीनोम है, जो 100 बिट्स के साथ एक संख्या है । नए नमूनों को दो मौजूदा नमूनों को पार करके बनाया जाएगा, और फिर जीनोम को थोड़ा बदल दिया जाएगा। एक नमूना जितना सफल होता है, उतना ही बड़ा होता है प्रजनन का मौका।
इसलिए यहां आपका काम है: आप एक एकल फ़ंक्शन लिखेंगे, जो एक नमूना देखता है कि रंगों के 5x5 ग्रिड के इनपुट के रूप में प्राप्त करता है, साथ ही इसके जीनोम भी। आपका फ़ंक्शन नमूने के लिए एक चाल (Δx, )y) लौटाएगा, जहां andx और bey प्रत्येक में से एक होगा {-1, 0, 1}
। आपको फ़ंक्शन कॉल के बीच किसी भी डेटा को जारी नहीं रखना चाहिए। इसमें आपके अपने यादृच्छिक संख्या जनरेटर का उपयोग करना शामिल है। आपका फ़ंक्शन एक वरीयता प्राप्त RNG के साथ प्रदान किया जाएगा जिसे आप अपनी इच्छानुसार उपयोग करने के लिए स्वतंत्र हैं।
आपके सबमिशन का स्कोर 50 रैंडम ट्रैक्स में अंकों की संख्या का ज्यामितीय माध्य होगा । हमने पाया है कि यह स्कोर काफी हद तक भिन्नता के अधीन है। इसलिए, ये स्कोर प्रारंभिक होंगे । एक बार जब यह चुनौती समाप्त हो जाती है, तो एक समय सीमा की घोषणा की जाएगी। समय सीमा के अंत में, 100 बोर्डों को यादृच्छिक पर चुना जाएगा, और इन 100 बोर्डों पर सभी प्रस्तुतियाँ फिर से शुरू की जाएंगी। बेझिझक अपने जवाब में एक अनुमानित स्कोर डाल सकते हैं, लेकिन हम किसी को भी धोखा नहीं देने के लिए खुद को प्रस्तुत करेंगे।
हमने मुट्ठी भर भाषाओं में नियंत्रक कार्यक्रम प्रदान किए हैं। वर्तमान में, आप पायथन (2 या 3), रूबी , सी ++ , सी # या जावा में अपना सबमिशन लिख सकते हैं । नियंत्रक बोर्ड उत्पन्न करता है, खेल चलाता है और आनुवंशिक एल्गोरिथ्म के लिए एक रूपरेखा प्रदान करता है। आपको बस इतना करना है कि चल समारोह प्रदान करना है।
रुको, तो मैं वास्तव में जीनोम के साथ क्या करता हूं?
चुनौती यह पता लगाने की है कि!
चूंकि नमूनों की कोई स्मृति नहीं है, इसलिए आपको दिए गए मोड़ में 5x5 ग्रिड का एक रंग है जो आपके लिए कुछ भी मायने नहीं रखता है। तो आपको लक्ष्य तक पहुंचने के लिए जीनोम का उपयोग करना होगा। सामान्य विचार यह है कि आप रंगों या ग्रिड लेआउट के बारे में जानकारी संग्रहीत करने के लिए जीनोम के कुछ हिस्सों का उपयोग करते हैं, और आपका बॉट जीनोम में संग्रहीत अतिरिक्त जानकारी पर अपने निर्णयों को आधार बनाता है।
अब, निश्चित रूप से आप वास्तव में वहां कुछ भी स्टोर नहीं कर सकते हैं। तो वहाँ संग्रहीत वास्तविक जानकारी शुरू में पूरी तरह से यादृच्छिक होगी। लेकिन आनुवंशिक एल्गोरिथम जल्द ही उन नमूनों का चयन करेगा जिनके जीनोम में सही जानकारी होती है, जबकि गलत जानकारी होती है। आपका लक्ष्य जीनोम बिट्स और आपके क्षेत्र के दृश्य को एक चाल से मैप करना है, जो आपको लक्ष्य के लिए एक रास्ता खोजने की अनुमति देता है और जो लगातार जीतने की रणनीति के लिए विकसित होता है।
आपको आरंभ करने के लिए यह पर्याप्त जानकारी होनी चाहिए। यदि आप चाहें, तो आप अगले अनुभाग को छोड़ सकते हैं, और नीचे नियंत्रक की सूची से अपनी पसंद के नियंत्रक का चयन कर सकते हैं (जिसमें उस विशेष नियंत्रक का उपयोग करने के तरीके के बारे में जानकारी भी शामिल है)।
आगे पढ़िए अगर आप सभी चाहते हैं ...
द गोरी डिटेल्स
यह विनिर्देशन पूर्ण है। सभी नियंत्रकों को इन नियमों को लागू करना होगा।
सभी यादृच्छिकता एक समान वितरण का उपयोग करती है, जब तक कि अन्यथा न कहा जाए।
ट्रैक पीढ़ी:
- ट्रैक एक आयताकार ग्रिड है, एक्स = 53 सेल चौड़ा और वाई = 15 सेल लंबा। साथ कोशिकाओं एक्स ≥ 49 हैं लक्ष्य कोशिकाओं (जहां एक्स शून्य पर आधारित)।
- प्रत्येक कोशिका का एक ही रंग होता है और घातक हो सकता है या नहीं हो सकता है - कोशिकाएं तब तक घातक नहीं होती हैं जब तक कि नीचे दिए गए सेल प्रकारों में से एक द्वारा निर्दिष्ट नहीं किया जाता है।
- कर रहे हैं 16 अलग सेल रंग, से लेबल
0
करने के लिए15
, जिसका अर्थ खेल से खेल के लिए बदल जाएगा। इसके अलावा, उन-1
कोशिकाओं का प्रतिनिधित्व करता है जो सीमा से बाहर हैं - ये घातक हैं । - 8 यादृच्छिक रंग चुनें । ये खाली कोशिकाएँ होंगी (जिनका कोई प्रभाव नहीं होगा)।
- 4 और यादृच्छिक रंग चुनें । ये टेलीपोर्टर्स हैं। इन रंगों में से दो के लिए, 9x9 पड़ोस (-4 (-4, -4) से (4,4) को छोड़कर (0,0) में एक गैर-शून्य ऑफसेट चुनें । अन्य दो रंगों के लिए, उन ऑफसेट का उलटा करें। यदि एक टेलीफ़ोन पर एक नमूना कदम है तो इसे तुरंत उस ऑफसेट द्वारा स्थानांतरित कर दिया जाता है।
- 2 और यादृच्छिक रंग चुनें । ये जाल हैं। इन रंगों में से प्रत्येक के लिए, 3x3 पड़ोस ((-1, -1) से (1,1) में ऑफसेट चुनें। एक जाल इंगित करता है कि उस ऑफसेट पर सेल घातक है । नोट: ट्रैप सेल स्वयं ही घातक नहीं है।
- 2 शेष रंग की दीवारों, जो आंदोलन में बाधा हैं। एक दीवार सेल पर स्थानांतरित करने का प्रयास अभी भी रहने में कदम को बदल देगा। स्वयं दीवार कोशिकाएं घातक होती हैं ।
- ग्रिड के प्रत्येक गैर-लक्ष्य सेल के लिए, एक यादृच्छिक रंग चुनें। प्रत्येक लक्ष्य सेल के लिए एक यादृच्छिक खाली रंग चुनें।
- ट्रैक के बाएं किनारे पर प्रत्येक सेल के लिए, निर्धारित करें कि क्या लक्ष्य 100 मोड़ ( नीचे के आदेश के नियमों के अनुसार) तक पहुंच सकता है । यदि हां, तो यह सेल एक स्वीकार्य प्रारंभिक सेल है । यदि 10 से कम शुरुआती सेल हैं, तो ट्रैक को छोड़ दें और एक नया निर्माण करें।
- एक यादृच्छिक जीनोम और उम्र 0 के साथ प्रत्येक 15 नमूने बनाएँ । प्रत्येक नमूने को एक यादृच्छिक शुरुआती सेल पर रखें।
टर्न ऑर्डर:
- प्रत्येक नमूने के लिए, निम्न चरणों का पालन किया जाएगा। नमूने एक-दूसरे से बातचीत नहीं करते या देखते नहीं हैं, और एक ही सेल पर कब्जा कर सकते हैं।
- यदि नमूने की आयु 100 वर्ष है , तो यह मर जाता है। अन्यथा, इसकी उम्र 1 से बढ़ाएँ।
- नमूना को अपना दृश्य क्षेत्र दिया गया है - 5x5 ग्रिड का रंग, नमूना पर केंद्रित - और अपने 3x3 पड़ोस में एक चाल देता है। इस सीमा के बाहर ले जाने से नियंत्रक समाप्त हो जाएगा।
- यदि लक्ष्य सेल एक दीवार है, तो चाल को (0,0) में बदल दिया जाता है।
- यदि लक्ष्य सेल एक टेलीफ़ोनर है, तो टेलीफ़ोन ऑफ़सेट द्वारा नमूना ले जाया जाता है। नोट: यह चरण एक बार किया जाता है , पुनरावृति से नहीं।
- यदि वर्तमान में नमूना द्वारा कब्जा कर लिया गया सेल (संभावित रूप से एक टेलीफ़ोन का उपयोग करने के बाद) घातक हो जाता है। यह एकमात्र समय का नमूना है जो मर जाता है (चरण 1.1 के अलावा। ऊपर)। विशेष रूप से, एक नया नमूना जो एक घातक कोशिका पर फैलता है, तुरंत नहीं मर जाएगा, लेकिन पहले खतरनाक तरीके से आगे बढ़ने का मौका है।
- यदि नमूना एक गोल सेल पर कब्जा कर लेता है, तो एक बिंदु स्कोर करता है, नमूना को एक यादृच्छिक प्रारंभिक सेल में स्थानांतरित करें और इसकी आयु 0 पर रीसेट करें।
- यदि बोर्ड पर दो से कम नमूने बचे हैं, तो खेल समाप्त हो जाता है।
- 0 उम्र के साथ 10 नए नमूने बनाएं । प्रत्येक जीनोम को (व्यक्तिगत रूप से) नीचे दिए गए प्रजनन नियमों द्वारा निर्धारित किया जाता है। प्रत्येक नमूने को एक यादृच्छिक शुरुआती सेल पर रखें।
प्रजनन:
जब एक नया नमूना बनाया जाता है, तो यादृच्छिक पर दो अलग - अलग माता - पिता चुनें , नमूनों के प्रति पूर्वाग्रह के साथ जो आगे दाईं ओर बढ़े हैं। चुने जाने वाले नमूने की संभावना उसके वर्तमान फिटनेस स्कोर के समानुपाती होती है । एक नमूना फिटनेस स्कोर है
1 + x + 50 * कई बार यह लक्ष्य तक पहुंच गया
जहाँ x 0-आधारित क्षैतिज सूचकांक है। एक ही बारी में बनाए गए नमूनों को माता-पिता के रूप में नहीं चुना जा सकता है।
दो माता-पिता में से, पहले जीनोम बिट से लेने के लिए एक यादृच्छिक एक चुनें।
- अब जब आप जीनोम के साथ चलते हैं, तो माता-पिता को 0.05 की संभावना के साथ स्विच करें , और परिणामस्वरूप माता-पिता से बिट्स लेते रहें।
- पूरी तरह से इकट्ठे जीनोम को म्यूट करें: प्रत्येक बिट के लिए, इसे संभाव्यता 0.01 के साथ फ्लिप करें ।
स्कोरिंग:
- एक खेल 10,000 मोड़ तक रहता है।
- खिलाड़ी 1 अंक के साथ खेल शुरू करते हैं (ज्यामितीय माध्य के उपयोग की अनुमति देने के लिए)।
- हर बार जब कोई खिलाड़ी लक्ष्य तक पहुंचता है, तो खिलाड़ी एक अंक प्राप्त करता है।
- अभी के लिए, प्रत्येक खिलाड़ी के सबमिशन को 50 गेमों के लिए चलाया जाएगा , प्रत्येक को एक अलग यादृच्छिक ट्रैक के साथ।
- उपर्युक्त दृष्टिकोण परिणाम से अधिक विचरण में वांछनीय है। एक बार जब यह चुनौती समाप्त हो जाती है, तो एक समय सीमा की घोषणा की जाएगी। समय सीमा के अंत में, 100 बोर्डों को यादृच्छिक पर चुना जाएगा, और इन 100 बोर्डों पर सभी प्रस्तुतियाँ फिर से शुरू की जाएंगी।
- एक खिलाड़ी का कुल स्कोर इन व्यक्तिगत खेलों के अंकों का ज्यामितीय माध्य होता है।
द कंट्रोलर
आप निम्न में से कोई भी नियंत्रक चुन सकते हैं (क्योंकि वे कार्यात्मक रूप से समतुल्य हैं)। हमने उन सभी का परीक्षण किया है, लेकिन यदि आप बग को स्पॉट करते हैं, तो कोड या प्रदर्शन में सुधार करना चाहते हैं, या ग्राफिकल आउटपुट जैसी सुविधा जोड़ना चाहते हैं, तो कृपया एक मुद्दा भेजें या GitHub पर एक पुल अनुरोध भेजें! दूसरी भाषा में एक नया नियंत्रक जोड़ने के लिए भी आपका स्वागत है!
GitHub पर सही निर्देशिका के लिए प्रत्येक नियंत्रक के लिए भाषा नाम पर क्लिक करें, जिसमें README.md
सटीक उपयोग निर्देश हैं।
यदि आप git और / या GitHub से परिचित नहीं हैं, तो आप पूरे रिपॉजिटरी को फ्रंट पेज से जिप के रूप में डाउनलोड कर सकते हैं (साइडबार में बटन देखें)।
अजगर
- सबसे अच्छी तरह से परीक्षण किया। यह हमारा संदर्भ कार्यान्वयन है।
- दोनों पायथन 2.6+ और पायथन 3.2+ के साथ काम करता है!
- यह बहुत धीमा है। हम इसे पर्याप्त गति के लिए PyPy के साथ चलाने की सलाह देते हैं ।
pygame
या तो का उपयोग कर चित्रमय उत्पादन का समर्थन करता है याtkinter
।
माणिक
- रूबी 2.0.0 के साथ परीक्षण किया गया। नए संस्करणों के साथ काम करना चाहिए।
- यह भी काफी धीमा है, लेकिन रूबी प्रस्तुत करने के लिए एक विचार के प्रोटोटाइप के लिए सुविधाजनक हो सकता है।
सी ++
- C ++ 11 की आवश्यकता है।
- वैकल्पिक रूप से मल्टीथ्रेडिंग का समर्थन करता है।
- अब तक गुच्छा में सबसे तेज नियंत्रक।
सी#
- LINQ का उपयोग करता है, इसलिए इसे .NET 3.5 की आवश्यकता होती है।
- बल्कि धीमी।
जावा
- विशेष रूप से धीमा नहीं है। विशेष रूप से तेज नहीं है।
प्रारंभिक लीडरबोर्ड
सभी स्कोर प्रारंभिक हैं। फिर भी, अगर कुछ गलत है या पुराना है, तो कृपया मुझे बताएं। हमारा उदाहरण प्रस्तुत करना तुलना के लिए सूचीबद्ध है, लेकिन विवाद में नहीं।
Score | # Games | User | Language | Bot
===================================================================================
2914.13 | 2000 | kuroi neko | C++ | Hard Believers
1817.05097| 1000 | TheBestOne | Java | Running Star
1009.72 | 2000 | kuroi neko | C++ | Blind faith
782.18 | 2000 | MT0 | C++ | Cautious Specimens
428.38 | | user2487951 | Python | NeighborsOfNeighbors
145.35 | 2000 | Wouter ibens | C++ | Triple Score
133.2 | | Anton | C++ | StarPlayer
122.92 | | Dominik Müller | Python | SkyWalker
89.90 | | aschmack | C++ | LookAheadPlayer
74.7 | | bitpwner | C++ | ColorFarSeeker
70.98 | 2000 | Ceribia | C++ | WallGuesser
50.35 | | feersum | C++ | Run-Bonus Player
35.85 | | Zgarb | C++ | Pathfinder
(34.45) | 5000 | Martin Büttner | <all> | ColorScorePlayer
9.77 | | DenDenDo | C++ | SlowAndSteady
3.7 | | flawr | Java | IAmARobotPlayer
1.9 | | trichoplax | Python | Bishop
1.04 | 2000 | fluffy | C++ | Gray-Color Lookahead
क्रेडिट
यह चुनौती एक बड़ा सहयोगी प्रयास था:
- नाथन मेरिल: पाइथन एंड जावा कंट्रोलर्स लिखा। एक चूहे की दौड़ में एक राजा के हिल से चुनौती की अवधारणा को बदल दिया।
- ट्राइकोप्लेक्स: प्लेटिंग। पायथन नियंत्रक पर काम किया।
- feersum: C ++ कंट्रोलर लिखा।
- विजुअलमेलन: सी # कंट्रोलर लिखा।
- मार्टिन ब्यूटनर: अवधारणा। रूबी कंट्रोलर लिखा। Playtesting। पायथन नियंत्रक पर काम किया।
- टी अब्राहम: प्लेटिंग। पायथन का परीक्षण किया और C # और C ++ नियंत्रक की समीक्षा की।
उपरोक्त सभी उपयोगकर्ताओं (और शायद एक जोड़ी जिसे मैं भूल गया था) ने चुनौती के समग्र डिजाइन में योगदान दिया है।
सी ++ नियंत्रक अद्यतन
यदि आप विजुअल स्टूडियो के साथ C ++ का उपयोग कर रहे हैं और मल्टीथ्रेडिंग कर रहे हैं, तो आपको उनके यादृच्छिक संख्या जनरेटर सीडिंग के साथ बग के कारण नवीनतम अपडेट प्राप्त करना चाहिए जो डुप्लिकेट बोर्डों को उत्पादित करने की अनुमति देता है।
'In particular, a new specimen which spawns on a lethal cell will not die immediately, but has a chance to move off the dangerous cell first.'