क्या प्रीकम्प्यूटेड पैथफाइंडिंग अभी भी प्रासंगिक है?


12

प्रसंग

पुराने लुकास आर्ट्स (स्कममम युग) बिंदु और क्लिक करें ग्राफिक एडवेंचर गेम जिसमें प्रीकम्प्यूटेड पाथफाइंडिंग का उपयोग किया गया था। यहाँ तकनीक की एक मोटी रूपरेखा है।

चरण 1

प्रत्येक कमरे में फर्श को "वॉक बॉक्स" कहा जाता था, जो कि एक नेविगेशन जाल में नोड्स के बराबर थे, लेकिन ट्रेपेज़ॉइड आकार तक सीमित थे। उदाहरण के लिए:

 ______ _____ _________ _____
\   A  |  B  |    C    |  D   \
 \_____|     |         |_______\
       |_____|         |
             |_________|

चरण 2

एक ऑफ़लाइन एल्गोरिथ्म (जैसे दिज्क्स्त्र या ए *) प्रत्येक और प्रत्येक जोड़ी नोड्स के बीच सबसे छोटे पथ की गणना करेगा, और एक 2 डी मैट्रिक्स में पथ के पहले चरण को संग्रहीत करेगा , जिसका उपयोग शुरू और समाप्ति नोड द्वारा प्रत्येक आयाम में अनुक्रमित किया जाएगा। जैसे ऊपर दिए गए वॉक बॉक्स का उपयोग करना:

      ___ ___ ___ ___
     | A | B | C | D | <- Start Node
  ___|___|___|___|___|
 | A | A | A | B | C |  ---
 |___|___|___|___|___|     |
 | B | B | B | B | C |     |
 |___|___|___|___|___|     |-- Next node in shortest path
 | C | B | C | C | C |     |   from Start to End
 |___|___|___|___|___|     | 
 | D | B | C | D | D |  ---
 |___|___|___|___|___| 
   ^
   |
End Node

जैसा कि आप अनुमान लगा सकते हैं, नोड्स की संख्या में वृद्धि (एन ^ 2) के रूप में मेमोरी आवश्यकताओं में तेजी से वृद्धि होती है। चूंकि एक छोटा आमतौर पर मैट्रिक्स में प्रत्येक प्रविष्टि को स्टोर करने के लिए पर्याप्त बड़ा होगा, जिसमें 300 नोड्स का एक जटिल नक्शा होगा, जिसके परिणामस्वरूप एक अतिरिक्त मानक होगा:

300^2 * sizeof(short) = 176 kilobytes

चरण 3

दूसरी ओर, दो नोड्स के बीच सबसे छोटे पथ की गणना अत्यंत तेज और तुच्छ थी, बस मैट्रिक्स में लुकअप की एक श्रृंखला। कुछ इस तरह:

// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
    Current = LookUp[Current, End]
    Path.Add(Current)
ENDWHILE

C से A रिटर्न के लिए सबसे छोटा रास्ता खोजने के लिए इस सरल एल्गोरिथ्म को लागू करना:

1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit

सवाल

मुझे संदेह है कि आज के शक्तिशाली हार्डवेयर के साथ, हर स्तर के लिए ऐसा करने की स्मृति आवश्यकताओं के साथ युग्मित, इस तकनीक के किसी भी लाभ को एक बार रनवे पर केवल ए * प्रदर्शन करने से अब बाहर कर दिया गया है।

मैंने यह भी सुना है कि आजकल मेमोरी लुकअप भी सामान्य गणना की तुलना में धीमा हो सकता है, यही कारण है कि साइन और कोसाइन लुक टेबल बनाना उतना लोकप्रिय नहीं है।

लेकिन मुझे स्वीकार करना चाहिए कि मैं अभी भी निम्न-स्तरीय हार्डवेयर दक्षता के इन मामलों के बारे में जानकार नहीं हूं, इसलिए मैं इस विषय पर अधिक परिचित लोगों की राय पूछने का मौका ले रहा हूं।

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

