बॉम्बरमैन के लिए न्यूनतम


11

मैं बॉम्बरमैन गेम का क्लोन विकसित कर रहा हूं और विभिन्न प्रकार के एआई के साथ प्रयोग कर रहा हूं। पहले मैंने A * के साथ राज्य स्थान की खोज की और अब मैं मिनिमैक्स एल्गोरिथ्म के साथ अलग दृष्टिकोण की कोशिश करना चाहता हूं। मेरी समस्या यह है कि हर न्यूनतम लेख मैंने पाया कि खिलाड़ियों को वैकल्पिक। लेकिन बॉम्बरमैन में, प्रत्येक खिलाड़ी एक ही समय में कुछ कार्रवाई करता है। मुझे लगता है कि मैं एक गेम टिक के लिए सभी संभावित राज्यों को उत्पन्न कर सकता हूं, लेकिन चार खिलाड़ियों और 5 बुनियादी कार्यों (4 चाल और बम जगह) के साथ यह खेल के पेड़ के पहले स्तर पर 5 ^ 4 राज्य देता है। यह मान हर अगले स्तर के साथ तेजी से बढ़ेगा। क्या मैं कुछ भूल रहा हूँ? क्या इसे लागू करने के कोई तरीके हैं या क्या मुझे पूरी तरह से अलग एल्गोरिथ्म का उपयोग करना चाहिए? किसी भी सुझाव के लिए धन्यवाद


1
हालांकि यह थोड़ा हटकर विषय है, मुझे एआई के साथ एक चीज पसंद है जो एआई के लिए लक्ष्य या व्यक्तित्व का उपयोग करता है। यह होर्ड पावर अप, गैर-आक्रामक, बदला लेने की कोशिश, भीड़, आदि जैसी चीजें हो सकती हैं, जैसे लक्ष्य के साथ आप मोटे तौर पर बता सकते हैं कि आपको किस दिशा में आगे बढ़ना चाहिए और केवल एक बम गिराएं यदि यह लक्ष्य के लिए आपकी प्रगति को आगे बढ़ाता है (यदि यह उचित रूप से एक ऐसे खिलाड़ी के करीब है जिसे आप शिकार कर रहे हैं या एक ब्लॉक जिसे आप नष्ट करना चाहते हैं)।
बेंजामिन डेंजरस जॉनसन

2
हां, आप कुछ चीजें याद कर रहे हैं, लेकिन आप मुझे उन्हें इंगित करने के लिए धन्यवाद नहीं देंगे क्योंकि वे इसे बदतर बनाते हैं। 5 बुनियादी क्रियाएं नहीं हैं। कुछ वर्गों में 5 "चालें" (4 दिशाएं और अभी भी रहती हैं) हैं; दूसरों के पास 3 हैं (क्योंकि वे दो दिशाओं में अवरुद्ध हैं); औसतन यह 4. है। लेकिन आप दौड़ते समय बम गिरा सकते हैं , इसलिए औसतन ब्रांचिंग फैक्टर 8. है और हाई-स्पीड पॉवरअप वाला व्यक्ति अधिक चाल में फिट हो सकता है, प्रभावी रूप से अपने ब्रांचिंग कारक को धक्का दे सकता है।
पीटर टेलर

मैंने आपको अपने प्रश्न का उत्तर मोंटे कार्लो वृक्ष खोज का उपयोग करके दिया।
SDwarfs

मिनिमैक्स केवल ऐसी स्थिति में उपयोगी नहीं है, जिसमें बॉम्बरमैन जितने विकल्प हों। आप यह देखने के लिए काफी दूर जाने से पहले खोज करने की अपनी क्षमता को समाप्त कर देंगे कि कोई चाल समझदार है या नहीं।
लोरेन Pechtel

जवाबों:


8

रियल-टाइम स्ट्रेटेजी गेम्स जैसे बॉम्बर मैन का AI के साथ मुश्किल समय है। आप चाहते हैं कि यह बुद्धिमान हो, लेकिन एक ही समय में यह सही नहीं हो सकता।

यदि AI सही है, तो आपके खिलाड़ी निराश हो जाएंगे। या तो क्योंकि वे हमेशा खो देते हैं या आप प्राप्त करते हैं। प्रति सेकंड 3 फ्रेम।

यदि यह पर्याप्त बुद्धिमान नहीं है, तो आपके खिलाड़ी ऊब जाएंगे।

