ऑटो-संगठित / स्मार्ट इन्वेंट्री सिस्टम?


11

पिछले एक हफ्ते से मैं यूनिटी 3 डी के साथ इन्वेंट्री सिस्टम पर काम कर रहा हूं। पहले तो मुझे Design3 में लोगों से मदद मिली, लेकिन जब तक हम पथ विभाजित नहीं करते, तब तक यह बहुत लंबा नहीं था, क्योंकि मुझे वास्तव में वे अपना कोड पसंद नहीं आया था, इसमें OOP की कोई गंध नहीं थी।

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

यहाँ मेरे काम का डेमो है।

हम अपने खेल में जो करना चाहेंगे, वह एक ऑटो-ऑर्गेनाइजिंग फीचर है - ऑटो-सॉर्ट नहीं। हम यह सुविधा चाहते हैं क्योंकि हमारी इन्वेंट्री 'वास्तविक समय' में रहने वाली है - रेजिडेंट ईविल 1,2,3 आदि की तरह नहीं, जहां आप गेम को रोकेंगे और अपनी इन्वेंट्री में चीजें करेंगे। अब लाश से घिरे हुए एक चिपचिपे स्थिति में अपने आप की कल्पना करें, और आपके पास गोलियां नहीं हैं, आप चारों ओर देखें, आप देखते हैं कि जमीन पर पास में गोलियां हैं, इसलिए आप उनके लिए जाते हैं और उन्हें लेने की कोशिश करते हैं, लेकिन वे डॉन नहीं करते हैं 'फिट नहीं! आप अपनी इन्वेंट्री को देखते हैं और पता करते हैं कि यदि आप कुछ वस्तुओं को पुनर्गठित करते हैं, तो यह फिट होगा! - अब खिलाड़ी - उस स्थिति में पुनर्गठन के लिए समय नहीं है क्योंकि वह लाश से घिरा हुआ है और मर जाएगा यदि वह रुक जाता है और स्थान बनाने के लिए इन्वेंट्री का आयोजन करता है (वास्तविक समय में इन्वेंट्री याद रखें, कोई रोक नहीं) - ' t यह स्वतः होने के लिए अच्छा है? - हाँ!

(मेरा मानना ​​है कि यह कुछ गेम में लागू किया गया है जैसे डंगऑन की घेराबंदी या कुछ और, इसलिए यह सुनिश्चित करने योग्य है)

उदाहरण के लिए इस तस्वीर को देखें:

ऑटो-सॉर्टिंग क्या करता है

हां, इसलिए यदि आप इस मुद्दे को ऑटो-सॉर्ट करते हैं, तो आपको अपने स्थान मिल जाएंगे, लेकिन यह बुरा है क्योंकि: 1- महंगा: यह उन रिक्त स्थान को मुक्त करने के लिए एक पूरे तरह के ऑपरेशन की आवश्यकता नहीं है, पहली तस्वीर में, बस लाल आइटम को स्लाइड करें नीचे बहुत बाईं ओर, और आपको वही स्थान मिलते हैं जो आपको ऑटो-सॉर्ट से मिले थे। 2- यह खिलाड़ी को परेशान कर रहा है: "मेरे सामान को फिर से ऑर्डर करने के लिए एफ ने आपको कौन बताया?"

मैं "कैसे कोड लिखने के लिए" इस के लिए, मैं सिर्फ कुछ मार्गदर्शन, जहां देखने के लिए के लिए पूछ रहा हूँ क्या एल्गोरिदम शामिल कर रहे हैं के लिए पूछ नहीं कर रहा हूँ? रेखांकन और सबसे छोटा रास्ता सामान से संबंधित यह कुछ है? मुझे उम्मीद है कि cuz नहीं मैंने अपने कॉलेज की पढ़ाई जारी रखने का प्रबंधन नहीं किया: / लेकिन अगर यह है, तो मुझे बताएं और मैं संबंधित सामान सीखूंगा।

सूचना केवल एक समाधान से अधिक हो सकती है। इसलिए मुझे लगता है कि मुझे सबसे पहले यह पता लगाना होगा कि क्या स्थिति 'सॉल्वेबल' है - अगर मुझे पता है कि कैसे सॉल्व करने योग्य है या नहीं, यह निर्धारित करना है, तो मैं इसे हल कर सकता हूं। मुझे बस उन स्थितियों को जानना होगा जो इसे 'सॉल्व' बनाती हैं। और मेरा मानना ​​है कि इसके लिए कुछ एल्गोरिदम / डेटा संरचना होनी चाहिए।

1x3 आइटम को फिट करने की कोशिश करने के एक से अधिक समाधान के लिए यहां एक तस्वीर दी गई है:

यहाँ छवि विवरण दर्ज करें

तीर केवल एक समाधान दिखाते हैं, लेकिन यदि आप देखेंगे तो आप एक से अधिक पाएंगे। यह वही है जो मैं अंततः ऑटो-सॉर्टिंग नहीं करता हूं, लेकिन एक समाधान ढूंढता हूं और इसे लागू करता हूं।

