A * पाथफाइंडिंग कैसे काम करता है?


67

मैं एक मौलिक स्तर पर समझना चाहूंगा कि ए * पाथफाइंडिंग किस तरह से काम करता है। कोई भी कोड या पेसो-कोड कार्यान्वयन और साथ ही विज़ुअलाइज़ेशन सहायक होंगे।


यहाँ एक एनिमेटेड GIF के साथ एक छोटा सा लेख है जो गति में डिक्जस्ट्रा के एल्गोरिथ्म को दिखाता है।
लाफुर वेज

अमित का A * पेज मेरे लिए एक अच्छा परिचय था। आप YouTube पर AStar Algorithm की खोज के लिए कई अच्छे विज़ुअलाइज़ेशन पा सकते हैं ।
जदेसनो

मैं ए * स्पष्टीकरण के एक नंबर से उलझन में हूँ इससे पहले कि मैं इस महान ट्यूटोरियल पाया: policyalmanac.org/games/aStarTutorial.htm मैं ज्यादातर कहा कि जब मैं ए का क्रियान्वयन एक्शनस्क्रिप्ट में लिखा था: newarteest। /astar.html
१५'११ को


4
इसके अलावा, क्योंकि यह गेम डेवलपर्स के लिए एक बहुत ही जटिल विषय है, मुझे लगता है कि हम यहां जानकारी चाहते हैं। मैं जोएल को एक बार याद करते हुए कहता हूं कि वह चाहता है कि स्टैकऑवरफ्लो शीर्ष हिट हो, जब लोग Google प्रोग्रामिंग प्रश्न पूछते हैं।
jhocking

जवाबों:


63

अस्वीकरण

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


दीजकस्ट्रा का एल्गोरिदम

ए * को समझने के लिए, मेरा सुझाव है कि आप पहले दिक्जस्ट्रा के एल्गोरिथ्म पर एक नज़र डालें । मुझे दीजकस्ट्रा के एल्गोरिदम एक खोज के लिए प्रदर्शन करेगा चरणों के माध्यम से मार्गदर्शन करते हैं।

हमारा स्टार्ट-नोड है Aऔर हम सबसे छोटा रास्ता खोजना चाहते हैं F। ग्राफ़ के प्रत्येक किनारे पर एक आंदोलन लागत जुड़ा होता है (जिसे किनारों के बगल में काले अंकों के रूप में चिह्नित किया जाता है)। हमारा लक्ष्य ग्राफ के प्रत्येक शीर्ष (या नोड) के लिए न्यूनतम यात्रा लागत का मूल्यांकन करना है जब तक कि हम अपने लक्ष्य नोड से नहीं टकराते।

दिज्क्स्ट्रा का सचित्र, भाग १

यह हमारा शुरुआती बिंदु है। हमारे पास जाँच करने के लिए एक सूची नोड है, वर्तमान में यह सूची है:

{ A(0) }

Aकी लागत है 0, अन्य सभी नोड्स अनन्तता के लिए सेट हैं (एक विशिष्ट कार्यान्वयन में, यह कुछ इस तरह int.MAX_VALUEया समान होगा)।

दीजकस्ट्रा का सचित्र, भाग 2

हम नोड्स की हमारी सूची से सबसे कम लागत के साथ नोड लेते हैं (चूंकि हमारी सूची में केवल Aयही है, यह हमारा उम्मीदवार है) और इसके सभी पड़ोसियों का दौरा करें। हम प्रत्येक पड़ोसी की लागत निर्धारित करते हैं :

Cost_of_Edge + Cost_of_previous_Node

और पिछले नोड का ध्यान रखें (नोड के नीचे छोटे गुलाबी अक्षर के रूप में दिखाया गया है)। Aअब (लाल) हल के रूप में चिह्नित किया जा सकता है, ताकि हम इसे फिर से यात्रा न करें। अब हमारे उम्मीदवारों की सूची इस तरह दिखती है:

{ B(2), D(3), C(4) }