मेरी सिफारिश दो एआई कार्य करने की है, एक यह निर्धारित करता है कि एआई कहां जाता है, दूसरा यह निर्धारित करता है कि बम गिराने के लिए सबसे अच्छा कब है। आप आंदोलन की भविष्यवाणी जैसी चीजों का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि क्या दुश्मन उस स्थान की ओर बढ़ रहा है जो खतरनाक होगा यदि बम को वर्तमान स्थान पर गिरा दिया जाता है।

कठिनाई के आधार पर आप इन कार्यों को सुधारने या कठिनाई को कम करने के लिए संशोधित कर सकते हैं।


2
समय, निराशा और ऊब समस्या नहीं है। मैं बॉम्बरमैन में विभिन्न एआई दृष्टिकोण और उनकी तुलना के बारे में स्नातक थीसिस लिख रहा हूं। तो अगर यह अपने बेहतर सही है। मैं अभी उस न्यूनतम के साथ फंस गया हूं
बिल्ला

1
मिनिमैक्स अल्गोरिथम में आपके सामने जो समस्या आने वाली है वह प्रसंस्करण समय है। आपको सभी शत्रु कार्यों पर नज़र रखने और उनकी खेल शैली और अपनी काउंटर शैली का निर्धारण करने की आवश्यकता होगी। ऐसा लगता है जैसे आप पहले से ही इसके बारे में जानते हैं, लेकिन यह गेम को धीमा किए बिना रियल टाइम गेम के लिए काफी चुनौतीपूर्ण काम हो सकता है। एक नाटक के पेड़ के निर्माण के बजाय, आपको वास्तविक समय में अपने कार्यों को निर्धारित करने की आवश्यकता होगी, हो सकता है कि एक मशीन लर्निंग एल्गोरिदम का निर्माण करें जो बेहतर होता है और अधिक खेलता है?
अंडरस्कोरजेरो

4

जैसा कि आपने देखा है, बॉम्बरमैन टर्न-आधारित गेम के रूप में अनुकरण करने के लिए बहुत अधिक जटिल है। किसी भी संभावित निर्णय को लागू करना और हर दूसरे खिलाड़ी के हर संभव निर्णय को बस काम नहीं करना है।

इसके बजाय आपको अधिक रणनीतिक दृष्टिकोण का उपयोग करना चाहिए।

आपको खुद से पूछना चाहिए: एक मानव खिलाड़ी बॉम्बरमैन की भूमिका निभाते हुए कैसे निर्णय लेता है? आमतौर पर, एक खिलाड़ी को चार बुनियादी प्राथमिकताओं का पालन करना चाहिए:

  1. बम विस्फोट क्षेत्रों से बचें
  2. बम रखें ताकि अन्य लोग अपने विस्फोट क्षेत्रों से बच न सकें
  3. पॉवरअप इकट्ठा करें
  4. चट्टानों को उड़ाने के लिए बम रखें

पहली प्राथमिकता "खतरे का नक्शा" बनाकर पूरी की जा सकती है। जब एक बम रखा जाता है, तो उसके द्वारा कवर की गई सभी टाइलों को "खतरनाक" के रूप में चिह्नित किया जाना चाहिए। जितनी जल्दी बम विस्फोट होगा (श्रृंखला प्रतिक्रियाओं को ध्यान में रखें!), खतरे का स्तर जितना अधिक होगा। जब भी एआई ने नोटिस किया कि यह एक उच्च खतरे वाले क्षेत्र पर है, तो इसे दूर जाना चाहिए। जब यह एक उच्च खतरे के स्तर के साथ एक पथ (जो भी कारण के लिए) खेतों को टाल देता है (उन्हें कृत्रिम रूप से उच्च पथ लागत जोड़कर लागू किया जा सकता है)।

एआई को बेवकूफ फैसलों से बचाने के लिए खतरे के नक्शे की गणना को और बढ़ाया जा सकता है (जैसे उन क्षेत्रों में प्रवेश करना जो किसी अन्य खिलाड़ी के पास होने से बचना मुश्किल है)।

यह पहले से ही एक उचित रक्षात्मक AI बनाना चाहिए। तो अपराध के बारे में क्या?

जब एआई को पता चलता है कि यह अभी उचित रूप से सुरक्षित है, तो उसे आक्रामक युद्धाभ्यास की योजना बनानी चाहिए: इस पर विचार करना चाहिए कि यह कैसे खुद को बम रखकर अन्य खिलाड़ियों के आसपास खतरे के नक्शे को बढ़ा सकता है। बम प्लांट करने के लिए स्थान का चयन करते समय, इसे नजदीकी स्थानों को पसंद करना चाहिए ताकि इसे अब तक स्थानांतरित न करना पड़े। यह भी बम स्थानों अवहेलना करना चाहिए जब परिणामस्वरूप खतरे का नक्शा एक उचित भागने के मार्ग के लिए अनुमति नहीं देता है।


