পরিচিত সারি সহ একটি ম্যাচ গেমটি অনুকূলকরণের জন্য অ্যালগরিদম


10

আমি ফ্লাওয়ার্জ নামে পরিচিত একটি গেমের জন্য সি # .NET এ সলভার লেখার চেষ্টা করছি। আপনার রেফারেন্সের জন্য, আপনি এটি এমএসএনে এখানে খেলতে পারেন: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz । আমি এটি মজাদার জন্য লিখছি, কোনও ধরণের অ্যাসাইনমেন্ট বা কোনও কাজের সাথে সম্পর্কিত নয়। এ কারণে, একমাত্র সীমাটি আমার কম্পিউটার (একটি ইন্টেল আই 7 কোর, 8 জিবি র‌্যাম সহ)। আমি যতটা উদ্বিগ্ন এটি অন্য কোথাও চালানোর দরকার নেই।

সংক্ষেপে, এর বিধিগুলি এরকম:

  • রঙিন ফুল দিয়ে ভরা একটি সারি আছে। এর দৈর্ঘ্য নির্বিচারে
    • সারিটি প্রভাবিত হতে পারে না
    • স্তরের শুরুতে কিউ তৈরি করা হয়
  • ফুলের একটি বা দুটি রঙ হয়।
    • যদি দুটি রঙ থাকে তবে তারপরে একটি বাহ্যিক রঙ এবং একটি অভ্যন্তরীণ রঙ রয়েছে। দুটি রঙের ক্ষেত্রে, বাইরের রঙটি ম্যাচের জন্য ব্যবহৃত হয়।
    • যদি কোনও মিল থাকে তবে বাহ্যিক রঙ অদৃশ্য হয়ে যায় এবং ফুলটি এখন অভ্যন্তরের ফুলের মতো একই রঙের সাথে একক রঙের ফুল
  • গেমটির লক্ষ্য একই রঙের তিনটি (বা আরও) এর ম্যাচ তৈরি করা
    • যখন একক রঙের ফুল কোনও ম্যাচের অংশ হয়, তখন এটি খালি জায়গা তৈরি করে, খেলার ক্ষেত্র থেকে সরানো হয়
    • আপনি দুটি রঙের ফুলের বাইরের রঙের বিপরীতে একক রঙের ফুলের সাথে মিল রাখতে পারেন। এই ক্ষেত্রে, একক রঙের ফুল অদৃশ্য হয়ে যায়, দ্বি-বর্ণের ফুলের বাইরের রঙ অদৃশ্য হয়ে যায় এবং অভ্যন্তরের রঙ অবশেষ থাকে
  • সারিটি খালি থাকলে আপনি রাউন্ডটি জয় করতে পারেন এবং কমপক্ষে একটি খালি জায়গা বাকি আছে
  • ক্যাসকেডিং ম্যাচগুলি সম্ভব। একটি ক্যাসকেড তখন হয় যখন তিনটি (বা আরও বেশি) বাহ্যিক ফুলগুলি অদৃশ্য হয়ে যায় এবং যখন তাদের অভ্যন্তরীণ রংগুলি 3 (বা আরও ফুল) এর আরও একটি চেইন তৈরি করে।
  • খেলার ক্ষেত্রটি সর্বদা 7x7
  • মাঠের কিছু জায়গা শিলা দ্বারা আচ্ছাদিত
    • আপনি পাথরে ফুল রাখতে পারবেন না
  • সারিটিতে একটি কোদালও থাকতে পারে যা আপনি কোনও স্থাপনা ফুলকে একটি অনাবৃত জায়গায় নিয়ে যেতে ব্যবহার করতে পারেন
    • আপনাকে কোদাল ব্যবহার করতে হবে, তবে আপনাকে আসলে ফুলটি সরিয়ে ফেলতে হবে না: এটি যেখান থেকে এসেছে সেখান থেকে এটি ঠিক রেখে দেওয়া পুরোপুরি আইনী
  • কাতারে রঙিন প্রজাপতিও থাকতে পারে। আপনি যখন এই প্রজাপতিটি কোনও ফুল ব্যবহার করেন, তখন ফুলটি প্রজাপতির রঙ পায় gets
    • দুটি রঙের ফুলের সাথে একটি প্রজাপতি প্রয়োগ করলে ফুল কেবল একটি রঙ পায়, তিতলিটির মতো
    • আপনি প্রজাপতিটি খালি জায়গায় বা কোনও ফুলের নষ্ট করতে পারেন যা ইতিমধ্যে এই রঙ রয়েছে
  • মাঠ সাফ করা গেমটি জিততে পারে না

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