दीजकस्ट्रा का सचित्र भाग 3

फिर, हम अपनी सूची से सबसे कम लागत के साथ नोड लेते हैं ( B) और इसके पड़ोसियों का मूल्यांकन करते हैं। पथ के लिए Dकी वर्तमान लागत से ज्यादा महंगा है D, इसलिए इस मार्ग खारिज किया जा सकता है। Eहमारे उम्मीदवारों की सूची में जोड़ा जाएगा, जो अब इस तरह दिखता है:

{ D(3), C(4), E(4) }

दीजकस्ट्रा का सचित्र भाग 4

अब जांच करने वाला अगला नोड है D। कनेक्शन को Cछोड़ दिया जा सकता है, क्योंकि मौजूदा लागत से रास्ता छोटा नहीं है । हमें Eहालांकि एक छोटा रास्ता मिल गया था , इसलिए Eइसके पिछले नोड की लागत और अद्यतन की जाएगी। हमारी सूची अब इस तरह दिखती है:

{ E(3), C(4) }

दीजकस्ट्रा का सचित्र भाग 5

तो जैसा कि हमने पहले किया था, हम अपनी सूची से सबसे कम लागत के साथ नोड की जांच करते हैं, जो अब है EEकेवल एक अनसुलझा पड़ोसी है, जो लक्ष्य नोड भी है। लक्ष्य नोड तक पहुंचने की लागत 10और इसके पिछले नोड के लिए निर्धारित है E। अब हमारे उम्मीदवारों की सूची इस तरह दिखती है:

{ C(4), F(10) }

दीजकस्ट्रा का सचित्र भाग 6

आगे हम जांच करते हैं C। हम लागत और पिछले नोड को अपडेट कर सकते हैं F। चूंकि हमारी सूची में अब Fसबसे कम लागत के साथ नोड है, हम कर रहे हैं। हमारे पथ का निर्माण पिछले सबसे छोटे नोड्स को पीछे करके किया जा सकता है।


A * एल्गोरिथम

तो आपको आश्चर्य हो सकता है कि मैंने ए * एल्गोरिथ्म के बजाय दिज्क्स्ट्रा को क्यों समझाया ? ठीक है, केवल अंतर यह है कि आप अपने उम्मीदवारों को कैसे (या क्रमबद्ध) तौलते हैं। दिज्कस्त्र के साथ यह है:

Cost_of_Edge + Cost_of_previous_Node

A * के साथ:

Cost_of_Edge + Cost_of_previous_Node + Estimated_Cost_to_reach_Target_from(Node)

जहां Estimated_Cost_to_reach_Target_fromआमतौर पर एक Heuristic फ़ंक्शन कहा जाता है । यह एक फ़ंक्शन है जो लक्ष्य-नोड तक पहुंचने के लिए लागत का अनुमान लगाने की कोशिश करेगा। एक अच्छा हेयुरिस्टिक फ़ंक्शन प्राप्त करेगा कि लक्ष्य को खोजने के लिए कम नोड्स का दौरा करना होगा। जबकि दिज्क्स्ट्रा का एल्गोरिदम सभी पक्षों तक विस्तृत होगा, लक्ष्य की दिशा में A * वसीयत (उत्तराधिकारी के लिए धन्यवाद) खोज।

हेयूरिस्टिक्स के बारे में अमित के पेज में आम ह्यूरिस्टिक्स पर अच्छा अवलोकन है।


2
यह ध्यान देने योग्य है कि सबसे अच्छा मार्ग खोजने के लिए अनुमानी हमेशा खोज को आगे नहीं बढ़ाएगा। उदाहरण के लिए, यदि आपका अनुमान लक्ष्य से दूरी पर है, लेकिन व्यवहार्य मार्ग मानचित्र के किनारे पर है - इस उदाहरण में खोज सही मार्ग मिलने से पहले पूरे मानचित्र को खोजेगी। निश्चित रूप से, आप सोच रहे होंगे, कुछ ऐसा है जो मुझे नहीं मिलता है? यह काम नहीं करता है! - समझने वाली बात यह है कि एक अनुमानी का उद्देश्य MOST मामलों में खोज में कटौती करना है, और आपकी नौकरी एक को ढूंढना है जो आपकी विशिष्ट आवश्यकताओं के लिए सभी उपलब्ध समाधानों का 'सर्वोत्तम' है।
सिरयाकोट

