2 ডি অ্যারেতে আকারগুলি সন্ধান করা, তারপরে অনুকূলিতকরণ


11

আমাকে সবেমাত্র একটি চিত্রের অনুমতি দেওয়া হয়েছে ... আমার গেমের নীচের চিত্রটিতে কিছু গাened় ব্লক দেখানো হয়েছে, যা "টি" আকারের অংশ হিসাবে স্বীকৃত হয়েছে। যেমন দেখা যায়, কোডটি লাল দাগগুলি সহ ব্লকগুলি অন্ধকার করে দিয়েছে, এবং সবুজ রূপরেখার সাথে "টি" আকারগুলি দেখেনি।

পছন্দসই নিদর্শন পাওয়া গেছে, তবে এখনও অনুকূলিত হয়নি

আমার কোডটি এক্স / ওয়াইয়ের মাধ্যমে লুপ করে, ব্যবহৃত হিসাবে ব্লক চিহ্নিত করে, আকারটি ঘোরায়, পুনরাবৃত্তি করে, রঙ পরিবর্তন করে, পুনরাবৃত্তি করে।

আমি দুর্দান্ত ট্র্যাপিডেশন দিয়ে এই চেকিংটি ঠিক করার চেষ্টা শুরু করেছি। বর্তমান ধারণাটি হ'ল:

  • গ্রিডের মধ্য দিয়ে লুপ করুন এবং সমস্ত প্যাটার্ন উপস্থিতিগুলি নোট করুন (ব্যবহৃত হিসাবে ব্লকগুলি চিহ্নিত করবেন না) এবং এগুলিকে একটি অ্যারেতে রেখেছেন
  • আবার গ্রিডের মধ্য দিয়ে লুপ করুন, এবার কোন প্যাটার্ন দ্বারা কোন ব্লকগুলি দখল করা হয়েছে তা লক্ষ করুন এবং সেইজন্য কোনগুলি একাধিক নিদর্শন দ্বারা দখল করা হয়েছে।
  • আবার গ্রিডের মধ্য দিয়ে লুপিং করা হচ্ছে, এবার কোন প্যাটার্নগুলি কোন নিদর্শনগুলিকে বাধা দেয় তা লক্ষ করে

এটাই ঠিক মনে হচ্ছে ... এখন আমি কী করব?

আমার মনে হয় আমাকে করতে হবে

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

(আমি অন্যান্য আকারগুলিও অন্তর্ভুক্ত করার ইচ্ছা নিয়েছি এবং বিরোধী আকারগুলির মধ্য দিয়ে যাওয়ার সময় সম্ভবত স্কোর ওজন বিবেচনা করা দরকার তবে এটি অন্য কোনও দিন হতে পারে)

আমি মনে করি এটি একটি বিন প্যাকিংয়ের সমস্যা নয় তবে আমি কী সন্ধান করব তা নিশ্চিত নয়। আশা করি এটি কার্যকর হয়েছে, আপনার সহায়তার জন্য ধন্যবাদ

সম্পাদনা প্রশ্নটির স্পষ্টতা থাকা সত্ত্বেও, সবাই মনে হয়েছে, হ্যাঁ,

আমি প্রতিটি বর্ণের মধ্যে সর্বাধিক "টি" আকার খুঁজতে চাই