বলাই বাহুল্য, সন্ধানের স্থানটি বৃহত্তর সারি যত বড় হয়ে যায় তাড়াতাড়ি বৃদ্ধি পায়, তাই একটি নিষ্ঠুর শক্তি প্রশ্ন থেকে যায়। কিউটি 15 থেকে শুরু হয় এবং আমি সঠিক মনে রাখি তবে প্রতি দুই বা তিনটি স্তরে 5 দিয়ে বৃদ্ধি হয়। এবং অবশ্যই, প্রথম ফুলটি (0,0) এবং দ্বিতীয়টি (0,1) এ স্থাপন করা প্রথমটিকে (1,0) এবং দ্বিতীয় ফুল (0,0) এ রাখার চেয়ে আলাদা, বিশেষত যখন ক্ষেত্রটি ইতিমধ্যে আগের রাউন্ডের ফুল দিয়ে জনবহুল। এ জাতীয় সাধারণ সিদ্ধান্ত এটি তৈরিতে না পার্থক্য তৈরি করতে পারে।

আমার যে প্রশ্নগুলি রয়েছে সেগুলি নিম্নলিখিত:

  • এটা কোন ধরণের সমস্যা? (ভ্রমন বিক্রয়কর্মী, ন্যাপস্যাক বা অন্য কোনও সংমিশ্রণ সমস্যা মনে করুন)। এটি জানার ফলে আমার গুগল-ফু আরও উন্নত করতে পারে।
  • কোন ধরণের অ্যালগরিদম আমাকে ভাল ফলাফল দিতে পারে, দ্রুত?

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

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

আমার অনুমান যে সমাধানকারীকে বোর্ডের কনফিগারেশন এবং যে সারিটি খালি করার চেষ্টা করা উচিত তা সর্বদা জানতে হবে।

আমি নিউরাল নেটওয়ার্ক এবং ফাজি লজিক সিস্টেমের মতো আরও কয়েকটি হিউরিস্টিক অ্যালগরিদম সম্পর্কে জানি, তবে কোনটি সবচেয়ে ভাল প্রয়োগ করা যায় তা জানার অভিজ্ঞতাটির আমার অভাব রয়েছে, বা যদি এমন আরও কিছু রয়েছে যা হাতের কাজটির জন্য আরও উপযুক্ত।


আমি একবার কাজ করেছিলাম যে যে কয়েকটি জটিল গেমটিতে আমি কাজ করছিলাম তার সন্ধানের স্থানটি 32 জিবি হবে। সেই সময়ে (আমার কাছে একটি 20 এমবি ডিস্ক ড্রাইভ ছিল) যা অপরিবর্তনীয় ছিল, তবে আজকাল এটি কিছু কম্পিউটারের জন্য র‌্যামে কেবলমাত্র ডাবল।
জোনাথন

মিলে গেলে কী কেবল একটি রঙের ফুলগুলি সম্পূর্ণ অদৃশ্য হয়ে যায়? এবং দুটি রঙযুক্ত ফুলগুলি কি তাদের এক-রঙের ফুলের একক রঙের বিপরীতে তাদের বাহ্যিক স্তরটির সাথে মেলে? আমি উভয়
বিবেচনার ভিত্তিতেই

@ স্টিভেনস্ট্যাডনিকি ধন্যবাদ! আমি সেই তথ্যটি মূল প্রশ্নের সাথে যুক্ত করেছি।
ব্যবহারকারী 849924