2
@AsherEinhorn यह अभी भी बेहतर है (या सबसे खराब स्थिति में बराबर) की तरह एक अनजाने खोज की तुलना में Djikstra है।
बुमज़ैक

हाँ हाँ, आप बिलकुल सही कह रहे हैं। हो सकता है कि मैं स्पष्ट नहीं था, उस उदाहरण के बारे में मैंने उपरोक्त टिप्पणी में बात की थी जो कि A * के लिए एक सैद्धांतिक 'सबसे खराब मामला' सेनेरियो है, लेकिन इस बात के साथ कि क्या दिक्क्स्ट्रा हर समय करेगा। अधिकांश समय A * बहुत ही सरल अनुमान के साथ भी बेहतर होगा। मेरा कहना यह था कि विधर्मी पहली बार भ्रमित हो सकता है क्योंकि 'लक्ष्य की दूरी' हमेशा हर परिदृश्य के लिए मायने नहीं रखता है - मुद्दा यह है कि यह सबसे अधिक के लिए करता है।
सिरयाकोट 16

इसे भी देखें: qiao.github.io/PathFinding.js/visual
David Chouinard

यह उत्तर इस बात का उल्लेख कर सकता है कि क्या एक अनुमानी को स्वीकार्य बनाता है, इस बात की गारंटी देने के अर्थ में कि A * सबसे छोटा रास्ता खोजेगा। (संक्षेप में: स्वीकार्य होने के लिए, हेयुरिस्टिक को लक्ष्य से वास्तविक दूरी को कभी भी कम नहीं करना चाहिए। गैर-स्वीकार्य हेयस्टिस्टिक्स कभी-कभी उपयोगी हो सकते हैं, लेकिन वे ए * को उप-
रूपी

26

ए * पाथ फाइंडिंग एक सर्वश्रेष्ठ-प्रथम प्रकार की खोज है जो एक अतिरिक्त हेयुरिस्टिक का उपयोग करती है।

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

वैसे भी, किसी दी हुई शुरुआती टाइल पर शुरू करना:

  • शुरुआती टाइल के चारों ओर 8 टाइलें "रन" पर आधारित हैं) वर्तमान टाइल से अगली टाइल तक जाने की लागत (आमतौर पर क्षैतिज या ऊर्ध्वाधर आंदोलनों के लिए 1, विकर्ण आंदोलन के लिए sqrt (2))।

  • प्रत्येक टाइल को तब एक अतिरिक्त "हेयुरिस्टिक" स्कोर सौंपा जाता है - प्रत्येक टाइल पर जाने के सापेक्ष मूल्य का एक अनुमान। अलग-अलग heuristics का उपयोग किया जाता है, दिए गए टाइल और अंत टाइल के केंद्रों के बीच सीधी रेखा की दूरी सबसे सरल है।

  • वर्तमान टाइल तब "बंद" है, और एजेंट पड़ोसी टाइल पर जाता है जो खुला है, सबसे कम आंदोलन स्कोर है, और सबसे कम अंक स्कोर है।

  • यह प्रक्रिया तब तक दोहराई जाती है जब तक कि लक्ष्य नोड तक नहीं पहुंच जाता है, या अधिक खुले नोड्स नहीं होते हैं (जिसका अर्थ है कि एजेंट अवरुद्ध है)।

इन चरणों को दर्शाने वाले आरेखों के लिए, इस अच्छे शुरुआती ट्यूटोरियल का संदर्भ लें ।

