संभव के रूप में अधिक स्थान को कवर करने के लिए स्क्रीन पर खिड़कियों (व्यवस्थित) को व्यवस्थित करने के लिए एक एल्गोरिदम को कैसे तैयार किया जाए?


20

मैं एक सरल प्रोग्राम लिखना चाहूंगा जो विंडोज़ (चौड़ाई + ऊंचाई) और स्क्रीन रिज़ॉल्यूशन के सेट को स्वीकार करता है और स्क्रीन पर उन खिड़कियों की एक व्यवस्था को आउटपुट करता है जैसे कि विंडोज़ सबसे अधिक जगह लेते हैं। इसलिए एक खिड़की का आकार बदलना संभव है, जबकि बनाए रखने output size >= initial sizeऔर पहलू अनुपात। तो विंडो , मैं एक टुपल वापस करने के लिए एल्गोरिदम को पसंद करूंगा ।( x , y , w i d t h , h e i g h t )i(x,y,width,height)

मेरा मानना ​​है कि यह 2 डी नैकसैक की भिन्नता हो सकती है। मैंने वेब के चारों ओर परिणामों पर जाने की कोशिश की है, लेकिन उनमें अधिकतर पृष्ठभूमि (और कोई कार्यान्वयन नहीं) थी जो मेरे लिए अनुसरण करना कठिन बना।

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


1
यदि आप एक विंडो का आकार बदल रहे हैं, तो आप "इसके प्रारंभिक आकार को बनाए नहीं रख रहे हैं", बस इसका पहलू अनुपात, मुझे लगता है।
एम्रे

1
आप स्क्रीन को कवर करने के लिए एक विंडो का आकार बदल सकते हैं, समस्या क्या है?

2
मैंने सईद की दूसरी टिप्पणी की। यदि आप तुच्छ समाधानों को बाहर करना चाहते हैं, तो आपको न्यूनतम आकार जैसे अतिरिक्त अवरोधों की आवश्यकता है। लाभ नोटा: गणितज्ञों समस्याओं खपरैल का छत कॉल करने के लिए लग रहे हैं tessellations
राफेल

1
कहने के लिए बेहतर हो सकता है, आप न्यूनतम देखने योग्य विंडो क्षेत्र को अधिकतम करना चाहते हैं और अधिकतम देखने योग्य विंडो क्षेत्र को कम कर सकते हैं, लेकिन संघर्षों की अनुमति है या नहीं? कृपया इसे बग मुक्त बनाने के लिए अपने प्रश्न को संपादित करें, वर्तमान समस्या कथन के बारे में सोचना आसान नहीं है।

2
@ daniel.jackson: उनका सुझाव है कि आपको एक नक्षत्र के लिए प्रयास करना चाहिए जहां सबसे छोटी खिड़की यथासंभव बड़ी है, यानी आपके पास वास्तव में छोटी खिड़कियां नहीं हैं । गणित के अनुसार, आप कह सकते हैं आप अधिकतम के साथ डब्ल्यू खिड़कियों के सेट। minwWsize(w)W
राफेल

जवाबों:


9

यद्यपि आपका प्रश्न यह नहीं कहता है, मैं यह मान रहा हूं कि आप विंडो को ओवरलैप नहीं करना चाहते हैं।

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

मान लें स्क्रीन आकार है कि द्वारा xmax×ymax

प्रत्येक विंडो के लिए, , आप चर का एक सेट होगा एक्स मैं , y मैं , मैं , डब्ल्यू मैं और बाधाओंWixi,yi,hi,wi

  • xi,yi,hi,wi0
  • xi+wixmax
  • yi+hiymax
  • शायद खिड़कियों के न्यूनतम आकार पर भी कुछ अड़चनें, जैसे, और इसके बाद।hi100
  • पहलू की कमी: अगर पहलू अनुपात 3: 4, बाधा की तरह कुछ हो सकता है , जहां ε गैर सही खिड़की के लिए अनुमति देने के लिए कुछ छोटे गैर शून्य त्रुटि शब्द है आकार, अन्यथा आप समस्या को कम कर सकते हैं।4hiϵ3wi4hi+ϵϵ

अब आपको विंडो ओवरलैप की देखभाल करने की आवश्यकता है। खिड़कियों की एक जोड़ी के लिए, , जहां मैं j , आप निम्नलिखित की तरह की कमी, उत्पन्न करेंगे जो कब्जा है कि कोई कोने डब्ल्यू जे भीतर प्रकट होता है डब्ल्यू मैं । के लिए ( एक्स , वाई ) { ( एक्स जे , y जे ) , ( एक्स जे + डब्ल्यू जे , y जे ) , ( एक्स जे , yWi,WjijWjWi , बाधा उत्पन्न करें:(x,y){(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}

  • ¬(xixxi+wjyiyyi+hj)

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

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

चोको एक एकल चर के रूप में निर्दिष्ट एक उद्देश्य फ़ंक्शन को अधिकतम करने के लिए अनुमति देता है। इस विचार के आधार पर, आप निम्नलिखित को अधिकतम कर सकते हैं:

  • i(hi+wi)

एक बाधा लिख कर अधिकतम करने के लिए और कह चोको सी एस टीcost=i(hi+wi)cost


यह आशाजनक लग रहा है और मैं निश्चित रूप से चोको के साथ खेलूंगा कि यह कैसे काम करता है, और कितनी तेजी से।
daniel.jackson

लेकिन यह आम तौर पर वाक्यांश क्यों है? मुझे लगता है कि आप बाधाओं को रैखिक असमानताओं के रूप में वाक्यांश कर सकते हैं, जिसका अर्थ है कि आपके पास एक वैनिला रैखिक कार्यक्रम है।
सुरेश

@ सुरेश: विस्तार से बेझिझक। मैं तुरंत नहीं देखता कि कैसे।
डेव क्लार्क

1

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

Wwxw,yw,ww,hw

S

यह लगभग इतना काम करता है:

void fit(W, S, i, n, result)
    if i == n
        if S.score() < result.score()
            result = S
        return

    w = W[i]
    foreach x, y in S.coordinates()
        set w position to (x, y)
        while S.put(w) # check that w doesn't overlap with S's other windows and add it
            fit(W, S, i+1, n, result)
            S.windows.pop()
            w.grow()
        w.restoresize()

कुछ चीजें हैं जिन्हें सुधारना चाहिए:

  • S.coordinates()अभी बहुत धीमी है। यह सभी बिंदुओं की S.width x S.heightजाँच करता है और जाँचता है कि हर एक S की खिड़कियों में से एक में है या नहीं।

  • S.put()यह जांचता है कि क्या इसका पैरामीटर डेव के उत्तर में उल्लिखित परीक्षण करके शेष एस की खिड़कियों के साथ ओवरलैप करता है। हो सकता है कि अंतराल पेड़ों का उपयोग करके इसमें सुधार किया जा सकता है ?

  • S.score()wS.windows(hwww)

  • W

मैं वर्तमान में स्क्रीन और इसकी खिड़कियों का प्रतिनिधित्व करने के लिए एक उपयुक्त डेटा संरचना का पता लगाने की कोशिश कर रहा हूं, इसे इन प्रश्नों का समर्थन करने की आवश्यकता है:

  • निर्देशांक की एक सूची लौटाएं जहां एक दी गई खिड़की को दूसरों के साथ अतिव्यापी किए बिना तैनात किया जा सकता है
  • स्थिति x, y पर विंडो डालें (पहले से ही सत्यापित है कि यह ओवरलैप नहीं है)
  • सभी विंडो वापस करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.