1
একটি ছোট নোট হিসাবে, ঘটনাক্রমে, অপ্রতিরোধ্যভাবে সম্ভবত এই সমস্যাটির 'বুলিয়ান' সংস্করণটি রয়েছে (বোর্ডটি পুরো ফাঁকা ফাঁকা রেখে কিউতে ফুল রাখার কোনও উপায় আছে?) এটি এনপি-সম্পূর্ণ; এটি ক্লিকোম্যানিয়া সমস্যা ( এরিকডেমাইন.অর্গ / ক্লিকোম্যানিয়া ) এর সাথে স্পষ্ট মিল রয়েছে যা এনপি-সম্পূর্ণ, এবং সমস্যাটি এনপি-এর চেয়ে শক্ত কিছু নয় কারণ একটি প্রস্তাবিত সমাধান দেওয়া হয়েছে ( বহুতল দৈর্ঘ্যের) কেবল সিমুলেশন চালিয়ে যাচাই করা সহজ। এর অর্থ হল যে অপটিমাইজেশন সমস্যা সম্ভবত এফপি ^ এনপিতে রয়েছে।
স্টিভেন স্টাডনিকি

উত্তর:


9

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

একটি লক্ষ্য মাপদণ্ড রয়েছে যা আপনাকে জানায় যে রাজ্যটি কখন "সমাধান করা" রাষ্ট্র। এবং একটি পাথ ব্যয় - প্রদত্ত রাষ্ট্রের অগ্রগতির ব্যয় (সর্বদা এই ক্ষেত্রে "1 পদক্ষেপ")।

এই ধরণের একটি প্রোটোটাইপিকাল ধাঁধাটি হ'ল 15 ধাঁধা । এবং এটি সমাধানের সাধারণ উপায় হ'ল একটি অবগত অনুসন্ধানের সাথে - উদাহরণস্বরূপ, ক্লাসিক হিউরিস্টিক অনুসন্ধান এ * এবং এর রূপগুলি।


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

আপনি যা চান তা চালনার ক্রম যা আপনাকে সেরা সমাপ্ত গেমের অবস্থা দেয়।

সুতরাং আপনাকে যা করতে হবে তা হ'ল সমস্যাটিকে কিছুটা ঘুরিয়ে দেওয়া। গেম বোর্ডটি "রাষ্ট্র" হওয়ার পরিবর্তে চলনগুলির ক্রম "রাষ্ট্র" হয়ে যায়। (অর্থাত: "ডি 2, এ 5, সি 7, বি 3, এ 3, ..." পজিশনে আইটেমগুলিকে সারিতে রাখুন)

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

এটি সমস্যাটিকে একটি অপ্টিমাইজেশনের সমস্যায় পরিণত করে , যা স্থানীয় অনুসন্ধান অ্যালগরিদম দিয়ে সমাধান করা যেতে পারে (যার অর্থ মূলত একটি প্রদত্ত রাজ্যের চারপাশে রাজ্য তৈরি করা এবং সেরা রাষ্ট্র নির্বাচন করা, রাষ্ট্রগুলির মধ্যে পথের যত্ন না নিয়েই)

এই ধরণের প্রোটোটাইপিকাল ধাঁধাটি হ'ল আট কুইন্স ধাঁধা

সমস্যার এই শ্রেণিতে, আপনি একটি ভাল সমাধানের জন্য রাষ্ট্রের স্থানটি অনুসন্ধান করছেন, যেখানে "ভাল" একটি উদ্দেশ্যমূলক ফাংশন (যা একটি মূল্যায়ন ফাংশন বা, জেনেটিক অ্যালগরিদমগুলির জন্য, একটি ফিটনেস ফাংশন ) দ্বারাও মূল্যায়ন করা হয় find

আপনার সমস্যার জন্য, একটি উদ্দেশ্যমূলক ক্রিয়াকলাপ 0 এবং N এর মধ্যে একটি মান ফিরিয়ে আনতে পারে, সারিতে থাকা আইটেমগুলির ব্যর্থতা অবস্থায় পৌঁছানোর আগে ব্যবহার করা হয়েছিল (যেখানে এন সারির দৈর্ঘ্য)। এবং অন্যথায়, এন + এম এর একটি মান, যেখানে এমটি সারিটি ফাঁকা থাকার পরে বোর্ডে ফাঁকা ফাঁকা জায়গাগুলির সংখ্যা। যেমন - মানটি তত বেশি, সমাধানটি "উদ্দেশ্যমূলকভাবে আরও ভাল"।