(কারণ যদি আমি আপনাকে দু'এর জন্য পয়েন্ট দিই এবং আপনি তিনটি করে দিয়েছিলেন তবে আপনি কিছুটা বিরক্ত হবেন)


একটি লোভী অ্যালগরিদম কোডল্ডকে যোগ হওয়া ব্লকের সংগ্রহগুলিতে বোর্ডটি বিভক্ত করতে হবে। তারপরে প্রতিটি সংগ্রহের জন্য আপনি আকারগুলি দিয়ে টিআই পূরণ করার চেষ্টা করতে পারেন এবং পূরণের জন্য যে পরিমাণ ব্লক অন্ধকার হবে না তার উপর নির্ভর করে একটি স্কোর দিতে পারেন। ধরনের আমাকে en.wikiki.org/wiki/Knapsack_problem সম্পর্কে ভাবতে বাধ্য করে ।
জনাথন কনেল

2
আমি মনে করি প্রশ্নটিতে কিছু অনুপস্থিত রয়েছে। আপনি কি এমন একটি অ্যালগরিদম তৈরি করতে চান যা যথাসম্ভব "টি" আকৃতির গোষ্ঠী খুঁজে পায়?
মার্কাস ভন ব্রডি

যদি আমি আপনাকে বুঝতে পারি তবে আপনি সঠিক পথে যাচ্ছেন। আপনি অত্যধিক স্পষ্ট নয় এবং আপনি যদি তা বিস্তারিত বলতে পারতেন তবে আমি এটি পছন্দ করব।
আটুরস্যাম

উত্তর:


3

আমাকে দেখতে দিন যে আমি এটি সঠিকভাবে পেয়েছি কিনা, লাল চিহ্নিত ব্লকগুলি নীল ছিল এবং অ্যালগরিদম একটি টি আকার পেয়েছিল এবং তাদের লাল চিহ্নিত করেছে, এটি কি সঠিক? আপনার লক্ষ্য একই রঙিন ব্লকগুলির সাথে যথাসম্ভব টি টি আকার সন্ধান করা, এখন পর্যন্ত সঠিক আশা করি। আপনি যখন তাদের খুঁজে পান এবং বর্তমানে এটি অ্যালগরিদমের কার্যকারিতা হ্রাস করে তখন আপনি সেগুলি চিহ্নিত করুন (যেহেতু আপনি অনুকূল সমাধানটি মিস করতে পারেন)। আপনি সমস্ত আকারের জন্য অনুসন্ধান করার পরিকল্পনা করছেন এবং তারপরে কোনটি ব্যবহার করবেন এবং কোনটি ব্যবহার করবেন না তা বেছে নেওয়া। আমি কি এখন পর্যন্ত সঠিক? অ্যালগরিদম করা হয়ে গেলে আপনি টি আকারের মধ্যে থাকা ব্লকের পরিমাণকে সর্বাধিক করতে চান।

আমি যদি সঠিক হয়েছি তবে আমার মতে আপনার অবস্থার অনুকূল সমাধানটি নিম্নলিখিতটি।

আমরা পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিং ব্যবহার করব।

আমি বিশ্বাস করি আমি অতীতে এটি ব্যবহার করেছি:

http://sourceforge.net/projects/lpsolve/

http://lpsolve.sourceforge.net/5.5/Java/README.html

(আপনি এটি অনেক ভাষাতে কাজ করতে পারেন, আমি এটি পিএইচপি, জাভা এবং সি দিয়ে ব্যবহার করেছি)

আমরা যা করবো তা হ'ল বোর্ডে প্রতিটি সম্ভাব্য টি আকারটি নিবন্ধভুক্ত করা এবং তারপরে আচ্ছাদিত ব্লকের পরিমাণ সর্বাধিক করতে ILP ব্যবহার করুন। আইএলপি তাত্পর্যপূর্ণভাবে জটিল। আপনার বোর্ডের আকার বিবেচনা করে, এটি কোনও সমস্যা হবে না। আমি আইএলপি সহ গ্রাফগুলিতে আরও জটিল ন্যূনতম / সর্বাধিক প্রশ্নগুলি দৌড়েছি এবং এটি কেবল কয়েক সেকেন্ডের সাথে সম্পূর্ণ হতে 30 সেকেন্ডে 90 সেকেন্ড অবধি নিয়েছে এবং আপনার ক্ষেত্রে এটি একটি সেকেন্ডের ভগ্নাংশে পড়ে)।

আমি যা করার পরামর্শ দিচ্ছি:

  1. সমস্ত লাইন আকার সন্ধান করুন
  2. একই রঙের লাইন আকারের মধ্যে সমস্ত ছেদগুলি সন্ধান করুন
  3. সমস্ত ছেদটি অনুসন্ধান করে সমস্ত সম্ভাব্য টি আকার সন্ধান করুন।
  4. প্রতিটি টি আকারের জন্য লিনিয়ার সমস্যাতে বুলিয়ান ভেরিয়েবল সংজ্ঞা দিন ( 0 <= Bi <= 1) যেহেতু মানগুলি পূর্ণসংখ্যা হয়, যা 0 বা 1 ছেড়ে যায়।
  5. ছেদ করার জন্য প্রতিটি টি আকারের দম্পতির জন্য শর্ত তৈরি করুন ( Bi + Bj <= 1)
  6. উদ্দেশ্যমূলক ফাংশনটি হবে ("টি" আকারের ব্লকের যোগফল (i) * দ্বি)
  7. সলভারটি চালান এবং টি আকারগুলি অন্ধকার করুন যেখানে সলভারের সাথে সম্পর্কিত বুলিয়ান (গুলি) যেখানে অনুকূল সমাধানে 1।

এটি মূল্যবান জ্ঞান, আমি প্রায়শই কাজের প্রকল্পগুলির জন্য লিনিয়ার সলভার ব্যবহার করি।

ILP মূলত নির্বাচনের সমস্যাগুলি সমাধান করার একটি উপায় যেখানে আপনি কিছু লিনিয়ার ফাংশনের জন্য সর্বাধিক বা সর্বনিম্ন অর্জন করতে চান want

আপনি এখানে আরও পড়তে পারেন, ইন্টিজার লিনিয়ার প্রোগ্রামিং এবং লিনিয়ার প্রোগ্রামিং ব্যবহার করে প্রোগ্রামারটি কেবল একই যে কম্পিউটারের জন্য ইন্টিজার আরও জটিল, যার ফলে দীর্ঘ সময় চলতে পারে। আপনার ক্ষেত্রে নয়, এটি খুব সহজ এবং সবচেয়ে খারাপ ক্ষেত্রে মিলি সেকেন্ডের চেয়ে কম হওয়া উচিত।

আমার ধারণা আপনি এখানে আরও পড়তে পারেন:

http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns

এটি এটি ভালভাবে ব্যাখ্যা করে:

http://fisher.osu.edu/~croxton_4/tutorial/

এটি মূলত একটি সিদ্ধান্ত সমস্যার সমাধানকারী, কীভাবে সিদ্ধান্ত নিতে পারেন যা আপনার ফলাফলটি সর্বাধিক করে তোলে। এটি এমন ফাংশন ধরে নিয়েছে যে ফলাফলটি লিনিয়ার এটি বিচার করে যা আপনার নির্দিষ্ট বর্তমান ক্ষেত্রে এটি। এই ক্ষেত্রে ফলাফলটি বিচার করে এমন ফাংশন, আপনি অন্ধকার করার সিদ্ধান্ত নিয়েছেন এমন সমস্ত টি আকারের জন্য ব্লকগুলি যোগ করে।

গাণিতিকভাবে, কীভাবে ভেরিয়েবলগুলি সেট করবেন: আমাদের বর্তমান ক্ষেত্রে বুলিয়ানস (আমি কি সূচক দিয়ে টি আকৃতিটি অন্ধকার করেছিলাম) সর্বাধিক মানগুলিতে পরিণত করতে চাই ফলাফলটি: ছেদকৃত টি আকারগুলি অন্ধকার না করে যতটা সম্ভব ব্লককে অন্ধকার করে। যতক্ষণ আপনি চান ফলাফলটি লিনিয়ার ফাংশন দিয়ে গণনা করা যায় যখন আপনার সমস্ত ভেরিয়েবল সেট থাকে এটি সমাধান করবে। আমাদের ক্ষেত্রে, আমরা টি টি আকারগুলি অন্ধকার করে ফেলেছি এবং তারা যে ব্লকগুলি আচ্ছাদন করে তা যোগ করে তা পরীক্ষা করি।

এখানে চিত্র বর্ণনা লিখুন

আমি জানি এটি তুচ্ছ নয় তাই যদি আপনি এই লিপটি বেছে নিতে বেছে নেন তবে বিনা দ্বিধায় মন্তব্য করুন এবং আমি বিশদভাবে বর্ণনা করব।


আপনার সহায়তার জন্য আর্থারকে ধন্যবাদ। হজম হতে কয়েকটা পড়তে পারে। এবং হ্যাঁ, আপনি সমস্যাটি সঠিকভাবে বুঝতে পেরেছিলেন। আপনি যদি বিস্তারিতভাবে বর্ণনা করতে চান তবে আমি খুব আগ্রহী হব (না, না এটি তুচ্ছ নয়) তবে আমার কোথায় যাওয়া হচ্ছে সেদিকে এটি আমাকে সহায়তা করতে পারে!
অ্যাসেমব্লার

আপনি কোন ভাষা প্রয়োগের জন্য ব্যবহার করছেন?
আতুরস্যামস

ক্রিয়া স্ক্রিপ্ট 3! সবার প্রিয়!
এসেম্ব্লার

একই অবস্থা. আমি as3 এ একটি বাস্তবায়ন লিখব এবং তা মন্তব্য সহ ডাউনলোডের জন্য একটি গিথুবে আপলোড করব, ধাপে ধাপে - আমি আজ এটি পরে করতে পারি
আতুরস্যামস

আপনার কি কোনও নির্দিষ্ট অঞ্চল 1 -7 রয়েছে যেখানে আপনি আমাকে আরও মন্তব্য যুক্ত করতে বা বিস্তৃত করতে চান? বিটিডব্লিউ, এএস 3 প্রেমীদের জন্য সুসংবাদ, অ্যাডোব ফ্লাসসিসি প্রকাশ করেছে যা সি ++ সমর্থন করে যাতে আমরা বিদ্যমান লিনিয়ার সলভারগুলি সহজেই ব্যবহার করতে পারি। :)
আতুরস্যামস

