पथ खोज एल्गोरिदम?


24

मैंने स्टैक ओवरफ्लो पर यह प्रश्न पहले पोस्ट किया था, लेकिन मुझे लगता है कि कोई भी वहाँ वीडियो गेम में बहुत दिलचस्पी नहीं है ...

सभी प्रकार के खेल में उपयोग किए जाने वाले कुछ पथप्रदर्शक एल्गोरिदम क्या हैं? (सभी प्रकार के पात्र जहाँ कहीं भी जाते हैं) क्या दिज्क्स्त्र का बहुत उपयोग किया जाता है? मुझे नहीं लगता, क्योंकि यह वास्तव में कहीं बाहर ले जाने के लिए कदम का पता नहीं लगाता है, है ना? अगर मैं इसे सही समझ रहा हूं, तो यह केवल यह निर्धारित करता है कि कौन सी वस्तु सबसे नजदीक है। मैं वास्तव में कुछ भी कोड करने के लिए नहीं देख रहा हूँ; बस कुछ शोध कर रहे हैं, हालांकि अगर आप छद्म कोड या कुछ और पेस्ट करते हैं, तो यह ठीक होगा (मैं जावा और सी ++ समझ सकता हूं)। मैं मूल रूप से सामान्य रूप से पथ खोज के त्वरित अवलोकन की तलाश में हूं।

मुझे पता है कि A * 2 डी गेम में उपयोग करने के लिए एल्गोरिथ्म की तरह है। यह बहुत अच्छा है और सभी, लेकिन 2 डी गेम के बारे में क्या है जो ग्रिड-आधारित नहीं हैं? एज ऑफ़ एम्पायर, या लिंक जागरण जैसी चीज़ें। नेविगेट करने के लिए अलग-अलग वर्ग स्थान नहीं हैं, इसलिए वे क्या करते हैं?

3 डी गेम क्या करते हैं? मैंने इस बात को पढ़ा है http://www.ai-blog.net/archives/000152.html , जो मैं सुनता हूं कि इस विषय पर एक महान अधिकार है, लेकिन यह वास्तव में HOW की व्याख्या नहीं करता है, एक बार जब मेष सेट हो जाते हैं, पथ खोज किया जाता है। यदि A * वे उपयोग करते हैं, तो 3D वातावरण में ऐसा कुछ कैसे किया जाता है? और गोल कोनों को गोल करने के लिए स्प्लिन बिल्कुल कैसे काम करते हैं?


2
मुझे लगता है कि एसई के प्रश्नोत्तर प्रारूप के लिए यह प्रश्न बहुत खुला है। अक्सर पूछे जाने वाले प्रश्न
जॉन मैकडॉनल्ड्स

1
आपके द्वारा बताए गए गेम को ए * एक या दूसरे तरीके से मैप को नोड्स में तोड़ना चाहिए। उस ब्रेक डाउन प्रक्रिया में स्क्वेयर ग्रिड को शामिल नहीं करना है और इसे करने के कई तरीके हैं। इस vid को youtube.com/watch?v=nGC_kBCoHYc पर चेक करें , एक अच्छा गेम इसे बनाता है ताकि खिलाड़ी यह न बता सकें कि वे क्या कर रहे हैं वास्तव में पर्दे के पीछे कर रहे हैं।
जिओचुआन यू

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

सिर्फ संदर्भ के लिए: मैंने स्टैक ओवरफ्लो पर सवाल का जवाब दिया
जूलियन

1
मुझे शेख़ी करने दो। इस प्रश्न को GDSE के 4 करीबी वोटों की तुलना में SO पर 4 अपवोट्स मिले। मैं मदद नहीं कर सकता, लेकिन यह महसूस कर सकता हूं कि इस साइट पर मध्यस्थ अत्यधिक आक्रामक हो रहे हैं। निश्चित रूप से, मैं यह देख सकता हूं कि एफएक्यू में निर्दिष्ट दिशा-निर्देशों के खिलाफ प्रश्न कैसे जाता है, लेकिन उद्धृत करते हुए, उन दिशानिर्देशों को रोकने के लिए जगह में हैं diminishing the usefulness of our site। इस प्रश्न को 3 बार पहले ही पसंद किया जा चुका है जो इस बात का प्रमाण है कि यह कुछ उपयोगकर्ताओं के लिए उपयोगी है। इसलिए मैं मदद नहीं कर सकता, लेकिन यह महसूस कर सकता हूं कि इसे बंद करना और अंतिम निष्कासन को जोखिम में डालना, बहुत अधिक उल्टा है।
डेविड गॉविया

जवाबों:


62

एक साथ बहुत सारे प्रश्न, इसलिए इसका ठोस उत्तर देना कठिन है लेकिन इनमें से कुछ विषयों पर चर्चा करें। मैं उत्तर को दो में विभाजित करूँगा और इसे यथासंभव सर्वोत्तम तरीके से संबोधित करने का प्रयास करूँगा। मैं इनमें से किसी भी सूची के पूर्ण होने का दावा नहीं करता , लेकिन वे कुछ अलग-अलग तरीके हैं जिन्हें मैं याद रख सकता हूं।


भाग 1 - एल्गोरिथ्म Pathfinding

