সি 99 - 3x3 বোর্ড 0.084 এ
সম্পাদনা করুন: আমি আমার কোডটি রিফ্যাক্ট করেছি এবং ফলাফলগুলি সম্পর্কে আরও গভীর বিশ্লেষণ করেছি।
আরও সম্পাদনা: প্রতিসমগুলি দ্বারা ছাঁটাই যুক্ত করা হয়েছে। এটি 4 টি অ্যালগরিদম কনফিগারেশন তৈরি করে: আলফা-বিটা ছাঁটাইয়ের সাথে বা ছাড়া প্রতিসাম্যযুক্ত এক্স ছাড়া
সর্বাধিক সম্পাদনা: একটি হ্যাশ টেবিল ব্যবহার করে স্মৃতিচারণ যুক্ত হয়েছে, অবশেষে অসম্ভবটি অর্জন করেছে: একটি 3x3 বোর্ড সমাধান করা!
প্রাথমিক বৈশিষ্ট্য:
- আলফা-বিটা ছাঁটাইয়ের সাথে মিনিম্যাক্সের সরাসরি বাস্তবায়ন
- খুব সামান্য স্মৃতি ম্যানেজমেন্ট (কার্যকর অনুসন্ধানের dll বজায় রাখে; গাছের অনুসন্ধানে শাখা প্রতি ও (1) আপডেট)
- প্রতিসম দ্বারা ছাঁটাই সহ দ্বিতীয় ফাইল। এখনও শাখা প্রতি ও (1) আপডেটগুলি অর্জন করে (প্রযুক্তিগতভাবে ও (এস) যেখানে এস প্রতিসম সংখ্যার সংখ্যা square এটি বর্গ বোর্ডের জন্য 7 এবং বর্গক্ষেত্র বোর্ডের জন্য 3)
- তৃতীয় এবং চতুর্থ ফাইলগুলি মেমোয়েজেশন যুক্ত করে। হ্যাশটেবলের আকার (
#define HASHTABLE_BITWIDTH
) এর উপরে আপনার নিয়ন্ত্রণ রয়েছে । এই আকারটি প্রাচীরের সংখ্যার চেয়ে বড় বা সমান হলে এটি কোনও সংঘর্ষ এবং ও (1) আপডেটের গ্যারান্টি দেয়। ছোট হ্যাশ টেবিলের আরও সংঘর্ষ হবে এবং কিছুটা ধীর হবে।
-DDEBUG
প্রিন্টআউটগুলির জন্য সংকলন করুন
সম্ভাব্য উন্নতি:
প্রথম সম্পাদনায় স্থির করা ছোট মেমরি ফাঁস
আলফা / বিটা ছাঁটাই দ্বিতীয় সম্পাদনায় যুক্ত করা হয়েছে
তৃতীয় সম্পাদনাতে ছাঁটাই করা প্রতিসাম্যগুলি (দ্রষ্টব্য যে প্রতিসাম্যগুলি মেমোজাইজেশন দ্বারা পরিচালিত হয় না , যাতে এটি পৃথক অপ্টিমাইজেশান থেকে যায়))
চতুর্থ সম্পাদনায় স্মৃতি যুক্ত করা হয়েছে
- মেমোয়েজেশন প্রতিটি প্রাচীরের জন্য একটি সূচক বিট ব্যবহার করে। একটি 3x4 বোর্ডের 31 টি দেয়াল রয়েছে, তাই এই পদ্ধতি 4x4 বোর্ড পরিচালনা করতে পারে না সময় সীমাবদ্ধতা নির্বিশেষে। উন্নতি হবে এক্স-বিট পূর্ণসংখ্যার অনুকরণ করা, যেখানে কমপক্ষে প্রাচীরের সংখ্যার চেয়ে বড় X
কোড
সংগঠনের অভাবে ফাইলের সংখ্যা হাতছাড়া হয়ে গেছে। সমস্ত কোড এই গিথুব সংগ্রহস্থলে সরানো হয়েছে । স্মৃতিচারণ সম্পাদনাতে, আমি একটি মেকফিল এবং পরীক্ষার স্ক্রিপ্ট যুক্ত করেছি।
ফলাফল
জটিলতার উপর নোটস
ব্রুট ফোর্স বিন্দু এবং বাক্সগুলিতে যোগাযোগ খুব দ্রুত জটিলতায় ফুটিয়ে তোলে ।
R
সারি এবং C
কলাম সহ একটি বোর্ড বিবেচনা করুন । আছে R*C
স্কোয়ার, R*(C+1)
উল্লম্ব দেয়াল, এবং C*(R+1)
অনুভূমিক দেয়াল। এটি মোট W = 2*R*C + R + C
।
যেহেতু লেম্বিক আমাদের মিনিম্যাক্স দিয়ে গেমটি সমাধান করতে বলেছিল, আমাদের গেম গাছের পাতাগুলিতে যেতে হবে। আসুন আপাতত ছাঁটাই উপেক্ষা করা যাক, কারণ কী বিষয়টিকে গুরুত্ব দেয় orders
আছে W
প্রথম পদক্ষেপ জন্য বিকল্প। যারা প্রতিটি জন্য, পরবর্তী প্লেয়ারের কোনো বাজাতে পারেন W-1
অবশিষ্ট দেয়াল, ইত্যাদি .. যে আমাদের একটি সার্চ-স্পেস দেয় SS = W * (W-1) * (W-2) * ... * 1
, অথবা SS = W!
। কারখানাগুলি বিশাল, তবে এটি কেবল শুরু। অনুসন্ধান স্পেসে পাতার নোডেরSS
সংখ্যা । আমাদের বিশ্লেষণের সাথে আরও প্রাসঙ্গিক হ'ল মোট সিদ্ধান্তের সিদ্ধান্ত নেওয়া (যেমন গাছের শাখাগুলির সংখ্যা )। শাখাগুলির প্রথম স্তরের বিকল্প রয়েছে। তাদের প্রত্যেকের জন্য, পরবর্তী স্তরের ইত্যাদি রয়েছে etc. B
W
W-1
B = W + W*(W-1) + W*(W-1)*(W-2) + ... + W!
B = SUM W!/(W-k)!
k=0..W-1
আসুন কয়েকটি ছোট টেবিলের আকারগুলি দেখুন:
Board Size Walls Leaves (SS) Branches (B)
---------------------------------------------------
1x1 04 24 64
1x2 07 5040 13699
2x2 12 479001600 1302061344
2x3 17 355687428096000 966858672404689
এই সংখ্যাগুলি হাস্যকর হয়ে উঠছে। কমপক্ষে তারা ব্যাখ্যা করে যে ব্রুট-ফোর্স কোডটি 2x3 বোর্ডে চিরতরে স্থির থাকে বলে মনে হয়। 2x3 বোর্ডের অনুসন্ধানের স্থানটি 2x2 এর চেয়ে 742560 গুণ বড় । যদি 2x2 সম্পূর্ণ হতে 20 সেকেন্ড সময় নেয়, তবে একটি রক্ষণশীল এক্সট্রোপোলশন 2x3 এর জন্য 100 দিনের বেশি সময় কার্যকর করার পূর্বাভাস দেয় । স্পষ্টতই আমাদের ছাঁটাই করা দরকার।
ছাঁটাই বিশ্লেষণ
আমি আলফা-বিটা অ্যালগরিদম ব্যবহার করে খুব সাধারণ ছাঁটাই যুক্ত করে শুরু করেছি। মূলত, এটি অনুসন্ধান বন্ধ করে দেয় যদি কোনও আদর্শ বিরোধী এটির বর্তমান সুযোগগুলি কখনই না দেয়। "আরে দেখুন - আমি প্রতিদ্বন্দ্বী আমাকে প্রতি স্কয়ার পেতে দিলে আমি অনেকটা জিতেছি!", কখনও এআই ভাবেননি।
সম্পাদনা আমি প্রতিসম বোর্ডের উপর ভিত্তি করে ছাঁটাইও যুক্ত করেছি। আমি কোনও স্মৃতিচারণ পদ্ধতি ব্যবহার করি না, যদি কোনও দিন আমি স্মৃতি যুক্ত করি এবং সেই বিশ্লেষণটি আলাদা রাখতে চাই। পরিবর্তে, এটি এর মতো কাজ করে: বেশিরভাগ লাইনে গ্রিডের অন্য কোথাও একটি "প্রতিসম জুড়ি" থাকে। এখানে 7 টি প্রতিসাম্য রয়েছে (অনুভূমিক, উল্লম্ব, 180 ঘূর্ণন, 90 ঘূর্ণন, 270 ঘূর্ণন, তির্যক এবং অন্যান্য তির্যক) রয়েছে। সমস্ত 7 স্কোয়ার বোর্ডগুলিতে প্রয়োগ হয় তবে শেষ 4 টি বর্গাকার বোর্ডগুলিতে প্রযোজ্য না। প্রতিটি প্রাচীরের এই প্রতিটি প্রতিসাম্যের জন্য এটি "জোড়া" করার জন্য একটি পয়েন্টার রয়েছে। যদি, কোনও ঘুরে দেখা যায়, বোর্ড অনুভূমিকভাবে প্রতিসাম্যযুক্ত হয়, তবে প্রতিটি অনুভূমিক জোড়া কেবল খেলতে হবে।
স্মৃতি সম্পাদনা সম্পাদনা করুন! প্রতিটি প্রাচীর একটি অনন্য আইডি পায় যা আমি সুবিধামত একটি সূচক বিট হিসাবে সেট করেছি; নবম প্রাচীরের আইডি রয়েছে 1 << n
। একটি বোর্ডের হ্যাশ, তখন সমস্ত দেয়ালের কেবল বাজানো হয়। এটি ও (1) সময়ে প্রতিটি শাখায় আপডেট করা হয়। হ্যাশটেবলের আকারটি একটিতে সেট করা হয় #define
। সমস্ত পরীক্ষা 2 size 12 মাপ দিয়ে পরিচালিত হয়েছিল, কেন নয়? যখন হ্যাশ টেবিলকে ইনডেক্স করার বিটগুলির চেয়ে বেশি দেয়াল থাকে (এই ক্ষেত্রে 12 বিট), কমপক্ষে উল্লেখযোগ্য 12 টি মুখোশযুক্ত এবং সূচক হিসাবে ব্যবহৃত হয়। সংঘর্ষগুলি প্রতিটি হ্যাশটেবল সূচীতে একটি লিঙ্কযুক্ত তালিকার সাথে পরিচালিত হয়। নীচের চার্টটি কীভাবে হ্যাশটেবল আকারের কার্য সম্পাদনকে প্রভাবিত করে তার আমার দ্রুত ও মলিন বিশ্লেষণ। অসীম র্যামযুক্ত কম্পিউটারে আমরা সর্বদা টেবিলের আকারটি দেয়ালের সংখ্যায় সেট করে থাকতাম। একটি 3x4 বোর্ডের হ্যাশটেবল 2 ^ 31 দীর্ঘ হবে। হায়রে আমাদের সেই বিলাসিতা নেই।
ঠিক আছে, ছাঁটাইতে ফিরে আসুন .. গাছের উঁচু অনুসন্ধান বন্ধ করে, আমরা পাতায় না গিয়ে প্রচুর সময় বাঁচাতে পারি । 'ছাঁটাই কারখানা' হ'ল আমাদের সম্ভাব্য শাখাগুলির ভগ্নাংশ যা আমাদের দেখতে হয়েছিল। ব্রুট-ফোর্সের একটি ছাঁটাই করার কারণ রয়েছে 1. এটি যত ছোট হবে তত ভাল।