कुछ सुधार किए जा सकते हैं, जो मुख्य रूप से सुधारवादी में सुधार कर सकते हैं:

  • भू-अंतर, खुरदरापन, खुरदरापन आदि को ध्यान में रखते हुए।

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


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

मेरा तर्क है कि वास्तव में कम स्पष्ट होगा, क्योंकि यह कल्पना करना कठिन है। लेकिन हाँ इस स्पष्टीकरण का उल्लेख करना चाहिए कि एक टाइल ग्रिड की आवश्यकता नहीं है; वास्तव में, मैं उस बिंदु को संपादित करूंगा।
झूम

14

यह सबसे अच्छा से दूर है, लेकिन यह एक कार्यान्वयन मैंने कुछ साल पहले सी ++ में ए * का किया था।

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

  1. ए * विकिपीडिया पर
  2. ए * जावा प्रदर्शन

4
आपका पायथन उदाहरण C ++ में है।
एल्युमिनियम

@ फ़िनिश - किसी को पकड़ने के लिए अच्छा है कि पकड़! दिन-प्रतिदिन की गतिविधियाँ इन दिनों अजगर के इर्द-गिर्द घूमती हैं। धन्यवाद!
डेविड मैकग्रॉ

3
आपका C ++ उदाहरण सी। भी हो सकता है
deceleratedcaviar

4
उदाहरण के लिए सभी संरचना के लिए कोडांतरक में हो सकता है। यह A * भी नहीं है, यह स्वीकृत उत्तर कैसे है?

4
क्षमा करें, यह फ़ॉल तक नहीं है, जब मैंने शुरुआत की थी, तो यह मेरी पहली कोडिंग कोशिशों में से एक थी। टिप्पणियों में कुछ योगदान करने के लिए स्वतंत्र महसूस करें / अपना समाधान साझा करने के लिए पोस्ट को संपादित करें।
डेविड मैकग्रा

6

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


4

ए * और डीजकस्ट्रा के एल्गोरिथ्म के साथ काम करते समय कल्पना करना महत्वपूर्ण है कि ए * निर्देशित है; यह किसी विशेष बिंदु पर "अनुमान लगाने" के लिए सबसे छोटा रास्ता खोजने की कोशिश करता है कि किस दिशा को देखना है। दिज्क्स्ट्रा के एल्गोरिथ्म में / हर / बिंदु पर सबसे छोटा रास्ता मिलता है।


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

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

3

तो बस एक पहले बयान के रूप में, ए * दिल में एक ग्राफ अन्वेषण एल्गोरिथ्म है। आमतौर पर खेल में हम ग्राफ़ के रूप में टाइल या अन्य विश्व ज्यामिति का उपयोग करते हैं, लेकिन आप अन्य चीजों के लिए A * का उपयोग कर सकते हैं। ग्राफ ट्रैवर्सल के लिए दो उर-एल्गोरिदम गहराई-पहले-खोज और चौड़ाई-पहली-खोज हैं। DFS में आप हमेशा वर्तमान नोड के भाई-बहनों को देखने से पहले अपनी वर्तमान शाखा का पूरी तरह से पता लगा लेते हैं, और BFS में आप हमेशा पहले भाई-बहनों और फिर बच्चों को देखते हैं। ए * इन दोनों के बीच एक मध्य-भूमि को खोजने की कोशिश करता है जहां आप एक शाखा (जैसे डीएफएस की तरह) का पता लगाते हैं, जब आप इच्छित लक्ष्य के करीब पहुंच रहे हैं लेकिन कभी-कभी रुकें और एक सिबलिंग की कोशिश करें यदि इसके शाखा के बेहतर परिणाम हो सकते हैं। वास्तविक गणित यह है कि आप अगले नोड का पता लगाने के लिए संभावित नोड्स की एक सूची रखते हैं जहां प्रत्येक में "अच्छाई" होती है यह दर्शाता है कि यह लक्ष्य के कितने करीब है (किसी प्रकार के अमूर्त अर्थ में), कम स्कोर बेहतर होना (0 मतलब आपको लक्ष्य मिला)। आप चयन करते हैं कि स्कोर का न्यूनतम और प्लस नोड्स को रूट से दूर (जो कि आमतौर पर वर्तमान कॉन्फ़िगरेशन, या पाथफाइंडिंग में वर्तमान स्थिति) का पता लगाकर अगले का उपयोग करना है। हर बार जब आप एक नोड का पता लगाते हैं तो आप अपने सभी बच्चों को इस सूची में जोड़ते हैं और फिर नया सबसे अच्छा उठाते हैं।


