सामरिक आरपीजी के लिए एक * एल्गोरिथम?


15

मैं C ++ में एक बहुत खराब सामरिक आरपीजी लिखने के साथ गड़बड़ कर रहा हूं। अब तक मेरे पास 2 डी टाइल का नक्शा है और विकिपीडिया में छद्मकोड पर आधारित ए * एल्गोरिथ्म काम कर रहा है ।

लेकिन असली सामरिक आरपीजी सिर्फ एक समतल विमान पर सबसे अच्छा रास्ता नहीं खोजते हैं और वहां चले जाते हैं। उनके पास आम तौर पर सीमित चाल सीमा होती है और उन्हें ऊपर या नीचे चढ़ना चाहिए। यदि आपने कभी भी अंतिम काल्पनिक रणनीति खेली है तो ये मूव और जंप सांख्यिकी से प्रभावित होंगे। यह वह जगह है जहां मैं खो जाता हूं। मैं ए * एल्गोरिथ्म को कैसे बदल सकता हूं ताकि यह एक लक्ष्य की ओर सबसे अच्छा रास्ता ढूंढ सके, लेकिन रास्ता केवल इतने सारे टाइल्स लंबा है? मुझे ऊंचाई के अंतर को कैसे लेना चाहिए और आंकड़ों को कूदना चाहिए? मैं एक अंतराल पर कूद कैसे लागू कर सकता हूं?

यदि यह मदद करता है, तो अभी मेरा नक्शा टाइल वस्तुओं के वेक्टर द्वारा दर्शाया गया है। प्रत्येक टाइल में उत्तर, दक्षिण, पूर्व और पश्चिम टाइल की ओर संकेत होता है, जो नल के लिए सेट होते हैं यदि कोई टाइल वहां मौजूद नहीं है, जैसे कि नक्शे के किनारे या अगर कोई टाइल गैर-पास करने योग्य है।


5
मुझे नहीं पता कि क्यों रेंज रेंज एक समस्या है। सबसे छोटा रास्ता ढूंढें, और उसके बाद, उस पथ पर 'गति' वर्ग को स्थानांतरित करें।
मूविंग डक

जवाबों:


33

चढ़ाई, और अंतराल, बस अलग-अलग लागत कार्य हैं। एक इकाई के लिए जो अंतर को कूद सकती है उसकी सामान्य (?) लागत होती है, जबकि एक गैर-कूदने वाली इकाई के लिए मनमाने ढंग से उच्च लागत होती है। चढ़ाई की लागत अतिरिक्त है, जैसा कि कठिन इलाके में होता है, आदि * एल्गोरिथ्म लागत कार्यों को अच्छी तरह से संभालने में सक्षम है, इसलिए यदि आपका कार्यान्वयन पहले से ही नहीं कर रहा है, तो लागत समारोह के साथ ए * को कैसे लागू किया जाए, इसके लिए बस Google।

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


10
'सामरिक स्थिति' के बारे में अच्छे बिंदु, लेकिन उन निर्णयों को मूल पाथफाइंडिंग की तुलना में उच्च स्तर पर लागू किया जा सकता है। दूसरी ओर, कुछ प्रकार के सामरिक विश्लेषक द्वारा उत्पन्न किए गए पाथफाइंडिंग एल्गोरिदम में नोड्स पर लागत को लागू करना एक अच्छा विकल्प हो सकता है। उदाहरण के लिए, यदि शत्रु के पास भू-भाग की दृष्टि है तो उस भूभाग पर बहुत अधिक लागत है।
DrMcCleod

1
@DrMcCleod: वास्तव में, और यही मेरा मतलब है "या अधिक सटीक रूप से, यह एक पूरी कहानी नहीं है"। आप निश्चित रूप से ए * या किसी अन्य एल्गोरिदम का उपयोग प्रसंस्करण का हिस्सा करने के लिए कर सकते हैं, हालांकि मुझे लगता है कि मैं ऐसे दृष्टिकोणों से बचूंगा जैसे कि आंदोलन की लागत के माध्यम से देखने की कोशिश कर रहा हूं क्योंकि पूरे इलाके में स्थानांतरित होने के बाद से जहां इकाई आग की चपेट में आ सकती है, बेहतर है। जोखिम / इनाम की गणना, IMO।
जैक एडले

13

जब आप एक इकाई के सभी संभव आंदोलन विकल्प चाहते हैं, तो डायजेक्स्ट्रा के एल्गोरिथ्म का उपयोग करें ।

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

इसलिए जब आप बिंदु A से बिंदु B तक का सबसे छोटा रास्ता चाहते हैं, तो A * एक अच्छा विकल्प है। लेकिन अगर आप हर संभव आंदोलन के विकल्प और उनमें से प्रत्येक के लिए सबसे छोटा रास्ता चाहते हैं, तो दीजकस्ट्रा वास्तव में आप क्या चाहते हैं।

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