इसे खेलने के साथ मेरा सीमित अनुभव यह है कि आमतौर पर एक सक्षम प्रतिद्वंद्वी को मारने के लिए आपको कई बम लगाने पड़ते हैं - इस पर विचार करने के लिए एक रणनीति की आवश्यकता होती है। मैंने लगभग अपनी रणनीति के साथ AI के खिलाफ खेला है, वे आपको मारने में काफी अप्रभावी हैं जब तक कि आप इसे प्राप्त नहीं कर सकते।
लोरेन Pechtel

4

मुझे लगता है कि मैं एक गेम टिक के लिए सभी संभावित राज्यों को उत्पन्न कर सकता हूं, लेकिन चार खिलाड़ियों और 5 बुनियादी कार्यों (4 चाल और बम जगह) के साथ यह खेल के पेड़ के पहले स्तर पर 5 ^ 4 राज्य देता है।

सही बात! आपको प्रत्येक गेम टिक के लिए सभी 5 ^ 4 (या यहां तक ​​कि 6 ^ 4) की खोज करने की आवश्यकता है, क्योंकि आप 4 दिशाओं में चल सकते हैं, रुक सकते हैं और "एक बम डाल सकते हैं?" क्रिया कर सकते हैं। लेकिन, जब एक खिलाड़ी ने पहले से ही स्थानांतरित करने का फैसला किया, तो इस कदम को निष्पादित होने तक कुछ समय लगता है (जैसे 10 गेम टिक)। इस अवधि के दौरान संभावनाओं की संख्या कम हो जाती है।

यह मान हर अगले स्तर के साथ तेजी से बढ़ेगा। क्या मैं कुछ भूल रहा हूँ? क्या इसे लागू करने के कोई तरीके हैं या क्या मुझे पूरी तरह से अलग एल्गोरिथ्म का उपयोग करना चाहिए?

आप केवल एक ही गेम स्टेट "सबट्री" की गणना करने के लिए हैश-टेबल का उपयोग कर सकते हैं। कल्पना कीजिए कि खिलाड़ी A ऊपर और नीचे चलता है, जबकि अन्य सभी खिलाड़ी "प्रतीक्षा" करते हैं, आप एक ही गेम स्टेट में समाप्त होते हैं। यह "बाएँ-दाएँ" या "दाएँ-बाएँ" के समान है। इसके अलावा "ऊपर-तब-बाएं" और "बाएं-तब-ऊपर" बढ़ने से एक ही स्थिति होती है। हैश-टेबल का उपयोग करके आप एक गेम स्थिति के लिए गणना किए गए स्कोर को "पुन: उपयोग" कर सकते हैं जिसका मूल्यांकन पहले ही किया जा चुका है। यह विकास की गति को काफी कम कर देता है। गणितीय रूप से, यह आपके घातीय वृद्धि समारोह के आधार को कम करता है। यदि यह जटिलता कम कर देता है, इसका अंदाजा लगाने के लिए, हम नक्शे पर पहुंच योग्य स्थिति (= अलग-अलग गेम स्टेट्स) की तुलना में केवल एक खिलाड़ी के लिए संभव चालों को देखते हैं, अगर खिलाड़ी सिर्फ ऊपर / नीचे / बाएं / दाएं / रुक सकता है ।

गहराई 1: 5 चाल, 5 अलग-अलग राज्य, इस पुनरावृत्ति के लिए 5 अतिरिक्त राज्य

गहराई 2: 25 चाल, 13 अलग-अलग राज्य, इस पुनरावृत्ति के लिए 8 अतिरिक्त राज्य

गहराई 3: 6125 चाल, 25 विभिन्न राज्यों, 12 अतिरिक्त राज्यों इस पुनरावृत्ति के लिए

इसकी कल्पना करने के लिए, अपने आप को उत्तर दें: मानचित्र पर किन क्षेत्रों में एक चाल, दो चाल, तीन चालों के साथ पहुंचा जा सकता है। इसका उत्तर है: प्रारंभ स्थिति से अधिकतम दूरी = 1, 2 या 3 वाले सभी क्षेत्र।

