আপডেট: আমি এই বিষয়টিকে অনেক পছন্দ করেছি আমি প্রোগ্রামিং ধাঁধা, দাবা অবস্থান এবং হাফম্যান কোডিং লিখেছি । আপনি যদি এটির মাধ্যমে পড়ে থাকেন তবে আমি নির্ধারণ করেছি যে সম্পূর্ণ গেমের স্টেট সংরক্ষণের একমাত্র উপায় হ'ল পুরো পদক্ষেপের একটি তালিকা সংরক্ষণ করে। কেন পড়ুন। সুতরাং আমি টুকরা বিন্যাসের জন্য সমস্যার কিছুটা সরলিকৃত সংস্করণ ব্যবহার করব।
সমস্যাটি
এই চিত্রটি প্রারম্ভিক দাবা অবস্থান চিত্রিত করে। দাবা একটি 8x8 বোর্ডে ঘটে যেখানে প্রতিটি প্লেয়ারের 16 টি টুকরাটির 8 টি পাঁজর, 2 রুকস, 2 নাইট, 2 বিশপ, 1 রানী এবং 1 রাজা সমন্বিত একটি সমান সেট দিয়ে শুরু হয়:
অবস্থানগুলি সাধারণত কলামের জন্য একটি চিঠি হিসাবে রেকর্ড করা হয় তারপরে সারিটির জন্য সংখ্যাটি যাতে হোয়াইটের রানী ডি 1 এ থাকে। চালগুলি বেশিরভাগ সময় বীজগণিত স্বীকৃতিতে সংরক্ষণ করা হয় , যা দ্ব্যর্থহীন এবং সাধারণত প্রয়োজনীয় ন্যূনতম তথ্য নির্দিষ্ট করে। এই উদ্বোধন বিবেচনা করুন:
- e4 ই 5
- এনএফ 3 এনসি 6
- …
যা অনুবাদ করে:
- হোয়াইট বাদশাহের प्याদকে ই 2 থেকে ই 4 এ নিয়ে যায় (এটি কেবলমাত্র টুকরো যা ই 4 এ পেতে পারে তাই "ই 4");
- কালো রাজার জেদকে e7 থেকে e5 এ নিয়ে যায়;
- সাদা নাইটকে (এন) এফ 3 এ স্থানান্তরিত করে;
- কালো নাইটকে সি -6 এ সরিয়ে দেয়।
- …
বোর্ডটি এর মতো দেখাচ্ছে:
যে কোনও প্রোগ্রামারের জন্য একটি গুরুত্বপূর্ণ ক্ষমতাটি সঠিকভাবে এবং দ্ব্যর্থহীনভাবে সমস্যাটি নির্দিষ্ট করতে সক্ষম হওয়া ।
তাহলে কি অনুপস্থিত বা অস্পষ্ট? এটি পরিণত হিসাবে অনেক।
বোর্ড স্টেট বনাম গেম রাজ্য
আপনার প্রথম যে জিনিসটি নির্ধারণ করা দরকার তা হ'ল আপনি কোনও গেমের অবস্থা বা বোর্ডে টুকরো টুকরো অবস্থান সংরক্ষণ করছেন। টুকরোগুলির অবস্থানগুলিকে কেবল এনকোডিং করা একটি জিনিস তবে সমস্যাটি "পরবর্তী সমস্ত আইনী পদক্ষেপ" বলে। সমস্যাটি এই বিন্দু পর্যন্ত পদক্ষেপগুলি জানার বিষয়ে কিছুই বলে না। আমি ব্যাখ্যা হিসাবে এটি আসলে একটি সমস্যা।
কাস্টিং
খেলাটি নিম্নরূপে এগিয়ে গেছে:
- e4 ই 5
- এনএফ 3 এনসি 6
- বিবি 5 এ 6
- বা 4 বিসি 5
বোর্ডটি নিম্নরূপ দেখায়:
সাদা রঙের কাস্টিংয়ের বিকল্প রয়েছে । এর প্রয়োজনীয়তার অংশটি হ'ল রাজা এবং প্রাসঙ্গিক রুক কখনই স্থানান্তর করতে পারবেন না, তাই রাজা বা উভয় পক্ষের নাগরিক স্থানান্তরিত হয়েছে কিনা তা সংরক্ষণ করা দরকার। স্পষ্টতই যদি তারা তাদের প্রথম অবস্থানে না থাকে তবে তারা স্থানান্তরিত হয়েছে অন্যথায় এটি নির্দিষ্ট করা দরকার be
এই সমস্যাটি মোকাবেলায় বেশ কয়েকটি কৌশল ব্যবহার করা যেতে পারে।
প্রথমত, আমরা অতিরিক্ত 6 বিট তথ্য সংরক্ষণ করতে পারি (প্রতিটি রোক এবং রাজার জন্য 1) যাতে টুকরাটি স্থানান্তরিত হয়েছিল কিনা তা নির্দেশ করতে। আমরা যদি এই ছয়টি স্কোয়ারের মধ্যে একটির জন্য কিছুটা স্টোর করে প্রবাহিত করতে পারি যদি ডান টুকরোটি এর মধ্যে থাকে। বিকল্পভাবে আমরা প্রতিটি অনাবৃত টুকরোটিকে অন্য টুকরো টাইপের হিসাবে বিবেচনা করতে পারি সুতরাং প্রতিটি পক্ষের 6 টি টুকরো টাইপের পরিবর্তে (প্যাঁচা, নড়বড়, নাইট, বিশপ, রানী এবং রাজা) সেখানে 8 (অবরুদ্ধ রুক এবং অবরুদ্ধ রাজা যুক্ত করে) রয়েছে।
এন পাসেন্ট
দাবাতে আর একটি অদ্ভুত এবং প্রায়শই অবহেলিত নিয়ম হ'ল এন পাসেন্ট ।
গেমটি এগিয়েছে।
- e4 ই 5
- এনএফ 3 এনসি 6
- বিবি 5 এ 6
- বা 4 বিসি 5
- ওও বি 5
- বিবি 3 বি 4
- সি 4
ব্ল্যাকের প্যাকেটটি বি 4 এ এখন সিটি 4-এ হোয়াইট প্যাড নেওয়ার জন্য বি 4 এ তার প্যাডকে সি -3 এ সরানোর বিকল্প রয়েছে। এটি কেবল প্রথম সুযোগে ঘটে যখন কৃষ্ণ যদি এখন বিকল্পটি পাস করে তবে সে এটি পরবর্তী পদক্ষেপ নিতে পারে না। সুতরাং আমাদের এটি সংরক্ষণ করা উচিত।
আমরা যদি পূর্ববর্তী পদক্ষেপটি জানি তবে আমরা অবশ্যই উত্তর দিতে পারি যদি এন পাসেন্ট সম্ভব হয়। বিকল্পভাবে আমরা স্টোর করতে পারি যে এর চতুর্থ র্যাঙ্কের প্রতিটি মোহর সবেমাত্র সেখানে ডাবল সরানো নিয়ে সরে গেছে। অথবা আমরা বোর্ডে প্রতিটি সম্ভাব্য এন পাসেন্ট অবস্থান দেখতে পারি এবং এটি সম্ভব কিনা তা চিহ্নিত করার জন্য একটি পতাকা থাকতে পারে।
পদোন্নতি
এটি হোয়াইটের পদক্ষেপ। হোয়াইট যদি তার উদোমাকে h7 এ h8 এ সরিয়ে দেয় তবে এটি অন্য কোনও টুকরোতে প্রচার করা যেতে পারে (তবে রাজা নয়)। এটির রানীতে উন্নীত হওয়ার সময় 99% হয় তবে কখনও কখনও তা হয় না, কারণ এটি অচলাবস্থার জন্য বাধ্য হতে পারে যখন অন্যথায় আপনি জিতেন। এটি এই হিসাবে লেখা হয়:
- h8 = প্রশ্ন
এটি আমাদের সমস্যায় গুরুত্বপূর্ণ কারণ এর অর্থ আমরা প্রতিটি পক্ষের নির্দিষ্ট সংখ্যক টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো আছে। একপাশে 9 কুইন, 10 রুকস, 10 বিশপ বা 10 নাইটের সাথে শেষ পর্যন্ত সমস্ত 8 জনের উন্নীত করা সম্পূর্ণভাবে সম্ভব (তবে অবিশ্বাস্যভাবে অসম্ভব)।
অচলাবস্থা
আপনি যখন নিজের সেরা কৌশলটি জিততে পারবেন না এমন অবস্থাতেই অচলাবস্থার চেষ্টা করা । সর্বাধিক সম্ভাব্য বৈকল্পিকটি হল যেখানে আপনি আইনী পদক্ষেপ নিতে পারবেন না (সাধারণত কারণ আপনার রাজাটিকে পরীক্ষা করার সময় কোনও পদক্ষেপ)। এই ক্ষেত্রে আপনি একটি ড্র দাবি করতে পারেন। এই এক যত্ন নেওয়া সহজ।
দ্বিতীয় রূপটি ত্রিগুণ পুনরাবৃত্তি দ্বারা হয় । যদি একই বোর্ডের অবস্থানটি কোনও গেমটিতে তিনবার ঘটে (বা পরবর্তী পদক্ষেপে তৃতীয়বারের মতো ঘটবে), তবে একটি অঙ্কন দাবি করা যেতে পারে। অবস্থানগুলি কোনও নির্দিষ্ট ক্রমে সংঘটিত হওয়ার প্রয়োজন নেই (যার অর্থ এটি তিনবার পুনরাবৃত্তি চলার একই ক্রমের সাথে হয় না)। এইটি সমস্যাটিকে আরও জটিল করে তোলে কারণ আপনাকে বোর্ডের প্রতিটি পূর্ববর্তী অবস্থান মনে রাখতে হবে। যদি এটি সমস্যাটির প্রয়োজন হয় তবে প্রতিটি পূর্ববর্তী পদক্ষেপ সংরক্ষণ করে রাখা সমস্যার একমাত্র সম্ভাব্য সমাধান।
সর্বশেষে, পঞ্চাশটি সরানোর নিয়ম রয়েছে । কোনও খেলোয়াড় ড্র করার দাবি করতে পারে যদি কোনও পদ্মা না সরানো হয় এবং পূর্ববর্তী পঞ্চাশটি পর্বে কোনও টুকরো না নেওয়া হয় তাই আমাদের কোনও পদ্মার স্থানান্তরিত হওয়া বা একটি টুকরো নেওয়া হওয়ার পরে কতটা চাল চলবে তা সংরক্ষণ করতে হবে (দুটিটির সর্বশেষতম। এটির প্রয়োজন 6 বিট (0-63)।
কার পালা?
অবশ্যই আমাদের এটিও জানতে হবে কার পালা এবং এটি একক তথ্য।
দুটি সমস্যা
অচলাবস্থার কারণে, গেমের স্টেট সংরক্ষণের একমাত্র সম্ভাব্য বা বুদ্ধিমান উপায় হ'ল এই অবস্থানের দিকে পরিচালিত সমস্ত পদক্ষেপগুলি সংরক্ষণ করা। আমি যে একটি সমস্যা মোকাবেলা করব। বোর্ড স্টেটের সমস্যাটি এটিকে সহজতর করা হবে: কাস্টিং, ইন পাসেন্ট, অচলাবস্থার পরিস্থিতি এবং যার পালা তা অবহেলা করে বোর্ডে সমস্ত টুকরোয়ের বর্তমান অবস্থান সংরক্ষণ করুন ।
পিস লেআউট দুটি উপায়ের একটিতে বিস্তৃতভাবে পরিচালনা করা যায়: প্রতিটি বর্গক্ষেত্রের সামগ্রী সংরক্ষণ করে বা প্রতিটি টুকরো অবস্থান সংরক্ষণ করে।
সাধারণ বিষয়বস্তু
ছয়টি পিসের ধরণ রয়েছে (প্যাঁচা, রোক, নাইট, বিশপ, কুইন এবং কিং)। প্রতিটি টুকরা সাদা বা কালো হতে পারে তাই স্কোয়ারে 12 টি সম্ভাব্য টুকরো থাকতে পারে বা এটি খালি থাকতে পারে তাই 13 টি সম্ভাবনা রয়েছে। 13 টি 4 বিটে সংরক্ষণ করা যায় (0-15) সুতরাং সহজ সমাধান হ'ল প্রতিটি বর্গ বারের জন্য 4 বিট বা 646 স্কোয়ার বা 256 বিটের তথ্য সংরক্ষণ করা।
এই পদ্ধতির সুবিধা হ'ল ম্যানিপুলেশন অবিশ্বাস্যভাবে সহজ এবং দ্রুত। এমনকি স্টোরেজ প্রয়োজনীয়তা বাড়িয়ে না নিয়ে আরও 3 টি সম্ভাবনা যুক্ত করে এটি বাড়ানো যেতে পারে: শেষ মুহুর্তে 2 টি ফাঁকা স্থান পরিবর্তনকারী এক প্যাঁচ, সরানো হয়নি এমন একটি রাজা এবং সরানো না এমন একটি ঝাঁকুনি যা অনেক কিছু পূরণ করবে পূর্বে উল্লিখিত সমস্যাগুলির।
কিন্তু আমরা আরো ভালো করতে পারে।
বেস 13 এনকোডিং
বোর্ড পজিশনটিকে খুব বড় সংখ্যক হিসাবে ভাবা প্রায়শই সহায়ক। এটি প্রায়শই কম্পিউটার বিজ্ঞানে করা হয়। উদাহরণস্বরূপ, থামার সমস্যাটি একটি কম্পিউটার প্রোগ্রামকে (সঠিকভাবে) একটি বড় সংখ্যা হিসাবে বিবেচনা করে।
প্রথম সমাধানটি অবস্থানটিকে digit৪ সংখ্যার বেস ১ 16 সংখ্যা হিসাবে বিবেচনা করে তবে প্রমাণিত হয়েছে যে এই তথ্যটিতে অপ্রয়োজনীয়তা রয়েছে (প্রতি "সংখ্যা" অনুসারে 3 অব্যবহৃত সম্ভাবনা হওয়া) তাই আমরা সংখ্যার স্থানটি 64 বেস 13 অঙ্কে হ্রাস করতে পারি। অবশ্যই এটি বেস 16 এর মতো দক্ষতার সাথে করা যায় না তবে এটি স্টোরেজ প্রয়োজনীয়তাগুলি সাশ্রয় করবে (এবং স্টোরেজ স্পেস হ্রাস করা আমাদের লক্ষ্য)।
বেস 10 তে 234 সংখ্যাটি 2 x 10 2 + 3 x 10 1 + 4 x 10 0 এর সমান ।
বেস 16 এ 0xA50 সংখ্যাটি 10 x 16 2 + 5 x 16 1 + 0 x 16 0 = 2640 (দশমিক) এর সমান ।
সুতরাং আমরা p 0 x 13 63 + p 1 x 13 62 + ... + p 63 x 13 0 হিসাবে আমাদের অবস্থানটি এনকোড করতে পারি যেখানে আমি i বর্গক্ষেত্রের বিষয়বস্তু উপস্থাপন করি ।
2 256 সমান প্রায় 1.16e77। 13 64 সমান প্রায় 1.96e71, যার জন্য 237 বিট স্টোরেজ স্পেস প্রয়োজন। এই মাত্র 7.5% সাশ্রয় হ'ল উল্লেখযোগ্য পরিমাণে ম্যানিপুলেশন ব্যয় করে।
ভেরিয়েবল বেস এনকোডিং
আইনী বোর্ডগুলিতে কিছু নির্দিষ্ট টুকরো নির্দিষ্ট স্কোয়ারে উপস্থিত হতে পারে না। উদাহরণস্বরূপ, বন্ধকগুলি প্রথম বা অষ্টম র্যাঙ্কে ঘটতে পারে না, সেই স্কোয়ারগুলির সম্ভাবনাগুলি 11 এ কমিয়ে দেয় That এটি সম্ভাব্য বোর্ডগুলিকে 11 16 x 13 48 = 1.35e70 (আনুমানিক) এ কমিয়ে দেয় , 233 বিট স্টোরেজ স্পেসের প্রয়োজন হয়।
আসলে ডেসিমাল (বা বাইনারি) থেকে এবং এর থেকে এই জাতীয় মানগুলি এনকোডিং এবং ডিকোড করা কিছুটা আরও সংশ্লেষিত তবে এটি নির্ভরযোগ্যভাবে করা যায় এবং এটি পাঠকের অনুশীলন হিসাবে ছেড়ে যায়।
পরিবর্তনশীল প্রস্থ বর্ণমালা
পূর্ববর্তী দুটি পদ্ধতি উভয়ই স্থির-প্রস্থের বর্ণমালা সংক্রান্ত এনকোডিং হিসাবে বর্ণনা করা যেতে পারে । বর্ণমালার 11, 13 বা 16 সদস্যের প্রত্যেককেই অন্য একটি মানের জন্য প্রতিস্থাপন করা হয়। প্রতিটি "চরিত্র" একই প্রস্থ হয় তবে দক্ষতার উন্নতি করা যেতে পারে যখন আপনি বিবেচনা করেন যে প্রতিটি চরিত্রের সমান সম্ভাবনা নেই।
মোর্স কোডটি বিবেচনা করুন (উপরে চিত্রিত)। একটি বার্তায় অক্ষরগুলি ড্যাশ এবং বিন্দুর ক্রম হিসাবে এনকোড করা হয়। এই ড্যাশগুলি এবং বিন্দুগুলি রেডিমে স্থানান্তরিত করা হয় (সাধারণত) তাদের মধ্যে সীমিত রাখার জন্য বিরতি দিয়ে typically
E অক্ষরটি ( ইংরেজির সর্বাধিক প্রচলিত অক্ষর ) কীভাবে একটি একক বিন্দু, সংক্ষিপ্ততম অনুক্রম, সেখানে জেড (সর্বনিম্ন ঘন ঘন) দুটি ড্যাশ এবং দুটি বিপ রয়েছে তা লক্ষ্য করুন।
এই জাতীয় স্কিমটি প্রত্যাশিত বার্তার আকারকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে তবে এলোমেলো চরিত্রের ক্রমের আকার বাড়ানোর জন্য আসে।
এটি লক্ষ করা উচিত যে মোর্স কোডে আরও একটি অন্তর্নির্মিত বৈশিষ্ট্য রয়েছে: ড্যাশগুলি তিনটি বিন্দুর মতো দীর্ঘ হয় তাই ড্যাশগুলির ব্যবহারকে হ্রাস করার জন্য উপরের কোডটি এটিকে ધ્યાનમાં রেখে তৈরি করা হয়। যেহেতু 1s এবং 0s (আমাদের বিল্ডিং ব্লকগুলি) এ সমস্যা নেই, এটি আমাদের প্রতিলিপি তৈরি করার কোনও বৈশিষ্ট্য নয়।
শেষ অবধি, মোর্স কোডে দুটি ধরণের বিশ্রাম রয়েছে। সংক্ষিপ্ত বিশ্রাম (একটি বিন্দুর দৈর্ঘ্য) বিন্দু এবং ড্যাশগুলির মধ্যে পার্থক্য করতে ব্যবহৃত হয়। লম্বা ব্যবধান (ড্যাশের দৈর্ঘ্য) অক্ষরগুলি সীমিত করতে ব্যবহৃত হয়।
সুতরাং এটি কীভাবে আমাদের সমস্যার সাথে প্রয়োগ হয়?
হাফম্যান কোডিং
পরিবর্তনশীল দৈর্ঘ্যের কোডগুলি হফম্যান কোডিং নামে ডিল করার জন্য একটি অ্যালগরিদম রয়েছে । হাফম্যান কোডিং একটি পরিবর্তনশীল দৈর্ঘ্যের কোড প্রতিস্থাপন তৈরি করে, সাধারণত আরও সাধারণ চিহ্নগুলিকে সংক্ষিপ্ততর মান নির্ধারণ করতে প্রতীকগুলির প্রত্যাশিত ফ্রিকোয়েন্সি ব্যবহার করে।
উপরের গাছটিতে E অক্ষরটি 000 (বা বাম-বাম-বাম) হিসাবে এনকোড করা হয়েছে এবং এস 1011। এটি স্পষ্ট হওয়া উচিত যে এই এনকোডিং স্কিমটি দ্ব্যর্থহীন ।
এটি মোর্স কোড থেকে একটি গুরুত্বপূর্ণ পার্থক্য। মোর্স কোডের অক্ষর বিভাজক রয়েছে যাতে এটি অন্যথায় দ্ব্যর্থহীন প্রতিস্থাপন করতে পারে (উদাহরণস্বরূপ 4 টি বিন্দু H বা 2 হয়) তবে আমাদের কেবল 1s এবং 0 গুলি রয়েছে সুতরাং আমরা পরিবর্তে একটি অস্পষ্ট বিকল্পটি বেছে নিই।
নীচে একটি সাধারণ বাস্তবায়ন:
private static class Node {
private final Node left;
private final Node right;
private final String label;
private final int weight;
private Node(String label, int weight) {
this.left = null;
this.right = null;
this.label = label;
this.weight = weight;
}
public Node(Node left, Node right) {
this.left = left;
this.right = right;
label = "";
weight = left.weight + right.weight;
}
public boolean isLeaf() { return left == null && right == null; }
public Node getLeft() { return left; }
public Node getRight() { return right; }
public String getLabel() { return label; }
public int getWeight() { return weight; }
}
স্থির ডেটা সহ:
private final static List<string> COLOURS;
private final static Map<string, integer> WEIGHTS;
static {
List<string> list = new ArrayList<string>();
list.add("White");
list.add("Black");
COLOURS = Collections.unmodifiableList(list);
Map<string, integer> map = new HashMap<string, integer>();
for (String colour : COLOURS) {
map.put(colour + " " + "King", 1);
map.put(colour + " " + "Queen";, 1);
map.put(colour + " " + "Rook", 2);
map.put(colour + " " + "Knight", 2);
map.put(colour + " " + "Bishop";, 2);
map.put(colour + " " + "Pawn", 8);
}
map.put("Empty", 32);
WEIGHTS = Collections.unmodifiableMap(map);
}
এবং:
private static class WeightComparator implements Comparator<node> {
@Override
public int compare(Node o1, Node o2) {
if (o1.getWeight() == o2.getWeight()) {
return 0;
} else {
return o1.getWeight() < o2.getWeight() ? -1 : 1;
}
}
}
private static class PathComparator implements Comparator<string> {
@Override
public int compare(String o1, String o2) {
if (o1 == null) {
return o2 == null ? 0 : -1;
} else if (o2 == null) {
return 1;
} else {
int length1 = o1.length();
int length2 = o2.length();
if (length1 == length2) {
return o1.compareTo(o2);
} else {
return length1 < length2 ? -1 : 1;
}
}
}
}
public static void main(String args[]) {
PriorityQueue<node> queue = new PriorityQueue<node>(WEIGHTS.size(),
new WeightComparator());
for (Map.Entry<string, integer> entry : WEIGHTS.entrySet()) {
queue.add(new Node(entry.getKey(), entry.getValue()));
}
while (queue.size() > 1) {
Node first = queue.poll();
Node second = queue.poll();
queue.add(new Node(first, second));
}
Map<string, node> nodes = new TreeMap<string, node>(new PathComparator());
addLeaves(nodes, queue.peek(), "");
for (Map.Entry<string, node> entry : nodes.entrySet()) {
System.out.printf("%s %s%n", entry.getKey(), entry.getValue().getLabel());
}
}
public static void addLeaves(Map<string, node> nodes, Node node, String prefix) {
if (node != null) {
addLeaves(nodes, node.getLeft(), prefix + "0");
addLeaves(nodes, node.getRight(), prefix + "1");
if (node.isLeaf()) {
nodes.put(prefix, node);
}
}
}
একটি সম্ভাব্য আউটপুট হল:
White Black
Empty 0
Pawn 110 100
Rook 11111 11110
Knight 10110 10101
Bishop 10100 11100
Queen 111010 111011
King 101110 101111
একটি শুরুর অবস্থানের জন্য এটি 32 x 1 + 16 x 3 + 12 x 5 + 4 x 6 = 164 বিটের সমান।
রাষ্ট্রীয় পার্থক্য
আরেকটি সম্ভাব্য পন্থা হফম্যান কোডিংয়ের সাথে প্রথম পদ্ধতির একত্রিত করা। এটি এই ধারণার উপর ভিত্তি করে যে সর্বাধিক প্রত্যাশিত দাবা বোর্ডগুলি (এলোমেলোভাবে উত্পন্ন উত্সগুলির পরিবর্তে) কমপক্ষে অংশে কোনও শুরুর অবস্থানের মতো হওয়ার সম্ভাবনা বেশি।
সুতরাং আপনি যা করছেন তা হ'ল 256 বিট প্রারম্ভিক অবস্থানের সাথে 256 বিট বর্তমান বোর্ড অবস্থান এবং তারপরে এনকোড করুন (হাফম্যান কোডিং ব্যবহার করে বা বলুন, দৈর্ঘ্যের এনকোডিংয়ের কিছু পদ্ধতি) )। স্পষ্টতই এটি শুরু করতে খুব দক্ষ হবে (64 0s সম্ভবত 64৪ বিটের সাথে সামঞ্জস্যপূর্ণ) তবে গেমের অগ্রগতির সাথে প্রয়োজনীয় স্টোরেজ বৃদ্ধি পাবে।
পিস পজিশন
উল্লিখিত হিসাবে, এই সমস্যাটিতে আক্রমণ করার আরেকটি উপায় হ'ল পরিবর্তে খেলোয়াড়ের প্রতিটি টুকরোটির অবস্থান সংরক্ষণ করা। এটি এন্ডগেম পজিশনের সাথে বিশেষত ভাল কাজ করে যেখানে বেশিরভাগ স্কোয়ার ফাঁকা থাকবে (তবে হাফম্যান কোডিং এপ্রোচে খালি স্কোয়ারগুলি কেবল যাইহোক 1 বিট ব্যবহার করে)।
প্রতিটি পক্ষের একটি রাজা এবং 0-15 অন্যান্য টুকরা থাকবে। প্রচারের কারণে এই টুকরোগুলির সঠিক মেক আপ যথেষ্ট পরিমাণে পরিবর্তিত হতে পারে যে আপনি সূচনা পজিশনের উপর ভিত্তি করে সংখ্যাটি ম্যাক্সিমামা ধরে নিতে পারবেন না।
এটিকে ভাগ করার যৌক্তিক উপায় হ'ল দুটি পাশ (হোয়াইট এবং ব্ল্যাক) সমন্বিত একটি পজিশন। প্রতিটি পক্ষের রয়েছে:
- একজন রাজা: অবস্থানের জন্য 6 বিট;
- পদ্মপত্র রয়েছে: 1 (হ্যাঁ), 0 (না);
- যদি হ্যাঁ, प्याদ সংখ্যা: 3 বিট (0-7 + 1 = 1-8);
- যদি হ্যাঁ, প্রতিটি মহিমাটির অবস্থানটি এনকোড করা হয়েছে: 45 বিট (নীচে দেখুন);
- অ-পাউন্ডগুলির সংখ্যা: 4 বিট (0-15);
- প্রতিটি টুকরো জন্য: টাইপ করুন (রানী জন্য 2 বিট, রোক, নাইট, বিশপ) এবং অবস্থান (6 বিট)
অদ্ভুত স্থান হিসাবে, प्याদাগুলি কেবল 48 সম্ভাব্য স্কোয়ারে থাকতে পারে (অন্যদের মতো 64 নয়)। সেই হিসাবে, অতিরিক্ত 16 টি মানকে নষ্ট না করাই ভাল যা প্রতিশব্দে 6 বিট ব্যবহার করে। তাই আপনি যদি 8 দাবার গুটির আছে 48 আছে 8 সম্ভাবনা 28.179.280.429.056 equaling। সেই মানগুলি এনকোড করতে আপনার 45 বিট দরকার।
এটি প্রতি পাশের 105 বিট বা মোট 210 বিট। প্রারম্ভিক অবস্থানটি এই পদ্ধতির জন্য সবচেয়ে খারাপ পরিস্থিতি এবং আপনি টুকরো অপসারণ করার সাথে এটি যথেষ্ট ভাল হয়ে উঠবে।
এটি চিহ্নিত করা উচিত যে 48 8 এরও কম সম্ভাবনা রয়েছে কারণ পণ্ডিতরা সবাই একই স্কোয়ারে থাকতে পারে না প্রথমটিতে 48 টি সম্ভাবনা রয়েছে, দ্বিতীয় 47 টি এবং আরও। 48 x 47 x… x 41 = 1.52e13 = 44 বিটের সঞ্চয়স্থান।
অন্যান্য টুকরা (অন্য দিক সহ) দ্বারা দখল করা স্কোয়ারগুলি বাদ দিয়ে আপনি আরও উন্নতি করতে পারেন যাতে আপনি প্রথমে সাদা নন-পাউন্ডগুলি পরে কালো অ-পাউন্ডগুলি পরে সাদা প্যাঁচাগুলি এবং শেষ অবধি কালো প্যাঁকো রাখতে পারেন। শুরুর অবস্থানে এটি স্টোরেজ প্রয়োজনীয়তাগুলিকে হোয়াইটের জন্য 44 বিট এবং কালো জন্য 42 বিট করে কমায়।
সম্মিলিত পন্থা
আরেকটি সম্ভাব্য অপ্টিমাইজেশন হ'ল এই পদ্ধতির প্রতিটিটিরই শক্তি এবং দুর্বলতা রয়েছে। আপনি বলতে পারেন, সেরা 4 টি বাছাই করুন এবং তারপরে স্কিম নির্বাচককে প্রথম দুটি বিটগুলিতে এনকড করতে পারেন এবং তারপরে স্কিম-নির্দিষ্ট স্টোরেজ।
ওভারহেড যে ছোট, এটি এখন পর্যন্ত সেরা পন্থা হবে।
গেম স্টেট
আমি পজিশন না দিয়ে গেম স্টোর করার সমস্যায় ফিরে আসি । ত্রিগুণ পুনরাবৃত্তির কারণে আমাদের এখন পর্যন্ত এই পদক্ষেপগুলির তালিকা সংরক্ষণ করতে হবে to
টিকা
একটি জিনিস যা আপনাকে নির্ধারণ করতে হবে তা হল আপনি কেবল চালের একটি তালিকা সংরক্ষণ করছেন বা আপনি গেমটি টিকিয়ে দিচ্ছেন? দাবা গেমগুলি প্রায়শই টিকা দেওয়া হয়, উদাহরণস্বরূপ:
- বিবি 5 !! এনসি 4?
হোয়াইটের এই পদক্ষেপটি দুটি বিস্ময়বোধক পয়েন্ট দ্বারা উজ্জ্বল হিসাবে চিহ্নিত হয়েছে যেখানে কৃষ্ণচূড়া একটি ভুল হিসাবে দেখা হয়। দাবা বিরামচিহ্ন দেখুন ।
মুভগুলি বর্ণিত হওয়ার সাথে সাথে আপনার নিখরচায় পাঠ্যও সঞ্চয় করতে হবে।
আমি ধরে নিচ্ছি যে পদক্ষেপগুলি যথেষ্ট তাই কোনও টিকা নেই।
বীজগণিত স্বরলিপি
আমরা সরানোর পাঠ্যটি এখানে সহজেই সঞ্চয় করতে পারি ("e4", "বিএক্সবি 5" ইত্যাদি)। একটি টার্মিনেটিং বাইট সহ আপনি প্রতি পদে পদে প্রায় 6 বাইট (48 বিট) খুঁজছেন (সবচেয়ে খারাপ ক্ষেত্রে)। এটি বিশেষভাবে দক্ষ নয়।
দ্বিতীয় জিনিসটি চেষ্টা করে হ'ল শুরুর অবস্থান (b বিট) এবং শেষের অবস্থান (b বিট) যাতে চাল প্রতি 12 বিট সংরক্ষণ করা হয়। এটি উল্লেখযোগ্যভাবে ভাল।
বিকল্পভাবে আমরা বর্তমান অবস্থান থেকে সমস্ত আইনী পদক্ষেপগুলি ভবিষ্যদ্বাণীমূলক এবং নির্ধারিত পদ্ধতিতে এবং রাষ্ট্র যা আমরা বেছে নিয়েছি তা নির্ধারণ করতে পারি। এটি তখন উপরে উল্লিখিত ভেরিয়েবল বেস এনকোডিংয়ে ফিরে যায়। হোয়াইট এবং ব্ল্যাকের তাদের প্রথম চালনায় 20 টি সম্ভাব্য চলন রয়েছে, আরও দ্বিতীয়টিতে এবং আরও কিছু।
উপসংহার
এই প্রশ্নের কোন সঠিক উত্তর নেই। অনেকগুলি সম্ভাব্য পন্থা রয়েছে যার উপরেরটি কয়েকটি মাত্র।
আমি এই এবং অনুরূপ সমস্যাগুলি সম্পর্কে যা পছন্দ করি তা হ'ল এটি ব্যবহারের ধরণটি বিবেচনা করা, সঠিকভাবে প্রয়োজনীয়তা নির্ধারণ করা এবং কোণার কেসগুলি সম্পর্কে চিন্তাভাবনা করার মতো কোনও প্রোগ্রামারের কাছে গুরুত্বপূর্ণ দক্ষতার দাবি করে।
দাবা পজিশন ট্রেনারের স্ক্রিনশট হিসাবে দাবারের অবস্থানগুলি ।