जंप के बारे में: जिन्हें ए * और दिज्क्स्त्र दोनों में एक और धार के रूप में दर्शाया जा सकता है। वे एक नियमित रूप से बढ़त या एक अलग एक traversing के रूप में एक ही लागत हो सकता है। आप एल्गोरिथ्म के लिए एक "जंप_हाईट" पैरामीटर भी पास कर सकते हैं जो एल्गोरिथ्म को जंप-किनारों को अनदेखा करने के लिए कहता है जो किसी दिए गए ऊंचाई से अधिक है।


9
यहाँ उल्लेख करने लायक बात A*यह है कि वास्तव में दिज्क्स्ट्रा का सामान्यीकरण है, इसलिए यदि आप समझते हैं कि दूसरे को समझना बहुत कठिन नहीं होना चाहिए।
घन

8
वास्तव में, यदि आपके पास एक हेयुरिस्टिक है जो आपके ए * एल्गोरिथ्म में 0 वापस करता है, तो बधाई! आपने अभी-अभी दीजकस्ट्रा का एल्गोरिदम लिखा है।
यन

9
"दिक्जस्त्र आपको दिए गए लागत से प्राप्त होने वाले सभी संभावित छोटे मार्ग देता है, और यदि उनमें से कोई भी आपकी मंजिल तक नहीं पहुंचता है, तो यह लागत को एक बढ़ा देता है और जारी रखता है" - यह न तो यह है कि यह कैसे काम करता है और न ही यह आउटपुट करता है। यह वास्तव में भारित रेखांकन की चौड़ाई-पहली खोज का सामान्यीकरण है। यह एक सबसे छोटा रास्ता ढूंढता है। A * केवल उस का एक सामान्यीकरण है, जब आपके पास एक दूरी-हेयुरिस्टिक उपलब्ध है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

1
यकीन नहीं हो रहा है कि यह इतना उलझा हुआ क्यों है। व्यावहारिक दृष्टिकोण से, दिक्जस्त्र अप्रचलित है। यह सीएस में शैक्षिक और ऐतिहासिक कारणों से पढ़ाया जाता है। यहां तक ​​कि ए * गंभीर काम के लिए अप्रचलित है; Google मानचित्र निश्चित रूप से इसका उपयोग नहीं करता है। आप आजकल आर्कग्राफ वेरिएंट को देख रहे होंगे।
MSalters

2
@MSalters Dijkstra और A * सामरिक आरपीजी जैसी सरल समस्याओं के लिए पूरी तरह से ठीक एल्गोरिदम हैं। वैध आंदोलनों (टाइल्स) की एक बहुत ही संकीर्ण सीमा है और उक्त टाइलों (ऑर्थॅगोनल, कभी-कभी विकर्ण) में स्थानांतरित करने के तरीकों की एक बहुत ही सीमित मात्रा है और आमतौर पर काफी कम अधिकतम पथ: SQRT (ArenaWidth² * ArenaHight range)। कम्प्यूटेशनल रूप से, अंतर एक आधुनिक मशीन पर नगण्य है जो संभावित रूप से बहुत छोटे मूल्यों के लिए है, इसलिए जब एक सरल एक को यहां उल्लिखित उद्देश्यों के लिए पर्याप्त है, तो अधिक जटिल कार्यान्वयन से परेशान क्यों?
वल्तखे

2

अन्य उत्तरों में कुछ अच्छी जानकारी है, इसलिए उन्हें पढ़ना सुनिश्चित करें।

हालांकि, आपके प्रश्न का उत्तर देने के लिए: आपके द्वारा लिंक किए गए heuristic_cost_estimateछद्मकोड के आधार पर, आपके पास कुछ प्रकार के फ़ंक्शन हैं जहां आप टाइल से टाइलबी की लागत की गणना कर रहे हैं (यह मानते हुए कि वे आसन्न हैं)। उस लागत के लिए एक फ्लैट (1) का उपयोग करने के बजाय, आपको इसे टाइल आँकड़े और इकाई आँकड़े, और संभवतः किनारे आँकड़े शामिल करने के लिए समायोजित करना होगा।

उदाहरण के लिए:

if (edge == JUMP && !unit.canJump()) 
    return INF;
if (tile.Type == Forest && unit.moveType == HORSE) 
    return 2;
//Other cases here
//-----
else 
    return 1;

इससे आपको अपना रास्ता मिल जाएगा। फिर, आप बस आंदोलन के बिंदुओं का उपभोग करते हुए इकाई को उनके पथ पर ले जाएंगे और शेष बिंदुओं को रोकेंगे <किनारे। ध्यान दें कि यह पूरी तरह से इष्टतम नहीं हो सकता है यदि आप शेष अंक = 1 के साथ समाप्त होते हैं, लेकिन यह एक अभ्यास आरपीजी के लिए पर्याप्त होना चाहिए। वास्तविकता में, आप अधिक सामरिक चाहते हैं, जैसा कि जैक एडली ने बताया है!