शुरुआत के लिए, पाथफाइंडिंग को लागू करने के कई तरीके हैं , लेकिन उनमें से सभी सबसे छोटा रास्ता नहीं देते हैं, या कुशल या विश्वसनीय भी हैं। उदाहरण के लिए:

  • आदिम विधियाँ जो "आगे नहीं दिखती" हैं और एक समय में एक कदम उठाती हैं:

    • रैंडम बैकस्टैपिंग - लक्ष्य की दिशा में एक समय में एक कदम उठाएं। यदि किसी बाधा का सामना करना पड़ता है तो यादृच्छिक दिशा में थोड़ा पीछे हटकर और फिर से कोशिश करके इसके चारों ओर काम करने की कोशिश करें। बिल्कुल भी विश्वसनीय नहीं है और कई स्थितियों में फंस जाएगा।

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

  • वे विधियाँ जो एक ही बार में पूरा रास्ता खोजने के लिए तत्पर हैं:

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

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

    • सर्वश्रेष्ठ पहली खोज - ब्रेडथ फर्स्ट सर्च के समान लेकिन एक ऐसा अनुमानी उपयोग करता है जो पहले सबसे होनहार पड़ोसी को चुनता है। लौटाया गया रास्ता सबसे छोटा नहीं हो सकता है, लेकिन यह पहली खोज की तुलना में अधिक तेज़ है। A * बेस्ट फर्स्ट सर्च का एक प्रकार है।

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

    • ए * - दिज्क्स्त्र के समान लेकिन यह भी अनुमान लगाने के लिए एक अनुमान का उपयोग करता है कि प्रत्येक नोड लक्ष्य के करीब होने की संभावना है, ताकि सबसे अच्छा निर्णय लिया जा सके। इस अनुमान के कारण, A * बहुत अधिक समय पर ढंग से एक भारित ग्राफ में सबसे छोटा रास्ता ढूंढता है।

  • फिर ए * (या सामान्य रूप से पथप्रदर्शक अनुकूलन) की विविधताएं हैं जो इसे कुछ परिस्थितियों के अनुसार तेज या अधिक अनुकूलित करती हैं, जैसे ( संबंधित उत्तर देखें और cstheory.SE पर एक व्यापक सूची ):

    • एलपीए * - ए के समान * लेकिन ग्राफ में एक छोटा सा बदलाव होने पर सबसे अच्छा पथ को और अधिक तेजी से पुनर्गणना कर सकता है
    • डी * लाइट - एलपीए * के आधार पर, यह वही काम करता है, लेकिन मानता है कि "स्टार्ट पॉइंट" एक इकाई है जो फिनिश की ओर बढ़ रही है जबकि ग्राफ में बदलाव किया जा रहा है।
    • एचपीए * (पदानुक्रमित) - खोज को तेज करने के लिए विभिन्न अमूर्त स्तरों पर कई परतों का उपयोग करता है। उदाहरण के लिए, एक उच्च स्तर की परत बस कमरों को जोड़ सकती है, जबकि निचले स्तर की परत बाधाओं से बचने का ध्यान रखती है।
    • आईडीए * (Iterative Deepening) - नियमित रूप से A * के साथ तुलनात्मक गहनता का उपयोग करके मेमोरी उपयोग को कम करता है।
    • SMA * (सरलीकृत मेमोरी-बाउंडेड) - केवल खोज को पूरा करने के लिए उपलब्ध मेमोरी का उपयोग करता है।
    • जंप प्वाइंट सर्च - इसका उल्लेख करने के लिए टिप्पणियों में एरिक को श्रेय! यूनिफॉर्म-कॉस्ट ग्रिड मैप्स ( लिंक ) पर पाथफाइंडिंग को गति देता है ।

भाग 2 - खोज अंतरिक्ष प्रतिनिधित्व

और अंत में इस प्रश्न का समाधान करने के लिए:

मुझे पता है कि A * 2 डी गेम में उपयोग करने के लिए एल्गोरिथ्म की तरह है। यह बहुत अच्छा है और सभी, लेकिन 2 डी गेम के बारे में क्या है जो ग्रिड-आधारित नहीं हैं?

यहाँ दो बड़ी गलतफहमियाँ! असल में:

  1. यदि खेल 2 डी या 3 डी है, तो ए * परवाह नहीं करता है, और दोनों मामलों के लिए समान रूप से उपयुक्त है।
  2. A * किसी भी ग्राफ़ प्रतिनिधित्व के तहत काम करता है , इसलिए यह परवाह नहीं करता है कि दुनिया ग्रिड है या नहीं।

तो अगर दुनिया को ग्रिड बनने की जरूरत नहीं है, तो आप किन अन्य तरीकों से इसका प्रतिनिधित्व कर सकते हैं? यहाँ पाथफाइंडिंग के लिए विश्व स्पेस को विभाजित करने के तरीकों का एक संक्षिप्त अवलोकन दिया गया है, और इनमें से अधिकांश 2 डी और 3 डी दोनों के लिए काम करते हैं:

  • आयताकार ग्रिड - ग्राफ में एक नोड वाले प्रत्येक सेल के साथ वर्गों की नियमित ग्रिड में विभाजन की दुनिया, और दो unobstructed नोड्स के बीच कनेक्शन एक बढ़त है।

    यहाँ छवि विवरण दर्ज करें

  • क्वाडट्री - अंतरिक्ष को विभाजित करने का एक और तरीका, लेकिन नियमित आकार की कोशिकाओं के ग्रिड में विभाजन के बजाय, चार में विभाजन, फिर इनमें से प्रत्येक को फिर से चार में विभाजित करें। तीसरे आयाम को जोड़ने से यह एक अष्टक बनता है

    यहाँ छवि विवरण दर्ज करें

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

    यहाँ छवि विवरण दर्ज करें

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

    यहाँ छवि विवरण दर्ज करें


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