बौने किले की कमान के आदेश वास्तुकला


21

AI के लिए कमांड ऑर्डरिंग सिस्टम लागू करने का सबसे सुरुचिपूर्ण तरीका क्या है? बौने किले में उदाहरण के लिए जब आप लकड़ी काटने के लिए एक वनाच्छादित क्षेत्र को चिह्नित करते हैं, तो बौने निम्नलिखित क्रम से करते हैं:

  1. पेड़ के पास जाओ
  2. पेड़ को काटो
  3. लकड़ी को भंडार में वितरित करें
  4. दूसरे पेड़ पर जाओ
  5. और इसी तरह..

मेरे पास पहले से ही एक स्टैक कमांड काम कर रहा है। 1 जो निष्क्रिय अवस्था से पेड़ की मंजिल टाइल तक पहुंचता है।

जब मुझे डर लगता है कि मैं इस तरह से अधिक ऑर्डर बनाने पर कैसे गड़बड़ हो जाऊंगा:

घर बनाना

  1. स्टॉकपाइल पर जाएं
  2. निर्माण क्षेत्र में लकड़ी लाएं
  3. स्टॉकपाइल पर वापस जाएं
  4. निर्माण क्षेत्र में पत्थर लाओ
  5. चेतन इमारत प्रेत

रोपण

  1. स्टॉकपाइल पर जाएं
  2. खेत के लिए बीज लाएं

मदिरा बनाना

  1. स्टॉकपाइल पर जाएं
  2. अभी भी पौधे लाओ
  3. चेतन मदिरा बनाना

तो मेरा सवाल यह है कि मैं एक ही समय में बौना किले जैसी कमांड ऑर्डरिंग प्रणाली कैसे लागू करूं और स्पेगेटी कोड से बचूं? क्या कोई डेटा संरचना है जिसका मुझे अध्ययन करने की आवश्यकता है? क्या मुझे एक अलग xml फ़ाइल पर कमांड अनुक्रम डालने की आवश्यकता है?


1
बौना किला वास्तव में ऐसी व्यवस्था नहीं है। बौनों को एक समय में एक कार्य सौंपा जाता है, और निष्क्रिय बौने कुछ करने के लिए देखेंगे। ( "अरे, वहाँ एक पेड़ काटना के लिए चिह्नित किया है - मैं इसे काटना चाहिए!" / "अरे, वहाँ एक भंडार में कुछ लकड़ी नहीं - मैं इसे एक के लिए ले जाना चाहिए!")
user253751

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

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

@Attackfarm सिस्टम पहले से सभी कार्यों को तय नहीं करता है; न ही यह एक ही बौने को कई कार्य सौंपता है। एक कार्य शुरू में सौंपा गया है, और जब यह पूरा हो जाता है, तो इसका एक और कार्य उपलब्ध होने का परिणाम होता है।
user253751

जवाबों:


27

सबसे पहले आप देखते हैं कि आपकी कमांड एक सूची के रूप में है , इसलिए आपकी पहली वृत्ति उस संरचना को फिर से बनाने के लिए हो सकती है, और प्रत्येक बौना क्रम में उस सूची के माध्यम से चलेगा। हालांकि मैं सुझाव देता हूं कि सूची को चरणों में तोड़ना है , प्रत्येक चरण में पूर्वापेक्षाएँ हैं , और फिर आप पूरे कमांड को रिवर्स में चलाते हैं । मुझे एक उदाहरण के साथ प्रदर्शित करें:

लकड़ी काटना

  • मैं लकड़ी ले जा रहा हूँ, और एक भंडार में? हाँ : इसे छोड़ दो
  • क्या मैं लकड़ी ढो रहा हूँ? हाँ : एक भंडार में जाएँ
  • क्या मैं एक पेड़ पर हूँ? हाँ : काट दो
  • उपरोक्त सभी नहीं : एक पेड़ पर जाएं

इसके फायदे हैं:

  • लागू करने के लिए बहुत सरल है
  • लचीले - आप इस सूची को स्वतंत्र रूप से विघटित कर सकते हैं, आइटम जोड़ सकते हैं, आइटम हटा सकते हैं, आइटम जोड़ सकते हैं
  • कोई राज्य नहीं - आप इस सूची को किसी भी राज्य में किसी भी बौने के लिए ऊपर से चला सकते हैं, और बौना सिर्फ सही थम्ब TM करेगा

