যতটা সম্ভব জায়গা কমানোর জন্য পর্দায় উইন্ডোজগুলি (আকার পরিবর্তনযোগ্য) সাজানোর জন্য একটি অ্যালগরিদম কীভাবে তৈরি করবেন?


20

আমি একটি সাধারণ প্রোগ্রাম লিখতে চাই যা উইন্ডোজের একটি সেট (প্রস্থ + উচ্চতা) এবং স্ক্রিন রেজোলিউশন গ্রহণ করে এবং স্ক্রিনে windows উইন্ডোগুলির এমন একটি বিন্যাস আউটপুট দেয় যাতে উইন্ডোজ সর্বাধিক স্থান নেয়। সুতরাং রক্ষণাবেক্ষণ output size >= initial sizeএবং দিক অনুপাতের সময় উইন্ডোটির আকার পরিবর্তন করা সম্ভব । উইন্ডো জন্য আমিi আলগরিদমটি একটি টিপল ফিরিয়ে দিতে চাই (x,y,width,height)

আমি বিশ্বাস করি এটি 2D ন্যাপস্যাকের ভিন্নতা হতে পারে। আমি ওয়েবের চারপাশে ফলাফলগুলি দেখার চেষ্টা করেছি তবে তাদের বেশিরভাগ পটভূমি রয়েছে (এবং কোনও বাস্তবায়ন হয়নি) যা আমার অনুসরণ করা শক্ত করে তোলে।

আমি দ্রুততম অ্যালগরিদম সম্পর্কে কম আগ্রহী, তবে আমার নির্দিষ্ট প্রয়োজনের জন্য ব্যবহারিক এমন কিছুতে বেশি।


1
আপনি যদি উইন্ডোর আকার পরিবর্তন করছেন, তবে আপনি "এর প্রাথমিক আকার বজায় রাখছেন না", কেবল তার দিক অনুপাত, আমি অনুমান করি।
এমেরে

1
আপনি স্ক্রিনটি কভার করতে একটি উইন্ডোর আকার পরিবর্তন করতে পারেন, সমস্যা কী?

2
আমি দ্বিতীয় সা Saeedদ এর মন্তব্য। আপনি যদি তুচ্ছ সমাধানগুলি বাদ দিতে চান তবে আপনার আকারগুলি ছোট করার লক্ষ্যে ন্যূনতম আকারের মতো অতিরিক্ত বাধাও দরকার। নোটা বেন: গণিতবিদরা মনে হয় টাইলিং সমস্যাগুলিকে টেসলেশন বলে
রাফেল

1
বলা বাহুল্য, আপনি ন্যূনতম দর্শনযোগ্য উইন্ডো অঞ্চলটি সর্বাধিক করতে চান এবং সর্বাধিক দেখারযোগ্য উইন্ডো অঞ্চলটি ন্যূনতম করতে চান, তবে দ্বন্দ্বগুলি অনুমোদিত কি না? আপনার সমস্যাটি বাগ মুক্ত করার জন্য দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন, বর্তমান সমস্যার বিবৃতি সম্পর্কে ভাবা সহজ নয়।

2
ওয়াটminwWsize(w)W

উত্তর:


9

যদিও আপনার প্রশ্ন এটি না বলে, আমি ধরে নিচ্ছি যে আপনি উইন্ডোজগুলি ওভারল্যাপ করতে চান না।

এই সমস্যার একটা পদক্ষেপ যেমন সমাধানকারী একটি বাধ্যতা ব্যবহার করা চোকো । আপনার সমস্যার এনকোডিংয়ের প্রতিবন্ধকতাগুলি কেবল একটি লিখে দেয়, একটি স্মার্ট উপায়ে কাজ করার জন্য সমাধানকারীকে সুর দেয় এবং তারপরে এটি চালিয়ে দেওয়া যায়। এর অর্থ হ'ল আপনার যে ভাবনাটি করতে হবে তা সমস্যাটি এনকোডিংয়ের একটি ভাল উপায় অনুসন্ধানে ব্যয় করা হবে, একটি অ্যালগরিদম তৈরি করতে এবং প্রোগ্রামিং ও সুর করার ক্ষেত্রে নয়। আপনাকে শুরু করার জন্য এখানে একটি আংশিক উত্তর is

অনুমান স্ক্রিন সাইজ হল ।xmax×ymax

প্রতিটি উইন্ডো, আপনার কাছে এবং সীমাবদ্ধতার একটি সেট থাকবেx i , y i , h i , w iWixi,yi,hi,wi

  • xi,yi,hi,wi0
  • xi+wixmax
  • yi+hiymax
  • উইন্ডোগুলির ন্যূনতম আকারে সম্ভবত কিছু রয়েছে, যেমন, এবং আরও কিছু কিছু।hi100
  • দিকের সীমাবদ্ধতা: যদি অনুপাতের অনুপাত 3: 4 হয় তবে এই প্রতিবন্ধকতা মতো কিছু হতে পারে , যেখানে হ'ল কিছু অ-শূন্য ত্রুটি শব্দ যা অ- অনুমতি দেয় উইন্ডো মাপ, অন্যথায় আপনি সমস্যার সীমাবদ্ধতা চাই।ϵ ϵ4hiϵ3wi4hi+ϵϵ

