मैं अन्य एजेंटों से बचने के लिए A * एजेंट कैसे बनाऊं?


19

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

यह उस स्थिति को छोड़कर ठीक काम करता है जहां एजेंटों को अलग-अलग दिशाओं से एक ही टाइल पास करनी होती है। इस तरह की स्थितियों में, एक इष्टतम समाधान एक एजेंट के लिए दूसरे के पारित होने की प्रतीक्षा करने के लिए होगा:

नमूना स्थिति

इसके अलावा, अगर कोई उत्तरी गलियारा नहीं है, तो पाथफाइंडिंग विफल हो जाती है।

मैं इस तरह के एक एल्गोरिथ्म को कैसे लागू कर सकता हूं?


2
"ट्रैफ़िक AI" बनाने का उत्तर ? यहाँ प्रासंगिक हैं
एको

कुछ टिप्पणी 1) मुझे लगता है कि मैं 100% ठीक है पर विचार नहीं कर रहा हूँ कि दो दुश्मनों को पार करते समय किसी तरह ओवरलैप कर सकते हैं। केवल अगर आप एक बहुत ही यथार्थवादी शैली चुनते हैं, तो यह अजीब होगा, लेकिन दूसरी तरफ यह एक ज़ेल्डा के साथ ठीक है। 2) आप एक (* 2, * 2) मानचित्र रिज़ॉल्यूशन के साथ पथ की अनुमति देने पर विचार कर सकते हैं, इसलिए दो शत्रु 1-यूनिट-वाइड पथ में पार कर सकते हैं। 3) आप अपने नक्शे भी डिज़ाइन कर सकते हैं ताकि कई रास्ते हमेशा उपलब्ध हों (शायद एक दिलचस्प बाधा, जो जानता है? :-))।
GameAlchemist

जवाबों:


18

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

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

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


19

आपकी समस्या को हल करने के बजाय, यहाँ नींबू लेने और नींबू पानी बनाने का एक तरीका है।

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

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

क्या कुछ इसी तरह से आप अपने टक्कर-उत्पादक एल्गोरिदम के नुकसान को मोड़ सकते हैं और इसे एक लाभ में बदल सकते हैं?


1
+1 मुझे यह पसंद है, यह विध्वंसक और पूरी तरह कार्यात्मक है =)
पैट्रिक ह्यूजेस

3

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

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

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

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


यह बिल्कुल - एक बहुत ही आम धारणा है कि पाथफाइंडिंग का मतलब है ए * है, और यह सिर्फ ऐसा नहीं है।
स्टीवन स्टडीनिकी

2

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


यहाँ एक पेपर है जो उस समय के क्यूब के बारे में बात करता है: www0.cs.ac.ac.uk/staff/D.Silver/web/Applications_files/… और यहाँ एक कार्यान्वयन है: all Tours-i.com/ASIPathginder
Rakka Rage

0

ए * जैसे एल्गोरिथ्म का उपयोग करते समय आपके पास लागत हेयुरिस्टिक के साथ काम करने में सबसे बड़ा अक्षांश होता है।

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

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

ऐसे मामले में जहां केवल एक ही रास्ता है, तो पथ खोज या तो विफल हो जाएगी या वे गतिरोध होने तक एक-दूसरे पर आगे बढ़ेंगे।

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

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


0

आम तौर पर मैं आपको स्टीयरिंग का उपयोग करने के लिए प्रेरित करूंगा पथ-अनुसरण के दौरान इस तरह की समस्याओं को हल व्यवहार । और आप अभी भी समूह व्यवहार के लिए प्रेरणा पाने के लिए उन पर बहुत कुछ ले सकते हैं। लेकिन दुर्भाग्यपूर्ण यह वास्तव में सरल टाइल आधारित आंदोलन के लिए सीधे लागू नहीं है।

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

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

  1. आप कैसे तय करते हैं कि अन्य एजेंट के आसपास एक और स्वीकार्य तरीका है या नहीं? आप अन्य एजेंट के लिए इंतजार नहीं करना चाहते हैं अगर उसके चारों ओर जाने के लिए पर्याप्त जगह है। दूसरे एजेंट पर विचार करते समय एक पाथफाइंडर विफलता उस स्थिति का एक स्पष्ट संकेत है जिसे आप ठीक करना चाहते हैं, लेकिन उदाहरण के लिए आप वहां लाए गए एक पाथफाइंडिंग विफलता होगी। लेकिन आप कर सकते हैं - थोड़ी गणना के साथ - यह तय करें कि क्या वैकल्पिक मार्ग ए * आपको सिर्फ एक छोटे सर्कल में दूसरे एजेंट के आसपास जाता है, या उत्तरी गलियारे की तरह पूरी तरह से अलग पथ का उपयोग करता है।

  2. मुझे नहीं पता कि एक एजेंट एक राउंड / ऑपरेशन के दौरान कितनी दूर यात्रा कर सकता है, लेकिन अगर वह बहुत दूर नहीं है, या यदि सभी एजेंट समानांतर चल रहे हैं, तो दोनों एजेंट रास्ते के दूसरे छोर पर इंतजार करने का फैसला करेंगे। यह अन्य एजेंट को संकेत देकर तय किया जा सकता है कि आप उसके रास्ते को मुक्त करते हैं।


0

संभावित समाधानों में से एक ऐसे तंग स्थानों में इकाई टक्कर को अक्षम करना होगा।

उदाहरण के लिए, Starcraft के खेल में, श्रमिक (SCV, Probes, Drones) एक दूसरे से टकराते नहीं हैं, जब खनन करते हैं।

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