আমি মনে করি আমি একটি গেম টিকের জন্য সমস্ত সম্ভাব্য রাজ্য তৈরি করতে পারি, তবে চার খেলোয়াড় এবং 5 টি বেসিক অ্যাকশন (4 টি চাল এবং বোমা স্থান) দিয়ে এটি গেম ট্রি এর প্রথম স্তরে 5 ^ 4 রাজ্য দেয়।
সঠিক! আপনাকে প্রতিটি গেমের টিকের জন্য সমস্ত 5 ^ 4 (বা এমনকি 6 ^ 4, যেমন 4 দিক দিয়ে চলতে পারেন, থামাতে এবং "বোমা লাগাতে"?) পদক্ষেপগুলি অনুসন্ধান করতে হবে। কিন্তু, যখন কোনও খেলোয়াড় ইতিমধ্যে স্থানান্তরিত করার সিদ্ধান্ত নিয়েছে, সরানো কার্যকর হওয়া পর্যন্ত এটি কিছুটা সময় নেয় (যেমন 10 গেমের টিক্স)। এই সময়কালে সম্ভাবনার সংখ্যা হ্রাস পায়।
এই মানটি প্রতিটি পরবর্তী স্তরের সাথে তাত্পর্যপূর্ণভাবে বাড়বে। আমি কিছু অনুপস্থিত করছি? এটি বাস্তবায়নের কোনও উপায় আছে বা আমার সম্পূর্ণ আলাদা অ্যালগরিদম ব্যবহার করা উচিত?
আপনি কেবল একই গেমের স্টেট "সাবট্রি" একবার গণনা করতে একটি হ্যাশ-টেবিল ব্যবহার করতে পারেন। কল্পনা করুন প্লেয়ার এ উপরে উঠে নেমেছে, অন্য সমস্ত খেলোয়াড় "অপেক্ষা করুন" এর পরে আপনি একই গেমের অবস্থায় রয়েছেন। এটি "বাম-ডান" বা "ডান-বাম" এর মতোই। এছাড়াও "উপরের-পরে-বাম" এবং "বাম-পরে-পরে" সরিয়ে একই অবস্থায় ফলাফল দেয়। একটি হ্যাশ-টেবিল ব্যবহার করে আপনি ইতিমধ্যে মূল্যায়ন করা গেমের রাজ্যের জন্য গণনা করা স্কোরটিকে "পুনরায় ব্যবহার" করতে পারেন। এটি বৃদ্ধির গতিকে অনেকটা হ্রাস করে। গাণিতিকভাবে, এটি আপনার তাত্পর্যপূর্ণ বৃদ্ধি কার্যের ভিত্তি হ্রাস করে। জটিলতা কতটা কমেছে তার একটি ধারণা পেতে, খেলোয়াড় কেবল উপরে / নীচে / বাম / ডান / স্টপ এড়াতে পারলে মানচিত্রে পৌঁছানোর যোগ্য পজিশনের তুলনায় কেবলমাত্র একজন খেলোয়াড়ের সম্ভাব্য চলনগুলি লক্ষ্য করা যাক (= বিভিন্ন গেমের স্টেটস) if ।
গভীরতা 1: 5 চাল, 5 টি পৃথক রাজ্য, এই পুনরাবৃত্তির জন্য 5 টি অতিরিক্ত রাজ্য
গভীরতা 2: 25 চাল, 13 পৃথক রাজ্য, এই পুনরাবৃত্তির জন্য অতিরিক্ত 8 টি রাজ্য
গভীরতা 3: 6125 নড়াচড়া, 25 বিভিন্ন রাজ্য, এই পুনরাবৃত্তির জন্য 12 টি অতিরিক্ত রাজ্য
এটি দেখার জন্য, নিজেকে উত্তর দিন: মানচিত্রের কোন ক্ষেত্রগুলি একটি চাল, দুটি চাল, তিনটি চাল দিয়ে পৌঁছে যেতে পারে। উত্তরটি হল: শুরু অবস্থান থেকে সর্বোচ্চ দূরত্ব = 1, 2 বা 3 সহ সমস্ত ক্ষেত্র।
হ্যাশ টেবিল ব্যবহার করার সময় আপনাকে কেবলমাত্র প্রতিটি অ্যাক্সেসযোগ্য গেমের অবস্থা মূল্যায়ন করতে হবে (আমাদের উদাহরণস্বরূপ 25 গভীরতায় 3) একবার। হ্যাশ টেবিল ছাড়া আপনার একাধিকবার মূল্যায়ন করা দরকার, যার অর্থ গভীরতার স্তরের 25 এর পরিবর্তে 6125 মূল্যায়ন ations সর্বোত্তম: একবার আপনি যদি হ্যাশ টেবিল এন্ট্রি গণনা করেন তবে পরবর্তী সময়ে ধাপে আপনি এটি পুনরায় ব্যবহার করতে পারবেন ...
আপনি ইনক্রিমেন্টাল ডিপেনিং এবং আলফা-বিটা ছাঁটাই "কাট" সাবট্রিজগুলিও ব্যবহার করতে পারেন যা আরও গভীরতার সাথে অনুসন্ধানের জন্য উপযুক্ত নয়। দাবা জন্য এটি অনুসন্ধান নোডের সংখ্যা প্রায় 1% হ্রাস করে। : আলফা-বিটা কেঁটে সাফ একটি সংক্ষিপ্ত ভূমিকা যেমন একটি ভিডিও পাওয়া যাবে এখানে http://www.teachingtree.co/cs/watch?concept_name=Alpha-beta+Pruning
পরবর্তী গবেষণার জন্য একটি ভাল শুরু হ'ল http://chessprogramming.wikispaces.com/Search । পৃষ্ঠাটি দাবা সম্পর্কিত, তবে অনুসন্ধান এবং অপ্টিমাইজেশনের অ্যালগরিদমগুলি বেশ একই।
আরেকটি (তবে জটিল) এআই অ্যালগরিদম - এটি গেমটির জন্য আরও উপযুক্ত হবে - এটি হ'ল "সাময়িক পার্থক্য শিখুন"।
শুভেচ্ছা সহ
স্টিফান
পিএস: আপনি যদি সম্ভাব্য গেমের রাজ্যগুলির সংখ্যা হ্রাস করেন (যেমন মানচিত্রের খুব ছোট আকার, খেলোয়াড় প্রতি কেবল একটি বোমা, অন্য কিছুই নয়), সমস্ত গেমের রাজ্যের জন্য একটি মূল্যায়ন প্রাক-গণনা করার সুযোগ রয়েছে।
--edit--
আপনি নিউরোনাল নেটওয়ার্ক প্রশিক্ষণের জন্য মিনিম্যাক্স গণনার অফলাইন-গণিত ফলাফলগুলিও ব্যবহার করতে পারেন। অথবা আপনি তাদের হাত দ্বারা প্রয়োগিত কৌশলগুলির মূল্যায়ন / তুলনা করতে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি প্রস্তাবিত কিছু "ব্যক্তিত্ব" এবং কিছু হিউরিস্টিকস প্রয়োগ করতে পারেন যা সনাক্ত করে, কোন পরিস্থিতিতে কোন কৌশলটি ভাল। অতএব আপনার পরিস্থিতিগুলি "শ্রেণিবদ্ধ" করা উচিত (যেমন গেমের অবস্থা)। এটি একটি নিউরোনাল নেটওয়ার্ক দ্বারাও পরিচালনা করা যেতে পারে: বর্তমান পরিস্থিতিটিতে হ্যান্ড-কোডেড কৌশলগুলির মধ্যে কোনটি সেরা খেলছে এবং এটি সম্পাদন করে তার পূর্বাভাস দেওয়ার জন্য একটি নিউরোনাল নেটওয়ার্ক প্রশিক্ষণ দিন। এটি একটি আসল গেমের জন্য অত্যন্ত ভাল রিয়েল-টাইম সিদ্ধান্ত নিতে পারে। অল্প-গভীরতার সীমা অনুসন্ধানের চেয়ে অনেক বেশি ভাল যা অন্যথায় অর্জন করা যায়, যেহেতু অফলাইন-গণনাগুলি কত বেশি সময় নেয় (এগুলি খেলার আগে হয়) তাতে কিছু আসে যায় না।
- সম্পাদনা # 2 -
আপনি যদি প্রতি 1 সেকেন্ডে আপনার সেরা চালগুলি পুনরায় গণনা করেন তবে আপনি আরও উচ্চ স্তরের প্ল্যানিং করার চেষ্টা করতে পারেন। আমি এর অর্থ কি? আপনি জানেন যে 1 সেকেন্ডে আপনি কতগুলি চালনা করতে পারেন। সুতরাং আপনি পৌঁছনীয় পজিশনের একটি তালিকা তৈরি করতে পারেন (উদাহরণস্বরূপ যদি এটি 1 সেকেন্ডে 3 পদক্ষেপ হয়, আপনার 25 টি পৌঁছনীয় পজিশন থাকবে)। তারপরে আপনি যেমন পরিকল্পনা করতে পারেন: "অবস্থানের এক্সে যান এবং একটি বোমা রাখুন"। অন্য কেউ পরামর্শ দিয়েছিল যে আপনি একটি "বিপদ" মানচিত্র তৈরি করতে পারেন, যা রাউটিং অ্যালগরিদমের জন্য ব্যবহৃত হয় (এক্স পজিশনে কীভাবে যাবেন? কোন পথে অগ্রাধিকার দেওয়া উচিত [বেশিরভাগ ক্ষেত্রে সম্ভাব্য কিছু পরিবর্তন থাকতে পারে])। এটি একটি বিশাল হ্যাশ টেবিলের সাথে তুলনায় কম স্মৃতিশক্তি, তবে কম অনুকূল ফলাফল দেয়। তবে এটি যেমন কম স্মৃতি ব্যবহার করে তা ক্যাচিং এফেক্টের কারণে এটি আরও দ্রুত হতে পারে (আপনার এল 1 / এল 2 মেমরি ক্যাশের আরও ভাল ব্যবহার)।
সংযোজন: আপনি প্রাক-অনুসন্ধানগুলি করতে পারতেন যার মধ্যে প্রতিটি প্লেয়ারের জন্য চালগুলি হ'ল ফলাফল হ্রাসের ফলে বিভিন্ন প্রকারের বাছাই করতে পারে। সুতরাং অন্য সমস্ত খেলোয়াড়কে গেমের বাইরে নিয়ে যান ... স্টোর যা প্রতিটি খেলোয়াড় হারানো ছাড়াই চয়ন করতে পারে এমন সংমিশ্রণগুলি সঞ্চয় করুন। যদি কেবলমাত্র হ্রাসকারী চালগুলিই থাকে তবে প্লেয়ার সংমিশ্রণের সন্ধান করুন যেখানে প্লেয়ার দীর্ঘকাল বেঁচে থাকে। এই জাতীয় গাছ কাঠামো সংরক্ষণ / প্রক্রিয়া করার জন্য আপনার সূচী-পয়েন্টারগুলির সাথে এই জাতীয় অ্যারে ব্যবহার করা উচিত:
class Gamestate {
int value;
int bestmove;
int moves[5];
};
#define MAX 1000000
Gamestate[MAX] tree;
int rootindex = 0;
int nextfree = 1;
প্রতিটি রাজ্যের একটি মূল্যায়ন "মান" থাকে এবং চলন্ত অবস্থায় "ট্রি" এর মধ্যে অ্যারে সূচকটি সংরক্ষণ করে (0 = থামাতে, 1 = উপরে, 2 = ডান, 3 = নীচে, 4 = বাম) চলার সময় পরবর্তী গেমস্টেটগুলির লিঙ্ক থাকে [0 ] সরানো [4]। আপনার গাছটি পুনরাবৃত্তভাবে তৈরি করতে এটি এর মতো দেখতে পারে:
const int dx[5] = { 0, 0, 1, 0, -1 };
const int dy[5] = { 0, -1, 0, 1, 0 };
int search(int x, int y, int current_state, int depth_left) {
// TODO: simulate bombs here...
if (died) return RESULT_DEAD;
if (depth_left == 0) {
return estimate_result();
}
int bestresult = RESULT_DEAD;
for(int m=0; m<5; ++m) {
int nx = x + dx[m];
int ny = y + dy[m];
if (m == 0 || is_map_free(nx,ny)) {
int newstateindex = nextfree;
tree[current_state].move[m] = newstateindex ;
++nextfree;
if (newstateindex >= MAX) {
// ERROR-MESSAGE!!!
}
do_move(m, &undodata);
int result = search(nx, ny, newstateindex, depth_left-1);
undo_move(undodata);
if (result == RESULT_DEAD) {
tree[current_state].move[m] = -1; // cut subtree...
}
if (result > bestresult) {
bestresult = result;
tree[current_state].bestmove = m;
}
}
}
return bestresult;
}
এই জাতীয় গাছের কাঠামো অনেক দ্রুত, কারণ গতিশীলভাবে মেমরি বরাদ্দ করা সত্যই ধীর! তবে, অনুসন্ধানের গাছটি সংরক্ষণ করা বেশ ধীর হয় ... সুতরাং এটি আরও অনুপ্রেরণা।