चुनौती:
यदि आप अधिक उन्नत प्राप्त करना चाहते हैं, तो आप शायद Xikstras का उपयोग करना चाहते हैं जैसा कि X दूरी के भीतर सभी रिक्त स्थान खोजने के लिए सुझाया गया है, तो आप लक्ष्य के लिए निकटता के आधार पर "सर्वश्रेष्ठ" स्थान के लिए उस सूची में प्रत्येक स्थान का मूल्यांकन करना चाहते हैं, रक्षा शक्ति, चाहे आप उस स्थिति से हमला किया जा सकता है, आदि, उस जानकारी के आधार पर, आप एक टाइल का चयन करेंगे, फिर वहाँ पथ का अनुसरण करें जहाँ आपने सिर्फ Djikstras का उपयोग करके गणना की थी।


1

चढ़ाई और अंतराल बहुत तुच्छ हैं क्योंकि वे केवल लागत को संशोधित करते हैं। पाथफाइंडिंग (और अधिकांश सामरिक एआई) सभी को सभी-टू-विजिटेड नोड्स पर लागत को समेटने और कम से कम करने के बारे में है। एक अगम्य चट्टान में एक अनंत (बहुत, बहुत अधिक) लागत होगी, ढलान में सामान्य से अधिक लागत होगी, आदि।

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

अच्छा सिमुलेशन जानबूझकर सबसे अच्छा रास्ता नहीं खोजता है। एक बेहतर एल्गोरिथ्म पदानुक्रमिक पाथफाइंडिंग करने के लिए हो सकता है - अगर मानचित्र पर एक सीधी रेखा खींचकर और 4-5 वेपॉइंट लेने से और कुछ नहीं होता है, तो केवल एक नोड से दूसरे वेपॉइंट पर पाथफाइंडिंग करें, केवल नोड भार पर विचार करें जो अब तक है ज्ञात और "उदासीन" करने के लिए अन्य सभी नोड weigths की स्थापना। वैकल्पिक रूप से, आप पहले एक मोटे ग्रिड पर ए * चला सकते हैं, और फिर एक बड़े नोड से अगले तक पाथफाइन्ड कर सकते हैं (लेकिन मैं अनुमान लगा रहा हूं कि नक्शे पर एक रेखा खींचना ठीक है, भी)।

यह बहुत अधिक यथार्थवादी है (और प्रसंस्करण शक्ति का एक अंश भी खाता है क्योंकि ग्राफ बहुत छोटा है)। हां, इसका मतलब यह हो सकता है कि एक इकाई केवल एक चट्टान की ओर बढ़ती है ताकि यह पता लगाया जा सके कि यह पार नहीं हो सकती है। यह ठीक है, यह वास्तविक विरोधियों के लिए भी होता है। अगली बार, यह फिर से नहीं होगा (क्योंकि अब अनंत लागत ज्ञात है)।


1
माइंड यू, कि "सरल पदानुक्रमित पाथफाइंडिंग" बहुत बेवकूफ लग सकता है। आपको इकाइयाँ सीधे एक पहाड़ी रिज तक पहुँचती हैं, केवल यह पता लगाने के लिए कि रास्ता अवरुद्ध है। फिर वे पहाड़ के रास्ते से होकर अगले रास्ते की ओर जाते हैं, और वहाँ से अपने गंतव्य की ओर जाते हैं - भले ही वह बाद वाला रास्ता उनके लिए रास्ता बंद हो। प्रीप्रोसेसिंग ने पहाड़ के सामने के हिस्से की पहचान की होगी और वहां से रास्ता निकाला होगा। लेकिन अगर आप ऐसा नहीं करते हैं, तो एक बार जब आप नियोजित पाठ्यक्रम से बहुत दूर हो जाते हैं, तो आपको शेष की योजना फिर से बनानी चाहिए।
मसलक

@MSalters: यह पहली कोशिश के बाद भी "ड्रा ए लाइन" विधि के साथ हो सकता है, हाँ। मोटे ग्रिड पदानुक्रमित विधि के साथ एक बार से अधिक होने की संभावना नहीं है (जो उदाहरण औसत, या मंझला, या यहां तक ​​कि नोड्स का अधिकतम लागत मूल्य भी लेता है)। यह वास्तव में बहुत अधिक है कि एक मानव विरोधी कैसे खेलता है - बड़ी बाधाओं से बचें जिनके बारे में आप जानते हैं या पहाड़ श्रृंखला की तरह दूर से देख सकते हैं , और अन्यथा मोटे तौर पर सीधे मार्ग की योजना बनाते हैं, और अपने रास्ते से काटते हैं। जब तक आप नहीं जानते कि कोई पहाड़ है, आप सीधे चलते हैं।
डेमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.