निचला रेखा, क्या यह तकनीक किसी भी परिदृश्य में आजकल भी प्रासंगिक है?


2
मुझे लगता है कि यह अभी भी प्रासंगिक है यदि आप एक तंग सीपीयू बजट पर हैं। लेकिन एक बार जब आप गतिशील पथ चाहते हैं तो यह अब उपयोगी नहीं है। Btw मैंने देखा कि आपको अपना A * एल्गोरिथम कहाँ से मिला है और आप इसे एक minheap और कुछ अन्य ट्रिक का उपयोग करके और भी बेहतर बना सकते हैं। मैंने C # में A * को सुधारने के कुछ पुनरावृत्तियों को किया है जिसे आप यहाँ देख सकते हैं: roy-t.nl/index.php/2011/09/24/… उपयोगी हो सकता है।
रॉय टी।

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

1
BTW अगर आप प्री-कॉम्पटिशन को आगे बढ़ाने का फैसला करते हैं, तो आप फ्लोयड-वॉरसॉल एल्गोरिथम को देखना चाहते हैं । यह “अगला चरण” मैट्रिक्स को दिक्क्स्ट्रा / ए * के उपयोग से बार-बार अधिक कुशलता से बनाता है।
amitp

@amitp टिप के लिए धन्यवाद, इन विकल्पों के बारे में जानना हमेशा अच्छा होता है! हालांकि, चूंकि ज्यादातर मामलों में प्री-कॉम्पटिशन ऑफलाइन हो जाएगा, इसलिए इसे अधिक कुशल बनाने से ज्यादा फायदा नहीं होगा। जब तक आप वास्तव में अधीर हैं। :-)
डेविड गॉविया

सहमत, हालांकि फ्लोयड-वारशॉल भी दिज्क्स्ट्रा के एल्गोरिथ्म की तुलना में लागू करने के लिए बहुत सरल है, इसलिए यदि आपके पास पहले से ही दिक्जस्ट्रा नहीं है, तो यह देखने लायक है :)
amitp

जवाबों:


3

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

निचला रेखा, क्या यह तकनीक किसी भी परिदृश्य में आजकल भी प्रासंगिक है?

मैं इस तरह की तकनीक का उपयोग करने से कोई लाभ नहीं देख सकता।

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

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

मैंने यह भी सुना है कि आजकल मेमोरी लुकअप भी सामान्य गणना की तुलना में धीमा हो सकता है, यही कारण है कि साइन और कोसाइन लुक टेबल बनाना उतना लोकप्रिय नहीं है।

जब तक आप अपने सभी प्रोग्राम और उसकी ज़रूरत की मेमोरी को कैश में फिट नहीं कर सकते हैं, तब तक आप प्रोसेसर को बोतल से गर्दन पर रखने से पहले मेमोरी की तरह से चीजों को खींचने और बंद करने के लिए जा रहे हैं।

मुझे संदेह है कि आज के शक्तिशाली हार्डवेयर के साथ, हर स्तर के लिए ऐसा करने की स्मृति आवश्यकताओं के साथ युग्मित, इस तकनीक के किसी भी लाभ को एक बार रनवे पर केवल ए * प्रदर्शन करने से अब बाहर कर दिया गया है।

यह भी महसूस करें कि एआई को अपडेट करने के लिए कई गेम में अलग-अलग लूप हैं। मेरा मानना ​​है कि जिस तरह से मेरी परियोजना स्थापित की गई है वह यह है कि 60hz पर उपयोगकर्ता इनपुट के लिए एक अपडेट लूप है, एआई केवल 20 हर्ट्ज है, और गेम जितनी जल्दी हो सके।

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

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


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

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

2
@ClassicThunder: की इस तकनीक को पूर्व की गणना में कुछ से सभी रास्ते स्थलों अक्सर कहा जाता है एएलटी : ऐतिहासिक स्थल और त्रिभुज-असमानता के साथ एक-स्टार : cs.princeton.edu/courses/archive/spr06/cos423/Handouts/GW05। पीडीएफ
पीटर जार्जेंस 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.