यह कैसे निर्धारित किया जाए कि एक 3 डी वोक्सल-आधारित कमरा सील किया गया है, कुशलता से


10

मैं कुछ मुद्दों को कुशलता से निर्धारित करने के साथ रहा हूँ अगर बड़े कमरे एक voxel- आधारित 3 डी कमरे में सील कर रहे हैं। मैं एक ऐसे बिंदु पर हूं, जहां मैंने बिना किसी से मदद मांगे अपनी समस्या को हल करने की पूरी कोशिश की है, लेकिन हार मानने की कोशिश नहीं की, इसलिए मैं मदद मांग रहा हूं।

स्पष्ट करने के लिए, सील किया जा रहा है कि कमरे में कोई छेद नहीं हैं। ऑक्सीजन सीलर्स हैं, जो यह जांचते हैं कि कमरा सील है या नहीं, और ऑक्सीजन इनपुट स्तर के आधार पर सील करें।

अभी, यह है कि मैं यह कैसे कर रहा हूँ:

  • सीलर टाइल के ऊपर ब्लॉक पर शुरू (वेंट सीलर के शीर्ष चेहरे पर है), पुनरावर्ती पाश सभी 6 आसन्न दिशाओं के माध्यम से
  • यदि आसन्न टाइल एक पूर्ण, गैर-वैक्यूम टाइल है, तो लूप के माध्यम से जारी रखें
  • यदि आसन्न टाइल पूर्ण नहीं है, या एक वैक्यूम टाइल है, तो जांचें कि क्या यह आसन्न ब्लॉक है, पुनरावर्ती।
  • हर बार एक टाइल की जाँच की जाती है, एक काउंटर को घटाया जाता है
  • यदि गणना शून्य से टकराती है, यदि अंतिम ब्लॉक एक वैक्यूम टाइल से सटे हुए है, तो वापस लौटें कि क्षेत्र अनसाल्टेड है
  • यदि गिनती शून्य से टकराती है और अंतिम ब्लॉक एक वैक्यूम टाइल नहीं है, या काउंटर शून्य होने से पहले पुनरावर्ती लूप समाप्त हो जाता है (कोई वैक्यूम टाइल नहीं बची है)

यदि क्षेत्र सील नहीं है, तो कुछ परिवर्तनों के साथ लूप को फिर से चलाएं:

  • एक निर्वात टाइल के बजाय "सांस लेने वाली हवा" टाइल के लिए आसन्न ब्लॉकों की जाँच करना
  • एक decrementing काउंटर का उपयोग करने के बजाय, तब तक जारी रखें जब तक कोई आसन्न "सांस लेने वाली हवा" टाइल नहीं मिलती।
  • एक बार लूप समाप्त होने के बाद, प्रत्येक चेक किए गए ब्लॉक को एक वैक्यूम टाइल पर सेट करें।

यहाँ मैं कोड का उपयोग कर रहा हूँ: http://pastebin.com/NimyKncC

समस्या:

मैं हर 3 सेकंड में यह जांच कर रहा हूं, कभी-कभी एक सीलर को सैकड़ों ब्लॉकों के माध्यम से लूप करना होगा, और कई ऑक्सीजन मुहरों के साथ एक बड़ी दुनिया, इन कुछ पुनरावर्ती लूपों को सीपीयू पर बहुत मुश्किल हो सकता है।

मैं सोच रहा था कि क्या अनुकूलन के साथ अधिक अनुभव वाला कोई भी मुझे हाथ दे सकता है, या कम से कम मुझे सही दिशा में इंगित कर सकता है। बहुत बहुत धन्यवाद।


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

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

ओह, ठीक है अगर 3 सेकंड के समय सीमा में सैकड़ों वॉक्सल्स बदल सकते हैं, तो संभवतः आपके पास प्रदर्शन के साथ कई समस्याएं हैं। अक्षमताओं को खोजने के लिए अपना कोड प्रोफाइल करना शुरू करें। सौभाग्य!
MichaelHouse

जवाबों:


3

सबसे अच्छा समाधान कमरे के अपेक्षित आकार जैसे कई कारकों पर निर्भर करेगा।

  1. केवल यह जांचें, जब कुछ वास्तव में बदल रहा हो।

दृष्टिकोण 1:

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

दृष्टिकोण 2:

हो सकता है कि आपकी बाहरी संरचना कम संकलित हो - विचार करते हुए, कि एक ऐसी सतह है जहां पर कमरे हैं, आपको सभी 6 दिशाओं में जाने की आवश्यकता नहीं है, इसलिए आपको सतह के साथ यात्रा करनी चाहिए, हर टाइल को वैक्यूम के रूप में चिह्नित करें जो यू यात्रा करते हैं।


0

जब आप अपनी पुनरावर्ती खोज करते हैं, तो क्या आप सुनिश्चित करते हैं कि आप एक ही स्वर की कई बार जाँच नहीं कर रहे हैं? मैं आपके एल्गोरिथ्म का वर्णन करने के तरीके से नहीं बता सकता, लेकिन आपके पास यह संकेत करने के लिए किसी प्रकार का झंडा होना चाहिए कि क्या आपने पहले से ही एक स्वर का विस्तार किया है, इसलिए आप इसे एक से अधिक बार नहीं करते हैं।

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

संपादित करें:

मैंने आपके कुछ कोड को देखा। ऐसा लगता है जैसे आप यह बताने के लिए लिंक्डलिस्ट का उपयोग कर रहे हैं कि मेरे पहले पैराग्राफ में पहले से ही एक वॉक्सेल की जाँच की गई है या नहीं। यदि आपके पास इसके लिए लिंक्डलिस्ट के अलावा किसी अन्य चीज का उपयोग करते हैं तो आपके पास बेहतर परिणाम हो सकते हैं। शायद एक HashSet या कुछ कोशिश? यह आपके चेक विधि की जटिलता को O (n) से O (1) तक कम कर सकता है।


हाँ, मैं इसे "जाँच" नामक लिंक्डलिस्ट में जोड़ रहा हूँ, और फिर जाँचने से पहले कि सूची में स्थिति है या नहीं। मैंने सोचा कि अगर कुछ बदला है तो यह बेहद सीपीयू-गहन भी होगा, क्योंकि उस 3-सेकंड के समय में सैकड़ों स्वर हो सकते हैं। मैं देखता हूँ कि इस स्थिति में लिंक्डलिस्ट की तुलना हैशटैग से कैसे होती है, धन्यवाद।
निगेलमैन 1010
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.