ध्यान दें कि अगर मैं इस पर समय बिताता हूं तो मैं इसे हल करने का तरीका लेकर आऊंगा, लेकिन यह सबसे अच्छा तरीका नहीं होगा, यह ऐसा है, जैसे अपने हाथों के बजाय अपने पैरों के साथ कार का पहिया पकड़ना! XD या बस एक मुद्दे को हल करने की कोशिश कर रहा है जिसमें सरणियों की आवश्यकता है, लेकिन आप अभी तक उनके अस्तित्व के बारे में नहीं जानते हैं! तो क्या यह करने के लिए सही दृष्टिकोण है?

कमेंट्री से अपडेट

@ स्टेफेन मैं वास्तव में कोई गुरु नहीं हूँ, आपने 'नॅप्सैक' और @BlueRaja का उल्लेख किया है - डैनी पफ्लुघोफ्ट ने 2 डी बिन पैकिंग एल्गो का उल्लेख किया है। क्या वे किसी तरह से संबंधित / समान हैं? - मैं अभी भी उलझन में हूं कि मुझे यह कैसे करना चाहिए।

और हाँ मैं पहले से ही एक "विधर्मी" का उपयोग कर रहा हूं, लेकिन मुझे वास्तव में नहीं पता था कि मैं था: डी यह पहला उपलब्ध स्लॉट पाता है, और देखें कि क्या आइटम वहां फिट बैठता है।

मुझे नहीं पता कि उनके "थोकपन" के आधार पर आइटम ऑर्डर करना (जिसे मैं nSlotsRequired = nRowsReq * nColsRec कहता हूं) काम करेगा, क्योंकि आपके पास एक 2x2 और 1x4 आइटम हैं उदाहरण के लिए, उनके पास एक ही थोकपन है, लेकिन अलग-अलग आकार और होंगे अगले आइटमों के शेष भाग कैसे जाएंगे इस पर एक अलग प्रभाव पड़ता है। इसलिए... :/

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


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

यही कारण है कि मैंने इसके बजाय (अधिक सामान्य इन दिनों) एक-स्लॉट-प्रति-आइटम प्रकार इन्वेंट्री मॉडल का फैसला किया। काश, मेरे पास आपके लिए एक समाधान होता, मैंने इस समस्या को छोड़ दिया ...
रेनो

@ BlueRaja-DannyPflughoeft मुझे आश्चर्य है कि क्या एक साधारण / कुशल एल्गोरिथ्म उपलब्ध है यदि आइटम कुछ आकृतियों तक सीमित थे?
कॉंगसबोंगस

आकृतियों को सीमित करने से जटिलता कम नहीं होती है, लेकिन सिर्फ यह सोचना आसान हो जाता है कि आपको लगता है कि जटिलता को संभाल लिया गया है, afaik।
पैट्रिक ह्यूजेस

@VeXe क्षमा करें, मैंने आपके प्रश्न पर अपडेट को याद किया। बिन पैकिंग और नैकपैक समान नहीं हैं। लेकिन दोनों समस्याओं पैकिंग कर रहे हैं। आपके मामले में 'मूल्य' आपकी इन्वेंट्री ऑब्जेक्ट का आकार और आकार है।
स्टीफन

जवाबों:


8

यह नैकपैक समस्या की एक भिन्नता है। डैनी Pflughoeft के रूप में यह एनपी-पूर्ण का उल्लेख है। इसका मतलब है कि यह रैखिक समय में हल नहीं किया जा सकता है, अगर मुझे सही याद है।

लेकिन आप इसे कई चरणों में हल करने का प्रयास कर सकते हैं। यह मूल रूप से एक छँटाई समस्या है।

मैं प्रत्येक आइटम के 'थोकपन' की गणना करके शुरू करूंगा: इसकी गणना कई तरीकों से की जा सकती है:

  • बल्कनेस = अधिकतम (लंबाई, चौड़ाई);

  • बल्कनेस = लंबाई * चौड़ाई

  • बल्कनेस = sqrt (लंबाई * चौड़ाई)

फिर वस्तु सूची में उच्चतम स्कोर के साथ आइटम डालना शुरू करें। चूंकि वे सबसे अधिक संभावना बाद में शेष स्थान में फिट नहीं होंगे। छोटे आइटम हमेशा फिट होंगे।

आपको अपने रखने की रणनीति के लिए एक हेरास्टिक (शिक्षित अनुमान के लिए एक फैंसी नाम ;-)) की आवश्यकता है। कुछ ऐसा है जो टॉप-लेफ्ट या कुछ से पहले फ्री स्लॉट में आइटम फिट करने की कोशिश कर रहा है।

डियाब्लो II इन्वेंट्री सॉर्टिंग रणनीति कुछ इसी तरह काम करती है जैसा मुझे लगता है। तलवार और भाले की तरह सामान ऊपर बाईं ओर, फिर कपड़े और कवच, फिर बकलर और इतने पर समाप्त हो जाएगा।

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


