2013-02-22 10 views
10

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

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

एकमात्र चीज जिसे मैं कोशिश करने के बारे में सोच सकता हूं, आकार के आधार पर ब्लॉक को ऑर्डर कर रहा है, सबसे पहले सबसे पहले रखता है, फिर अंत में सबसे छोटे को किसी भी छेद में फिट कर रहा है। लेकिन निश्चित रूप से ऐसे तरीके हैं जो पीछे हट सकते हैं।

क्या कोई हेरिस्टिक्स या अनुमानित एल्गोरिदम हैं जो मेरी मदद कर सकते हैं?

enter image description here

इसके अलावा, शायद मेरी gravatar दूर देता है कि इस मेगा मैन संबंधित है ...

+1

कृपया छवि – Navin

+1

जोड़ें अपनी छवि का मतलब यह है कि आप ब्लॉक के बीच की जगह चाहते हैं। क्या यह सच है? –

+0

@ एंड्रयू हां मैं करूंगा, लेकिन मुझे लगता है कि यह एल्गोरिदम को प्रभावित नहीं करेगा। मैं सिर्फ नाटक कर सकता था कि ब्लॉक सभी तरफ 1 इकाई से मोटा हो। – Tesserex

उत्तर

7

यह (Polyomino आकार पैकिंग) आम तौर पर:

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

http://gp.home.xs4all.nl/Site/Polyomino_Solver.html

http://gp.home.xs4all.nl/PolyominoSolver/downloadsolver.htm

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

http://www.math.missouri.edu/~stephen/software/

मैं अनिश्चित हूं कि अगर इन सॉफ्टवेयर के दोनों छेद के लिए अनुमति polyominoes का सबसे अच्छा फिट अनुमान लगाती है। लेकिन यह निश्चित रूप से इस तरह से 'decidable' है, इस अर्थ में कि आप निश्चित रूप से अपने समाधान में अतिरिक्त 1x1 polyominoes डालने और देख सकते हैं कि यह एक विशेष परिणाम मिल सकता है कि फिट बैठता है, तो परिणाम प्राप्त करने के लिए 1x1 टुकड़े हटा दें।

enter image description here

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

संबंधित मुद्दे