हैशटेबल का उपयोग करते समय आपको केवल एक बार प्रत्येक पहुंच योग्य खेल स्थिति (गहराई में 3 में हमारे उदाहरण 25) का मूल्यांकन करना होगा। जबकि हैशटेबल के बिना आपको कई बार उनका मूल्यांकन करने की आवश्यकता होती है, जिसका मतलब होगा गहराई स्तर पर 25 के बजाय 6125 मूल्यांकन। सबसे अच्छा: एक बार जब आपने हैशटेबल प्रविष्टि की गणना की तो आप इसे बाद के समय के चरणों में फिर से उपयोग कर सकते हैं ...

आप वृद्धिशील गहरीकरण और अल्फा-बीटा प्रूनिंग "कट" उपप्रकार का भी उपयोग कर सकते हैं जो अधिक गहराई में खोज के लायक नहीं हैं। शतरंज के लिए यह खोजे गए नोड्स की संख्या को लगभग 1% तक कम कर देता है। अल्फा-बीटा प्रूनिंग का संक्षिप्त परिचय यहां एक वीडियो के रूप में पाया जा सकता है: http://www.teachingtree.co/cs/watch?concept_name=Alpha-beta+Pruning

आगे की पढ़ाई के लिए एक अच्छी शुरुआत है http://chessprogramming.wikispaces.com/Search । पेज शतरंज से संबंधित है, लेकिन खोज और अनुकूलन एल्गोरिदम काफी समान हैं।

एक और (लेकिन जटिल) एआई एल्गोरिथ्म - जो खेल के लिए अधिक उपयुक्त होगा - "टेम्पोरल डिफरेंस लर्निंग" है।

सादर

स्टीफन

पुनश्च: यदि आप संभावित गेम स्टेट्स की संख्या कम कर देते हैं (जैसे कि नक्शे का बहुत छोटा आकार, प्रति खिलाड़ी केवल एक बम, और कुछ नहीं), तो सभी गेम स्टेट्स के लिए मूल्यांकन की पूर्व-गणना करने का मौका है।

--edit--

आप एक न्यूरोनल नेटवर्क को प्रशिक्षित करने के लिए न्यूनतम गणना के ऑफ़लाइन-गणना परिणामों का उपयोग कर सकते हैं। या आप उनका उपयोग हाथ से कार्यान्वित रणनीतियों की मूल्यांकन / तुलना करने के लिए कर सकते हैं। उदाहरण के लिए आप कुछ सुझाए गए "व्यक्तित्व" और कुछ अनुमानों को लागू कर सकते हैं जो पता लगाते हैं कि किन स्थितियों में रणनीति अच्छी है। इसलिए आपको स्थितियों (उदाहरण के लिए गेम स्टेट्स) को "वर्गीकृत" करना चाहिए। इसे एक न्यूरोनल नेटवर्क द्वारा भी नियंत्रित किया जा सकता है: वर्तमान स्थिति में कौन सी हाथ से कोडित रणनीति सबसे अच्छा खेल रही है, इसका अनुमान लगाने के लिए एक न्यूरोनल नेटवर्क को प्रशिक्षित करें। यह एक वास्तविक खेल के लिए बहुत अच्छा वास्तविक समय के निर्णय का उत्पादन करना चाहिए। कम-गहराई-सीमा वाली खोज से बहुत बेहतर, जिसे अन्यथा प्राप्त किया जा सकता है, क्योंकि इससे कोई फर्क नहीं पड़ता कि ऑफ़लाइन गणना कितनी देर तक होती है (वे खेल से पहले हैं)।

- # 2 संपादित करें -

यदि आप केवल हर 1 सेकंड में अपनी सर्वश्रेष्ठ चाल को पुनर्गणना करते हैं, तो आप अधिक उच्च स्तर की योजना बनाने का भी प्रयास कर सकते हैं। उससे मेरा मतलब क्या है? आप जानते हैं कि 1 सेकंड में आप कितने मूव कर सकते हैं। तो आप पहुंच योग्य पदों की सूची बना सकते हैं (जैसे यदि यह 1 सेकंड में 3 चाल होगी, तो आपके पास 25 पहुंच वाले स्थान होंगे)। तब आप इस तरह की योजना बना सकते हैं: "स्थिति x और एक बम रखें"। जैसा कि कुछ अन्य लोगों ने सुझाव दिया है कि आप एक "खतरे" मानचित्र बना सकते हैं, जिसका उपयोग रूटिंग एल्गोरिदम के लिए किया जाता है (स्थिति x पर कैसे जाएं? कौन सा पथ पसंद किया जाना चाहिए [ज्यादातर मामलों में कुछ बदलाव संभव हैं])। यह एक विशाल हैशटेबल की तुलना में कम मेमोरी खपत है, लेकिन कम इष्टतम परिणाम पैदा करता है। लेकिन जैसा कि यह कम मेमोरी का उपयोग करता है यह कैशिंग प्रभाव (आपके एल 1 / एल 2 मेमोरी कैश का बेहतर उपयोग) के कारण तेज हो सकता है।