नुकसान:

  • यह छोरों में फंसना आसान है, क्योंकि कोई राज्य नहीं है और अटकने की कोई जागरूकता नहीं है

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


2
इससे स्टेटस ओवरराइड कमांड, एम आई भूखा होने देने का भी फायदा है ? यदि हाँ सब कुछ छोड़ दें और लकड़ी खाने की नौकरी के समान खाने के साथ "खाने" के लिए कार्य निर्धारित करें
शाफ़्ट फ़्रीक

7
@ratchetfreak "मुझे पता है कि मेरे किले की सुरक्षा मुझ पर निर्भर करती है ताकि मैं इस राक्षस से लड़ सकूं, क्योंकि यह आम नागरिकों पर हमला नहीं करता है, लेकिन, मेरा पेट अभी-अभी फूल गया है!" उस संबंध में DF की तरह इसे बहुत अधिक न बनाने की कोशिश करें: P
कर्नल तीस दो

मुझे लगता है कि यह उस चीज़ से मिलता-जुलता है (या कम से कम इस्तेमाल किया जाता है) जिसने प्लैनेपैक्ड की बिगड़ी हुई कलाकृतियों की अनुमति दी (यह निषिद्ध वस्तु के कारण था, जिसे कहा गया था लूपिंग)
डेस्टि्रटनर

3
@ColonelThirtyTwo उस funमें Wheres ? ;)
लास

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

10

यदि आप दृश्यों को सामान्य बना सकते हैं, तो बहुत कुछ स्पेगेटी कोड नहीं है।

प्रसव के मामले में जैसे: वर्कटैक एक वर्कप्लान के साथ काम करता है। वर्कप्लान कहता है कि किस प्रकार की संसाधन इकाई को किस तरह के घर से, कौन से एनीमेशन का उपयोग करना चाहिए, किस काम के लिए एनीमेशन का उपयोग करना चाहिए, काम करने का समय और ऐसे सभी विवरण। तो अंत में WorkTask की तरह लग सकता है:

  1. मानचित्र पर% संसाधन 1% खोजें
  2. % एनीमेशन_1% का उपयोग करके उस स्थान पर जाएं
  3. % समय के लिए% एनीमेशन_2% का उपयोग करके जगह पर काम करें
  4. % Req_resource1%% को% req_count1% गणना में लें
  5. % एनीमेशन% का उपयोग करके% होम% पर जाएं
  6. % Time_2% के लिए% एनीमेशन_6% अंदर प्रारंभ करें
  7. आदि..

हम वर्णित दृष्टिकोण का सफलतापूर्वक उपयोग करते हैं। हम अपने खेल में ~ 15 कार्य करते हैं। कुछ मुख्य बातें:

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

2
यह वह प्रणाली है जिसका उपयोग हम अपने बौने किले जैसे खेल में करते हैं। व्यवहार वृक्षों से कार्य सम्पन्न होते हैं। संसाधन व्यवहार द्वारा लॉक हो जाते हैं, और विफलता से अनलॉक हो जाते हैं। शीर्ष उत्तर द्वारा वर्णित एक्शन प्लानिंग दृष्टिकोण की तुलना में यह अधिक मजबूत और डिबग करना आसान है
18

5

तो यह आधारभूत स्थलाकृतिक छँटाई समस्या है।

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

अब, आमतौर पर ऐसे कई आदेश हैं (क्योंकि कुछ नोड्स पर कोई निर्भरता नहीं है और उन्हें कहीं भी रखा जा सकता है, और कुछ नोड्स में समान निर्भरताएं हैं और एक दूसरे पर निर्भर नहीं हैं, इसलिए वे स्वयं के बीच किसी भी क्रम में हो सकते हैं, और कोई भी नोड हो सकता है) निर्भरता होने के बाद इसे किसी भी स्थान पर रखा जाए, और इससे पहले नोड्स के आधार पर किया जाता है)।

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

आप प्राथमिकताओं को नोड्स में भी जोड़ सकते हैं, और कार्य ऐसे आदेशों को खोजने के लिए हो सकता है, उन सभी आदेशों के बीच जो निर्भरता को पूर्ण करते हैं, जिसमें पहले प्राथमिकता वाले नोड्स हैं।

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

अब इसे कैसे हल किया जाए - http://en.wikipedia.org/wiki/Topological_sorting

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