1
एनपी-पूर्ण बहुपद से अधिक जटिलता के साथ समस्याओं का एक समूह है। अपेक्षाकृत छोटी इन्वेंट्री के लिए (हजार से कम आइटम जो मैं कहूंगा :)) यहां तक ​​कि घातीय एल्गोरिदम भी बहुत तेजी से काम करेगा, क्योंकि इस तरह के एल्गोरिदम का एक कदम बहुत कम समय लगता है। फिर भी एक गतिशील प्रोग्रामिंग एल्गोरिथ्म को लागू करने की तुलना में आपके विचार का उपयोग करना काफी अच्छा और आसान होना चाहिए -> +1
मार्टिनटीवार्गा

उत्थान के लिए thx। हाँ इन्वेंट्री संभावित रूप से अनंत नहीं होनी चाहिए, इसलिए घातीय एल्गोरिदम ठीक काम करना चाहिए ^ ^
स्टीफन

@ sm4: एनपी-पूर्ण समस्याओं के लिए एक हजार आम तौर पर एक बड़ी संख्या है। याद रखें, ये समस्याएं O (2 ^ n) हैं - यहां तक ​​कि सिर्फ 2 ^ 64 कम्प्यूटेशनल रूप से अनम्य है!
ब्लूराजा - डैनी पफ्लुगुएफ्ट

3

Haha, @Everybody में मदद की, धन्यवाद जो। मैं आखिरकार इसे हल करने में कामयाब रहा। यहाँ मैं मूल रूप से क्या किया है:

IEnumerator AddItem_Sorted (Item item)
  1. तुच्छ हालत: जांच अगर हम मद ​​में फिट करने के लिए के लिए, अगर हम इसे क्या ज़रूरत मिनट nRequiredSlots मिला है, आगे बढ़ना ...
  2. हम सभी बैग खाली कर देंगे - वस्तुओं को प्लेसहोल्डर (सूची या कुछ) में डाल देंगे
  3. बहुत अंतिम स्लॉट / जगह में वांछित आइटम को जोड़ सकते हैं जो इसमें फिट हो सकता है, यह सुनिश्चित करता है कि यह अपने क्षैतिज आकार में सुनिश्चित है
  4. पहले फिट हम algo घटते का उपयोग कर हमारे आइटम के बाकी जोड़ देंगे
  5. जोड़ने के दौरान, हम उस प्रोग्राम को याद करने के लिए डायनामिक प्रोग्रामिंग (मेमॉज़ेशन) का उपयोग करेंगे जिसे हम (अगले उपलब्ध स्लॉट के इंडेक्स) में जोड़ रहे हैं
  6. अगर सभी को जोड़ने में सफलता मिलती है, तो हम अपने वांछित आइटम को फिट करने में कामयाब रहे, और किसी तरह बैग को बड़े से लेकर छोटे आइटम में बदल दिया
  7. अगर हम सभी आइटम नहीं जोड़ सकते हैं, तो इसका मतलब है कि, यह एक हल करने योग्य स्थिति नहीं थी, इसलिए हमें बैग को उसकी पिछली स्थिति में लाना होगा
  8. ऐसा करने का एक तरीका है, (मेरे दिमाग की सतह से बाहर आया), इस पूरे आपाधापी से पहले बैग की स्थिति को कॉपी करना है, और फिर अगर यह विफल रहता है तो हम उस पिछली स्थिति या इससे भी बेहतर, के दौरान ' बैग को खाली करते हुए, हम याद करते हैं कि प्रत्येक आइटम कहाँ था, ताकि यदि ऑप विफल हो जाए, तो हम उन्हें वापस लाएँगे - AddItem (आइटम, इंडेक्स) का उपयोग करके - उनके पिछले सूचक पर :)
  9. इस पूरी प्रक्रिया में समय लग सकता है, इसलिए हम अपनी प्यारी उपज का उपयोग करके, अलग-अलग फ्रेम पर लोड को विभाजित कर सकते हैं :)
  10. हो गया ! \ m / (@ ~ 9: 00)

अपडेट करें:

  1. मैंने एक सरणी बनाई जो सभी जोड़े गए सामानों के सूचकांकों को संग्रहीत करती है, इस तरह से मुझे जाने की ज़रूरत नहीं है और मेरे लिए कब्जे वाले स्लॉट्स को मुक्त करने के लिए देखें - बड़ा बढ़ावा।

  2. अंतिम स्लॉट में जोड़ने की कोई आवश्यकता नहीं है, वास्तव में कभी-कभी यह उस तरह से काम नहीं कर सकता है, मैंने अन्य आइटमों के लिए वांछित आइटम जोड़ दिया है और उनके साथ इसे सॉर्ट किया है।

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


आपका स्वागत है! :) मैं ब्लूराजा को धन्यवाद देना चाहूंगा - बिन पैकिंग का उल्लेख करने के लिए डैनी Pflughoeft, थोकता विचार के लिए @ स्टेपेन और अपने गतिशील प्रोग्रामिंग व्याख्यान के लिए रिचर्ड बकलैंड, और सभी व्याख्यान।
vexe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.