4

আপনার গ্রিডে টি-আকারের সমস্ত সংখ্যার (সম্ভবত ওভারল্যাপিং) একটি তালিকা তৈরি হয়ে গেলে আপনি যা রেখে গেছেন তা সর্বাধিক সেট প্যাকিংয়ের সমস্যা।

সাধারণভাবে, এটি একটি এনপি-সম্পূর্ণ সমস্যা। তবে, আপনার গ্রিড যথেষ্ট ছোট (এবং সাধারণত এটি আরও ছোট স্বল্প সাব-প্রবলেমগুলিতে বিভক্ত হয়) যে সঠিক সমাধানগুলি পাওয়া সম্ভব হবে।


সংযোজন: এখানে একটি প্রাথমিক ব্যাকট্র্যাকিং অনুসন্ধান আলগোরিদিম যা কৌশলটি করতে পারে:

function max_packing_recursive ( set A, set S, set M ):
    if |M| < |S| then let M = S;
    for each shape X in A do:
        remove X from A;
        let B = A;
        remove all shapes that intersect with X from B;
        if |M| < |B| + |S| + 1 then:        // upper bound
            let M = max_packing_recursive( B, S + {X}, M );
        end if
        if |M| >= |A| + |S| then return M;  // shortcut
    end for
    return M;