(এই মুহুর্তে, লক্ষ্য করার মতো বিষয় যে গেমটি চালাচ্ছে এমন কোডের বাইরে আপনার বাজেটটি অনুকূল করা উচিত - এটি একটি রাষ্ট্রকে একটি সমাপ্ত বোর্ডে পরিণত করে যা উদ্দেশ্যমূলক কার্যের জন্য ব্যবহার করা যেতে পারে))


স্থানীয় অনুসন্ধান অ্যালগরিদমের উদাহরণ হিসাবে : মৌলিক প্যাটার্নটি একটি পাহাড়-আরোহী অনুসন্ধান যা একটি প্রদত্ত রাষ্ট্র গ্রহণ করে, এটিকে পরিবর্তন করে এবং পরবর্তী অবস্থার দিকে এগিয়ে যায় যা আরও ভাল ফলাফল দেয়।

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

এর একটি বিশেষ প্রকরণ হ'ল জেনেটিক অ্যালগরিদম ( উইকিপিডিয়া )। জেনেটিক অ্যালগরিদমের প্রাথমিক পদক্ষেপগুলি হ'ল:

  1. রাষ্ট্রকে কোনও ধরণের স্ট্রিংয়ে রূপান্তর করার কোনও উপায় নির্ধারণ করুন। আপনার ক্ষেত্রে এটি 1 থেকে 49 পর্যন্ত সারি-দৈর্ঘ্যের অঙ্কগুলির একটি স্ট্রিং হতে পারে (7x7 বোর্ডের সমস্ত সম্ভাব্য স্থান নির্ধারণ করে, সম্ভবত প্রতিটি বাইট 1 টি সংরক্ষণ করা হয়)। (আপনার "কোদাল" টুকরোগুলিটির প্রতিটি পর্যায়ে পরবর্তী দুটি সারি প্রবেশদ্বার দ্বারা প্রতিনিধিত্ব করা যেতে পারে))
  2. এলোমেলোভাবে একটি প্রজনন জনসংখ্যা নির্বাচন করুন, আরও ভাল ফিটনেস রয়েছে এমন রাষ্ট্রগুলিকে উচ্চতর সম্ভাবনা প্রদান করে । বংশবৃদ্ধি জনসংখ্যার মূল জনসংখ্যার সমান আকার হওয়া উচিত - আপনি একাধিকবার মূল জনসংখ্যা থেকে রাজ্যগুলি চয়ন করতে পারেন।
  3. প্রজনন জনগোষ্ঠীতে যুক্ত করুন রাজ্যগুলি (প্রথমটি দ্বিতীয় সহ দ্বিতীয় যায়, তৃতীয়টি চতুর্থ সাথে যায় ইত্যাদি)
  4. এলোমেলোভাবে প্রতিটি জোড়ার জন্য ক্রসওভার পয়েন্ট নির্বাচন করুন (স্ট্রিংয়ের একটি অবস্থান)।
  5. ক্রসওভার পয়েন্টের পরে স্ট্রিংয়ের অংশটি অদলবদল করে প্রতিটি জুটির জন্য দুটি বংশধর তৈরি করুন।
  6. এলোমেলোভাবে প্রতিটি বংশের রাষ্ট্রের পরিবর্তন করুন। উদাহরণস্বরূপ: এলোমেলোভাবে স্ট্রিংয়ের এলোমেলো অবস্থানটিকে একটি এলোমেলো মানতে বেছে নিন।
  7. নতুন জনসংখ্যার সাথে প্রক্রিয়াটি পুনরাবৃত্তি করুন যতক্ষণ না জনসংখ্যা এক বা একাধিক সমাধানগুলিতে রূপান্তরিত হয় (বা প্রদত্ত সংখ্যক প্রজন্মের পরে বা যথেষ্ট ভাল সমাধান পাওয়া যায় না)।

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

সম্ভবত এই সমস্যাটি কাটিয়ে ওঠা সম্ভব। একটি ধারণা যা মনে আসে তা হ'ল অনুরূপ সামনের অংশগুলির সাথে যুক্ত রাষ্ট্রগুলির প্রজনন জোড় হওয়ার সম্ভাবনা তৈরি করে। এটি রাজ্যগুলির বংশবৃদ্ধির সংখ্যা বাছাইয়ের মতো সহজ হতে পারে them প্রজন্মের সংখ্যা বাড়ার সাথে সাথে স্ট্রিংয়ের শুরু থেকে শেষের দিকে ক্রসওভারের সম্ভাব্য অবস্থানটি ধীরে ধীরে স্থানান্তর করতে সহায়তা করতে পারে।