ADDITIONALLY: आप प्री-सर्च कर सकते हैं, जिसमें केवल एक खिलाड़ी के लिए मूव्स होते हैं, जिसमें से प्रत्येक के लिए भिन्नताएँ होती हैं जो परिणाम खो देते हैं। इसलिए सभी अन्य खिलाड़ियों को खेल से बाहर ले जाएं ... स्टोर जो प्रत्येक खिलाड़ी को खोए बिना चुन सकते हैं, को मिलाते हैं। यदि केवल लूज़िंग मूव्स हैं, तो उस मूव कॉम्बिनेशन की तलाश करें जहाँ खिलाड़ी सबसे लंबे समय तक जीवित रहता है। इस प्रकार की ट्री संरचनाओं को संग्रहीत / संसाधित करने के लिए आपको इस तरह के इंडेक्स-पॉइंटर्स के साथ एक सरणी का उपयोग करना चाहिए:

class Gamestate {
  int value;
  int bestmove;
  int moves[5];
};

#define MAX 1000000
Gamestate[MAX] tree;

int rootindex = 0;
int nextfree = 1;

प्रत्येक राज्य का मूल्यांकन "मूल्य" है और अगले गेमस्टेट्स से लिंक होता है जब चलती है (0 = स्टॉप, 1 = अप, 2 = राइट, 3 = डाउन, 4 = बाएं) चाल में "ट्री" के भीतर एरे इंडेक्स को संग्रहीत करके [0] ] को स्थानांतरित करने के लिए [4]। अपने पेड़ को पुनरावर्ती बनाने के लिए यह इस तरह दिख सकता है:

const int dx[5] = { 0,  0, 1, 0, -1 };
const int dy[5] = { 0, -1, 0, 1,  0 };

int search(int x, int y, int current_state, int depth_left) {
  // TODO: simulate bombs here...
  if (died) return RESULT_DEAD;

  if (depth_left == 0) {
    return estimate_result();
  }

  int bestresult = RESULT_DEAD;

  for(int m=0; m<5; ++m) {
    int nx = x + dx[m];
    int ny = y + dy[m];
    if (m == 0 || is_map_free(nx,ny)) {
      int newstateindex = nextfree;
      tree[current_state].move[m] = newstateindex ;
      ++nextfree;

      if (newstateindex >= MAX) { 
        // ERROR-MESSAGE!!!
      }

      do_move(m, &undodata);
      int result = search(nx, ny, newstateindex, depth_left-1);
      undo_move(undodata);

      if (result == RESULT_DEAD) {
        tree[current_state].move[m] = -1; // cut subtree...
      }

      if (result > bestresult) {
        bestresult = result;
        tree[current_state].bestmove = m;
      }
    }
  }

  return bestresult;
}

इस तरह की पेड़ संरचना बहुत तेज है, क्योंकि गतिशील रूप से स्मृति आवंटित करना वास्तव में बहुत धीमा है! लेकिन, सर्च ट्री को स्टोर करना या तो काफी धीमा है ... इसलिए यह एक प्रेरणा है।


0

क्या यह कल्पना करने में मदद मिलेगी कि हर कोई मोड़ लेता है?

तकनीकी रूप से, अंतर्निहित प्रणाली में, वे वास्तव में करते हैं, लेकिन चूंकि चीजों को इंटरलेव किया जाता है और ओवरलैप किया जाता है, वे एक साथ चलते हुए दिखाई देते हैं।

यह भी याद रखें कि एनीमेशन के हर फ्रेम के बाद आपको AI नहीं चलाना है । कई सफल कैज़ुअल गेम केवल हर दूसरे या एक बार एआई एल्गोरिदम चलाते हैं, एआई-नियंत्रित वर्णों को जानकारी के साथ प्रदान करते हैं कि वे कहाँ जाने वाले हैं या वे क्या करने वाले हैं, फिर उस जानकारी का उपयोग एआई वर्णों को नियंत्रित करने के लिए किया जाता है। दूसरे तख्ते पर।


मैं एआई को एनीमेशन के हर फ्रेम की गणना नहीं कर रहा हूं लेकिन हर सेकंड। मेरा दूसरा वातावरण सभी खिलाड़ियों के कार्यों को एकत्र करता है और उन्हें नई अद्यतन स्थिति भेजता है।
बिल्दा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.