end function

function max_packing( set A ):
    return max_packing_recursive( A, {}, {} );
end function

এখানে, {X, Y, Z}উপাদান ধারণকারী সেট উল্লেখ করে X, Yএবং Z(সঙ্গে {}খালি সেট হওয়া), এবং |Q|সেট আকার উল্লেখ করে Q

রিকার্সিভ ফাংশনে, সেটটিতে Aঅবশিষ্ট সমাধানের জন্য উপলব্ধ আকারগুলি উপস্থিত Sরয়েছে , বর্তমান সমাধান প্রার্থীর মধ্যে আকার রয়েছে এবং Mএটি এখন পর্যন্ত সর্বাধিক সমাধান (যা আপনি এটি ব্যাক আপের পরিবর্তে বৈশ্বিক পরিবর্তনশীল হিসাবে সঞ্চয় করতে চাইতে পারেন) কল চেইন)। গুরুত্বপূর্ণ অপ্টিমাইজেশনটি চিহ্নিত চিহ্নিত রেখায় রয়েছে // upper boundযা অনুসন্ধান গাছের শাখাগুলি ছাঁটাই করে যেগুলি সম্ভবত এর চেয়ে ভাল সমাধান আর ফিরে আসতে পারে না M

(আসলে, যেহেতু আমরা জানি যে প্রতিটি টি-আকৃতি ঠিক চার সাইট, রয়েছে অনেক ভালো ঊর্ধ্ব আবদ্ধ প্রতিস্থাপন দ্বারা প্রাপ্ত করা যেতে পারে |B|যে আকার দ্বারা আচ্ছাদিত স্বতন্ত্র সাইট নম্বর দিয়ে Bজন্য, চার দ্বারা বিভক্ত এবং নিচে বৃত্তাকার (এবং একইভাবে |A|উপর লাইন চিহ্নিত করা হয়েছে // shortcut) উপরে বর্ণিত অ্যালগরিদম তবে আকারের স্বেচ্ছাসেবী সংগ্রহের জন্য কাজ করে))

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


হ্যাঁ, আমি মনে করি সমস্যার আকারের কারণে তুলনামূলকভাবে বেদাহীনভাবে সমাধান করার জন্য তিনি একটি আইএলপি ব্যবহার করতে পারেন .. 2 ^ 20 ~ = 1,000,000 সুতরাং যেহেতু কেবলমাত্র অনেকগুলি টি আকার থাকতে পারে, তাই এটির জন্য একটি লিনিয়ার সল্ভার ব্যবহার করে তাকে ভাল করা উচিত । এটি সুস্পষ্টভাবে তাত্পর্যপূর্ণ জটিল (কোনও ব্যক্তি যদি পি = এনপি প্রমাণ করতে না পারে ততক্ষণ পর্যন্ত)। আকারটি এই তুলনামূলক সহজ ক্ষেত্রে হিউরিস্টিকস এড়াতে দেয়।
আতুরস্যামস

ইলমারি, আপনাকে অনেক ধন্যবাদ। এই উত্তরটিও বুঝতে কয়েকটা সময় নেবে। নির্বিচারে আকার বিট ভবিষ্যতের পুনরাবৃত্তিতে ভাল কার্যকর হতে পারে be
অ্যাসেমব্লার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.