3

अमूर्त स्तर पर, A * इस तरह काम करता है:

  • आप दुनिया को जुड़े हुए नोड्स की असतत संख्या के रूप में मानते हैं, जैसे। एक ग्रिड, या एक ग्राफ।
  • उस दुनिया भर में एक रास्ता खोजने के लिए, आपको उस स्थान के भीतर आसन्न 'नोड्स' की एक सूची ढूंढनी होगी, जो शुरुआत से लक्ष्य तक जाती है।
  • भोली दृष्टिकोण यह होगा: नोड्स के हर संभव क्रमचय की गणना करें जो प्रारंभ नोड से शुरू होता है और अंत नोड पर समाप्त होता है, और सबसे सस्ता चुनें। यह स्पष्ट रूप से सभी लेकिन सबसे नन्हा स्थानों पर हमेशा के लिए ले जाएगा।
  • इसलिए वैकल्पिक दृष्टिकोण दुनिया के बारे में कुछ ज्ञान का उपयोग करने का प्रयास करते हैं, यह अनुमान लगाने के लिए कि कौन से क्रमपरिवर्तन पहले विचार करने योग्य हैं, और यह जानने के लिए कि क्या किसी दिए गए समाधान को पीटा जा सकता है। इस अनुमान को एक अनुमानी कहा जाता है।
  • A * के लिए एक अनुमानी की आवश्यकता होती है जो स्वीकार्य हो । इसका मतलब है कि यह कभी भी कम नहीं करता है।
    • पैथफाइंडिंग समस्याओं के लिए एक अच्छा अनुमानी यूक्लिडियन दूरी है क्योंकि हम जानते हैं कि 2 बिंदुओं के बीच सबसे छोटा मार्ग एक सीधी रेखा है। यह वास्तविक दुनिया के सिमुलेशन में दूरी को कभी कम नहीं करता है।
  • A * स्टार्ट नोड के साथ शुरू होता है, और उस नोड के क्रमिक क्रमबद्धता और प्रत्येक पड़ोसी और उसके पड़ोसी के पड़ोसी आदि की कोशिश करता है, जो कि आगे की कोशिश करने के लिए किस क्रमपरिवर्तन का उपयोग करता है।
  • प्रत्येक चरण पर, A * अब तक के सबसे आशाजनक मार्ग को देखता है और अब तक की यात्रा के आधार पर अगले पड़ोसी नोड को चुनता है जो 'सबसे अच्छा' प्रतीत होता है, और उस से जाने के लिए कितना दूर छोड़ा जाएगा इसका अनुमानी अनुमान नोड।
  • क्योंकि हेयुरिस्टिक कभी भी ओवरस्टिमेट नहीं करता है, और अब तक की गई दूरी को सटीक माना जाता है, यह हमेशा सबसे आशावादी अगला कदम उठाएगा।
    • यदि वह अगला चरण लक्ष्य तक पहुंचता है, तो आप जानते हैं कि उसने अंतिम स्थिति से सबसे छोटा मार्ग पाया है, क्योंकि यह वैध लोगों का सबसे आशावादी अनुमान था।
    • यदि यह लक्ष्य तक नहीं पहुंचा, तो इसे बाद में पता लगाने के लिए एक संभावित बिंदु के रूप में छोड़ दिया जाता है। एल्गोरिथ्म अब अगली सबसे आशाजनक संभावना चुनता है, इसलिए ऊपर दिया गया तर्क अभी भी लागू होता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.