"বর্গক্ষেত্র পূর্ণ" ব্যর্থতার অবস্থার মুখোমুখি হওয়ার চেয়ে আরও প্রতিরোধক (এমনকি পুরোপুরি প্রতিরোধক) এমন একটি রাষ্ট্রের মধ্যে চলাচলের প্রতিনিধিত্বও উপস্থিত হতে পারে। সম্ভবত পূর্ববর্তী পদক্ষেপ থেকে আপেক্ষিক স্থানাঙ্ক হিসাবে পদক্ষেপের প্রতিনিধিত্ব করা। অথবা সরানো থাকার পরে প্রদত্ত অবস্থানের নিকটতম খালি স্থান নির্বাচন করুন।

এর মতো সমস্ত অ-তুচ্ছ এআই সমস্যাগুলির মতো এটির জন্য কিছুটা গুরুত্বপূর্ণ টিঙ্কারিংয়ের প্রয়োজন হবে।

এবং, যেমনটি আমি আগেই বলেছি, অন্যান্য বড় চ্যালেঞ্জটি কেবল আপনার উদ্দেশ্যমূলক ক্রিয়াকে অপ্টিমাইজ করা। এটিকে দ্রুত তৈরি করার ফলে আপনি প্রচুর পরিমাণে স্থান অনুসন্ধান করতে পারবেন এবং দীর্ঘ সারি নিয়ে গেমগুলির সমাধান অনুসন্ধান করতে পারবেন।


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