এখন আপনার উইন্ডো ওভারল্যাপের যত্ন নেওয়া দরকার। উইন্ডোজ, প্রতিটি জোড়া জন্য , যেখানে , আপনি নিম্নলিখিত, যা ক্যাপচার যে কোন কোণায় মত সীমাবদ্ধতা তৈরি করে দেব মধ্যে প্রদর্শিত । জন্য , বাধ্যতা উৎপন্ন: আমি ডব্লিউ ডব্লিউ আমি ( এক্স , Y ) { ( এক্স , Y ) , ( এক্স + + W , Y ) , ( এক্স , Y + + ) , ( এক্স জে + ডাব্লু জে , ওয়াই জে + এইচ জেWi,WjijWjWi(x,y){(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}

  • ¬(xixxi+wjyiyyi+hj)

এইভাবে নির্দিষ্ট হওয়া সীমাবদ্ধতাগুলি কেবল অ-ওভারল্যাপিং উইন্ডোগুলিকে বর্ণনা করে যা পর্দার চারপাশে ছড়িয়ে পড়ে না, কিছু ন্যূনতম আকারের সীমাবদ্ধতাগুলি পূরণ করে এবং এটি তাদের দিক অনুপাত সংরক্ষণ করে serve

একটি ভাল ফিট পেতে, আপনাকে একটি ম্যাট্রিক নির্দিষ্ট করতে হবে যা একটি ভাল লেআউট হওয়ার অর্থ কী তা ক্যাপচার করে। একটি সম্ভাবনা হ'ল আপনি ধরে নিতে পারেন যে আপনি উইন্ডোজ আকারে প্রায় সমান রাখতে চান এবং / অথবা আপনি "সাদা স্থান" হ্রাস করতে চান। আমি মনে করি না যে এটি চোকো ব্যবহার করে নির্দিষ্ট করা যেতে পারে তবে অন্য প্রতিবন্ধকতা সমাধানের মাধ্যমে এটি সম্ভব হতে পারে (অন্য কেউ এখানে সহায়তা করতে সক্ষম হতে পারে)।

চোকো একক ভেরিয়েবল হিসাবে নির্দিষ্ট কোনও উদ্দেশ্য ফাংশনে রিটকে সর্বাধিকতর করতে দেয়। এই ধারণার ভিত্তিতে, আপনি নিম্নলিখিতগুলি সর্বাধিকতর করতে পারেন:

  • i(hi+wi)

একটি বাধ্যতা লিখে বাড়ানোর লক্ষ্যে এবং কহন চোকো ।সি এস টিcost=i(hi+wi)cost


এটি আশাব্যঞ্জক বলে মনে হচ্ছে এবং এটি কীভাবে কাজ করে এবং কীভাবে দ্রুত তা দেখার জন্য আমি অবশ্যই চোকোর সাথে খেলব।
daniel.jackson

তবে কেন বাক্যাংশ এটি সাধারণত? আমি মনে করি আপনি সীমাবদ্ধতাগুলিকে রৈখিক বৈষম্য হিসাবে অভিহিত করতে পারেন, যার অর্থ আপনার কাছে যা রয়েছে তা ভ্যানিলা লিনিয়ার প্রোগ্রাম।
সুরেশ

@ সুরেশ: বিস্তৃত মনে করুন। কীভাবে করব তা তাত্ক্ষণিকভাবে দেখছি না।
ডেভ ক্লার্ক

1

আমি একটি ব্রুট ফোর্স সলিউশনের জন্য একটি প্রোটোটাইপ লিখতে শুরু করি, আশা করি এটি এমন একটি পয়েন্টে অনুকূলিত হতে পারে যেখানে এটি ব্যবহারিক হবে।

প্রথমত কিছু সংজ্ঞা: সমস্ত উইন্ডোর সেট হয়ে উঠুক । প্রতিটি জানালা গঠিত হয় X, Y স্থানাঙ্ক এবং প্রস্থ এবং উচ্চতা জন্য। একটি উইন্ডো সর্বনিম্ন প্রস্থ এবং উচ্চতা দিয়ে শুরু করা হয়।W X W , Y W , W W , WWwxw,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.put()ডেভের উত্তরে উল্লিখিত পরীক্ষা করে এর পরামিতিটি এস এর বাকী উইন্ডোগুলির সাথে ওভারল্যাপ করে কিনা তা পরীক্ষা করে। অন্তর গাছ ব্যবহার করে এই উন্নতি করা যেতে পারে ?

  • S.score()বর্তমানে যা কেবল সমস্ত উইন্ডোর ক্ষেত্রফল। আরও ভাল লেআউট উত্পাদন করতে এটি অন্যান্য ভেরিয়েবলের বিবেচনায় নেওয়া দরকার।wS.windows(hwww)

  • উপরের ফাংশনটির সর্বোত্তম সম্ভাব্য ফলাফল পেতে সমস্ত অনুমতি চেষ্টা করার প্রয়োজন।W

আমি বর্তমানে পর্দা এবং এর উইন্ডোগুলি উপস্থাপনের জন্য একটি উপযুক্ত ডেটা কাঠামো বের করার চেষ্টা করছি, এটি এই প্রশ্নের সমর্থন করা প্রয়োজন:

  • স্থানাঙ্কের একটি তালিকা ফিরিয়ে দিন যেখানে প্রদত্ত উইন্ডোটি অন্যদের সাথে ওভারল্যাপ না করেই স্থাপন করা যায়
  • x, y অবস্থানে উইন্ডো sertোকান (ইতিমধ্যে যাচাই করা হয়েছে যে এটি ওভারল্যাপ করে না)
  • সমস্ত উইন্ডোজ ফিরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.