पथ खोज में स्थितिजन्य जागरूकता


11

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

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

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

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

मुझे यकीन है कि मैं इसे हल करने की कोशिश करने वाला पहला व्यक्ति नहीं हूं और मैं समस्या पर कुछ इनपुट की सराहना करूंगा।


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

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

जवाबों:


8

इस तरह की स्थिति को सीधा ए * का उपयोग करके बेहतर तरीके से संभालने का तरीका खोज स्थान का विस्तार करना है। यही है, कल्पना कीजिए कि आपके चरित्र को ले जाने वाली वस्तुओं के प्रत्येक संयोजन के लिए कालकोठरी की एक अलग प्रतिलिपि मौजूद है।

कालकोठरी की प्रत्येक प्रति में, जो दरवाजे पास होने योग्य हैं वे वास्तव में वे हैं जो आइटम के संगत सेट का उपयोग करके पारित किए जा सकते हैं। एक कालकोठरी कॉपी से दूसरे में जाने का एकमात्र तरीका एक आइटम के स्थान पर खड़ा है और इसे चुनना है।

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

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

उदाहरण के लिए, मान लें कि आपके कालकोठरी में दस दरवाजे और पांच चाबियां हैं। फिर पूर्ण खोज स्थान में 25 * 32 = 800 नोड्स के लिए 2 * 10 + 5 = 25 महत्वपूर्ण स्थान, और 2 ^ 5 = 32 संभावित आइटम संयोजन होंगे। यह एक बहुत मामूली संख्या है, विशेष रूप से यह देखते हुए कि खोज स्थान का बहुत अधिक पहुंच से बाहर होने की संभावना है।


5

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

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

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

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

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

पुनश्च। यदि आप अपना कालकोठरी प्रक्रियात्मक रूप से बना रहे हैं, तो जैसा कि आप ऐसा करते हैं, आप निर्भरता के आदेश पर जानकारी संग्रहीत कर सकते हैं, बशर्ते आप पहले से ही खिलाड़ी की शुरुआती स्थिति को जानते हों।


2

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

सबसे पहले, एक स्वीकार्य आश्रित व्यक्ति को परिपूर्ण होना जरूरी नहीं है। इसे सिर्फ कम आंकना है और इसे कुछ नहीं से बेहतर होना है। यह देखते हुए कि आप वास्तविक दूरियों के साथ काम कर रहे हैं, ऐसा लगता है कि A * कम से कम कुछ मदद करेगा, और यहां तक ​​कि अगर अनुमानी खोज में बहुत सुधार नहीं करता है, तो यह शायद मानक चौड़ाई-पहले खोज से बेहतर होगा या इसी के समान।

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

हालांकि, यह सच है, कि ये जटिलताएँ A * को 'बहुत ही कुशल' के दायरे से 'सफल' कर देंगी, लेकिन शायद उस समय में नहीं, जिसकी मुझे आवश्यकता है। ' आपको क्या समयसीमा की आवश्यकता है? वास्तव में, आपको ऐसा करने की आवश्यकता क्यों है - क्या आपको वास्तव में सबसे छोटे मार्ग की आवश्यकता है, या क्या कोई उचित मार्ग पर्याप्त होगा?

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

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

अगर मैं 'सबसे छोटे रास्ते' की कसौटी पर खरा उतरना चाहता हूँ, तो यह क्या होगा:

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

एक बार जब मुझे वह काम मिल गया, तो मैं कुछ मामूली आशाओं पर विचार करूंगा - जैसे। कुंजियों वाले क्षेत्रों को अधिक संयम से भारित करना ताकि निम्न स्तर की पथाई करने के लिए कुंजी एकत्र करने के लिए छोटे चक्कर लगाने की अधिक संभावना होगी।


0

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

if (nodestoCheck.notempty())
    newNode = nodeToCheck.first;
    if (notpassed(newNode.pos, newNode.items))
        if (room(newNode).containItem)
            add NewNode + room(NewNode).items 
        else
            do normal A* algorithm for new Node

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


0

आप केवल सामान्य A * का उपयोग क्यों नहीं करते हैं, और मॉडल बंद दरवाजे को अगम्य क्षेत्रों के रूप में उपयोग करते हैं; एक बार जब आप कुंजी उठाते हैं (कुंजी टाइल पर चलते हैं?), तो उस विशेष रूप से बंद दरवाजे को एक निष्क्रिय क्षेत्र में बदल देता है।

इसका मतलब यह है कि आपका पथ-खोजक सबसे छोटा कीलेस मार्ग के लिए जाएगा , और यदि यह रास्ते में चाबियाँ पाता है, तो यह उस पथ में शामिल करेगा यदि वह मदद करता है।

जो मुझे बहुत उचित लगता है। यह सही नहीं है, लेकिन यह समस्या का एक सरल समाधान है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.