আমি ক্রসওভারের সাথে সেই সমস্যাটিও চিহ্নিত করেছি: এটি খুব সম্ভব যে কোনও সন্তানের কাতারে পাওয়া যায় না এমন চেয়ে বেশি আইটেম রাখা হয় (টিএসপির জন্য জিএর এক ধরনের ঘাটতি: তিনি সম্ভবত দু'বার বা আরও বেশি শহরে যেতে পারেন (বা না!) । সমম্বয় হতে পারে একটি আদেশ সমম্বয় ( permutationcity.co.uk/projects/mutants/tsp.html ) কাজ করতে পারে এটি বিশেষত প্রযোজ্য যখন আপনি প্যাচসমূহ ক্রম রাষ্ট্র আছে।।
user849924

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

ব্যর্থতা হ'ল হ'ল যখন আপনার কাছে চালগুলি চালানোর আর কোনও বিকল্প নেই, যেমন আপনি যখন খালি জায়গা ছেড়ে চলে যান এবং সেই পদক্ষেপের সাথে কোনও মিল থাকে না। আপনি যা বলছেন তার সাথে সমান: আপনার এটিকে ইতিমধ্যে দখল করা অবস্থানে রাখতে হবে (তবে এটি ঠিক তখনই শুরু হয় যখন আর কোনও জায়গা শুরু করার দরকার নেই)। আমি পোস্ট করা ক্রসওভারটি আকর্ষণীয় হতে পারে। ক্রোমোজোম এ-তে এ 1, বি 1, ..., জি 1, এ 2, বি 2 এবং সি 2 এবং ক্রোমোজোম বি G7 ... A7, G6, F6 এবং E6 এ রাখা হয়েছে। এ থেকে কয়েকটি র্যান্ডম নির্বাচন করুন এবং তাদের সূচি রাখুন। বি থেকে এ এর ​​পরিপূরক নির্বাচন করুন এবং তাদের সূচি রাখুন এবং একটি সন্তানের জন্য মার্জ করুন।
ব্যবহারকারী 849924

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

আমি এই দুটি কারণে উত্তর হিসাবে গ্রহণ করছি। প্রথম: আপনি আমাকে জিএটি এই সমস্যার জন্য কাজ করার জন্য প্রয়োজনীয় ধারণাটি দিয়েছিলেন। দ্বিতীয়: আপনি প্রথম ছিলেন। ; পি
ব্যবহারকারী 849924

2

শ্রেণীবদ্ধকরণ

উত্তরটি সহজ নয়। গেমের তত্ত্বের গেমগুলির জন্য কিছু শ্রেণিবিন্যাস রয়েছে তবে সেই গেমটির জন্য একটি বিশেষ তত্ত্বের সাথে কোনও স্পষ্ট 1: 1-ম্যাচ নেই বলে মনে হয়। এটি একত্রিত সমস্যা একটি বিশেষ ফর্ম।

এটি বিক্রয়কর্মী ভ্রমণ করছে না, এটি এমন কোনও আদেশের সিদ্ধান্ত নেবে যেখানে আপনি "নোডগুলি" পরিদর্শন করে শেষের থেকে পরবর্তী নোডে পৌঁছানোর জন্য কিছু ব্যয় করে। আপনি সারিটি পুনরায় অর্ডার করতে পারবেন না, আপনাকে মানচিত্রে সমস্ত ক্ষেত্র ব্যবহার করতে হবে না।

ন্যাপস্যাক মিলছে না কারণ "ন্যাপস্যাক" এ কিছু আইটেম রাখার সময় কিছু ক্ষেত্র খালি হয়ে যায়। সুতরাং এটি এর কিছু বর্ধিত রূপ হতে পারে তবে সম্ভবত অ্যালগরিদম এর কারণে প্রযোজ্য হবে না।

উইকিপিডিয়া এখানে শ্রেণিবদ্ধকরণ সম্পর্কে কিছু ইঙ্গিত দেয়: http://en.wikedia.org/wiki/Game_theory# টাইপ_ও_গেমস

আমি এটিকে "বিচ্ছিন্ন-সময়ের অনুকূল নিয়ন্ত্রণ সমস্যা" হিসাবে শ্রেণীবদ্ধ করব ( http://en.wikedia.org/wiki/Optimal_control ) তবে আমার মনে হয় না এটি আপনাকে সাহায্য করবে।

আলগোরিদিম

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

আপনার তখন কেবল নিম্নলিখিত অংশগুলি প্রয়োজন:

  1. গেমের রাজ্যের মডেল, যা গেমের সমস্ত তথ্য সঞ্চয় করে (যেমন বোর্ডের স্থিতি / মানচিত্র, সারি, সরানোর নম্বর / সারিতে অবস্থান)
  2. একটি সরানো জেনারেটর, যা আপনাকে প্রদত্ত গেমের অবস্থার জন্য সমস্ত বৈধ পদক্ষেপ দেয়
  3. একটি "কর সরান" এবং একটি "পূর্বাবস্থায় ফেরা" ফাংশন; যা গেমের স্থিতিতে প্রদত্ত (বৈধ) পদক্ষেপ প্রয়োগ / পূর্বাবস্থায় ফিরিয়ে আনবে। "ডু মুভ" ফাংশনটিতে "পূর্বাবস্থায় ফাংশন" করার জন্য কিছু "পূর্বাবস্থায় তথ্য" সঞ্চয় করা উচিত। গেমের স্থিতি অনুলিপি করা এবং প্রতিটি পুনরাবৃত্তিতে এটি সংশোধন করা অনুসন্ধান সন্ধানকে উল্লেখযোগ্যভাবে কমিয়ে দেয়! কমপক্ষে স্ট্যাকের উপর রাজ্য সংরক্ষণ করার চেষ্টা করুন (= স্থানীয় ভেরিয়েবল, "নতুন" ব্যবহার করে কোনও গতিশীল বরাদ্দ নেই)।
  4. একটি মূল্যায়ন ফাংশন, যা প্রতিটি গেমের রাজ্যের জন্য তুলনামূলক স্কোর দেয়
  5. অনুসন্ধান ফাংশন

গভীরতা-প্রথম অনুসন্ধানের জন্য এখানে একটি অসম্পূর্ণ রেফারেন্স বাস্তবায়ন:

public class Item
{
    // TODO... represents queue items (FLOWER, SHOVEL, BUTTERFLY)
}

public class Field
{
    // TODO... represents field on the board (EMPTY or FLOWER)
}

public class Modification {
    int x, y;
    Field originalValue, newValue;

    public Modification(int x, int y, Field originalValue, newValue) {
        this.x = x;
        this.y = y;
        this.originalValue = originalValue;
        this.newValue = newValue;
    }

    public void Do(GameState state) {
        state.board[x,y] = newValue;
    }

    public void Undo(GameState state) {
        state.board[x,y] = originalValue;
    }
}

class Move : ICompareable {

    // score; from evaluation function
    public int score; 

    // List of modifications to do/undo to execute the move or to undo it
    Modification[] modifications;

    // Information for later knowing, what "control" action has been chosen
    public int x, y;   // target field chosen
    public int x2, y2; // secondary target field chosen (e.g. if moving a field)


    public Move(GameState state, Modification[] modifications, int score, int x, int y, int x2 = -1, int y2 = -1) {
        this.modifications = modifications;
        this.score = score;
        this.x = x;
        this.y = y;
        this.x2 = x2;
        this.y2 = y2;
    }

    public int CompareTo(Move other)
    {
        return other.score - this.score; // less than 0, if "this" precededs "other"...
    }

    public virtual void Do(GameState state)
    {
        foreach(Modification m in modifications) m.Do(state);
        state.queueindex++;
    }

    public virtual void Undo(GameState state)
    {
        --state.queueindex;
        for (int i = m.length - 1; i >= 0; --i) m.Undo(state); // undo modification in reversed order
    }
}

class GameState {
    public Item[] queue;
    public Field[][] board;
    public int queueindex;

    public GameState(Field[][] board, Item[] queue) {
        this.board = board;
        this.queue = queue;
        this.queueindex = 0;
    }

    private int Evaluate()
    {
        int value = 0;
        // TODO: Calculate some reasonable value for the game state...

        return value;
    }

    private List<Modification> SimulateAutomaticChanges(ref int score) {
        List<Modification> modifications = new List<Modification>();
        // TODO: estimate all "remove" flowers or recoler them according to game rules 
        // and store all changes into modifications...
        if (modifications.Count() > 0) {
            foreach(Modification modification in modifications) modification.Do(this);

            // Recursively call this function, for cases of chain reactions...
            List<Modification> moreModifications = SimulateAutomaticChanges();

            foreach(Modification modification in modifications) modification.Undo(this);

            // Add recursively generated moves...
            modifications.AddRange(moreModifications);
        } else {
            score = Evaluate();
        }

        return modifications;
    }

    // Helper function for move generator...
    private void MoveListAdd(List<Move> movelist, List<Modifications> modifications, int x, int y, int x2 = -1, int y2 = -1) {
        foreach(Modification modification in modifications) modification.Do(this);

        int score;
        List<Modification> autoChanges = SimulateAutomaticChanges(score);

        foreach(Modification modification in modifications) modification.Undo(this);

        modifications.AddRange(autoChanges);

        movelist.Add(new Move(this, modifications, score, x, y, x2, y2));
    }


    private List<Move> getValidMoves() {
        List<Move> movelist = new List<Move>();
        Item nextItem = queue[queueindex];
        const int MAX = board.length * board[0].length + 2;

        if (nextItem.ItemType == Item.SHOVEL)
        {

            for (int x = 0; x < board.length; ++x)
            {
                for (int y = 0; y < board[x].length; ++y)
                {
                    // TODO: Check if valid, else "continue;"

                    for (int x2 = 0; x2 < board.length; ++x2)
                    {
                        for(int y2 = 0; y2 < board[x].length; ++y2) {
                            List<Modifications> modifications = new List<Modifications>();

                            Item fromItem = board[x][y];
                            Item toItem = board[x2][y2];
                            modifications.Add(new Modification(x, y, fromItem, Item.NONE));
                            modifications.Add(new Modification(x2, y2, toItem, fromItem));

                            MoveListAdd(movelist, modifications, x, y, x2, y2);
                        }
                    }
                }
            }

        } else {

            for (int x = 0; x < board.length; ++x)
            {
                for (int y = 0; y < board[x].length; ++y)
                {
                    // TODO: check if nextItem may be applied here... if not "continue;"

                    List<Modifications> modifications = new List<Modifications>();
                    if (nextItem.ItemType == Item.FLOWER) {
                        // TODO: generate modifications for putting flower at x,y
                    } else {
                        // TODO: generate modifications for putting butterfly "nextItem" at x,y
                    }

                    MoveListAdd(movelist, modifications, x, y);
                }
            }
        }

        // Sort movelist...
        movelist.Sort();

        return movelist;
    }


    public List<Move> Search()
    {
        List<Move> validmoves = getValidMoves();

        foreach(Move move in validmoves) {
            move.Do(this);
            List<Move> solution = Search();
            if (solution != null)
            {
                solution.Prepend(move);
                return solution;
            }
            move.Undo(this);
        }

        // return "null" as no solution was found in this branch...
        // this will also happen if validmoves == empty (e.g. lost game)
        return null;
    }
}

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

এটি যদি খুব ধীর হয় তবে আপনি হ্যাশ টেবিল হিসাবে দ্বি-ব্যক্তি-গেমের কয়েকটি পদ্ধতি প্রয়োগ করার চেষ্টা করতে পারেন। তার জন্য আপনাকে প্রতিটি গেমের রাষ্ট্রের জন্য একটি (পুনরাবৃত্তিমূলক) হ্যাশ কী গণনা করতে হবে যা আপনি মূল্যায়ন করে এবং এমন রাজ্যগুলি চিহ্নিত করে যা সমাধানের দিকে নিয়ে যায় না। যেমন প্রতিবার অনুসন্ধানের () পদ্ধতিটি "নাল" ফেরত দেওয়ার আগে অবশ্যই একটি হ্যাশ টেবিল এন্ট্রি তৈরি করতে হবে এবং অনুসন্ধানে প্রবেশ করার সময় আপনি পরীক্ষা করতে পারবেন কোনও ইতিবাচক ফলাফল ছাড়াই এই রাজ্যটি ইতিমধ্যে পৌঁছেছে কিনা এবং যদি তাই "নাল" ছাড়া ফিরে আসে আরও তদন্ত. এর জন্য আপনার একটি বিশাল হ্যাশ টেবিলের প্রয়োজন হবে এবং "হ্যাশ সংঘর্ষগুলি" গ্রহণ করতে হবে যার ফলে আপনি সম্ভবত একটি বিদ্যমান সমাধান খুঁজে পেতে পারেন না তবে এটি খুব সম্ভাবনা নয়, যদি আপনার হ্যাশ ফাংশনগুলি যথেষ্ট ভাল থাকে এবং আপনার টেবিলটি যথেষ্ট বড় (এটি গণনা-সক্ষম ঝুঁকির ঝুঁকি)।

আমি মনে করি এই সমস্যাটি সমাধান করার জন্য অন্য কোনও অ্যালগরিদম নেই (আপনার দ্বারা বর্ণিত হিসাবে) আপনার মূল্যায়ন কার্যটি সর্বোত্তম ...


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

এই উত্তরটি আমাকে মডেল এবং গেমের নিয়মগুলির সাথে কীভাবে কাজ করতে পারে তার জন্য ধারণা দেয়, তাই আমি এটিকে উজ্জীবিত করব। আপনার ইনপুট জন্য ধন্যবাদ!
ব্যবহারকারী 849924

@ ব্যবহারকারী 849924: হ্যাঁ, অবশ্যই মূল্যায়ন ফাংশন অবশ্যই তার জন্য একটি মূল্যায়ন "মান" গণনা করতে হবে। বর্তমান গেমের অবস্থা যত বেশি খারাপ হয়ে উঠবে (হারানোর কাছাকাছি), প্রত্যাবর্তনের মূল্যায়নের মানটি তত খারাপ। সবচেয়ে সহজ মূল্যায়ন হ'ল খালি ক্ষেতের সংখ্যা ফিরিয়ে দেওয়া return আপনি একই রঙের ফুলের পাশে প্রতিটি ফুলের জন্য 0.1 যোগ করে এটি উন্নত করতে পারেন। আপনার ফাংশন যাচাই করতে কিছু এলোমেলো গেমের রাজ্য চয়ন করুন, তাদের মান গণনা করুন এবং তাদের সাথে তুলনা করুন। আপনি যদি মনে করেন রাষ্ট্র একটি রাজ্য বি তুলনায় অনেক ভাল, স্কোর সম্মুখ একটি বি জন্য এক চেয়ে ভাল হতে হবে
SDwarfs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.