کامپیوتر چگونه شطرنج بازی می کند ؟
برای شروع به یک تخته بازی با ابعاد ۸*۸ نیاز داریم . هر یک از طرفین ۱۶ مهره در اختیار دارند . فرض را بر این بگیریم که مهره های سفید برای کامپیوتر و مهره های سیاه برای ما باشد .
همانطور که می دانید شروع بازی با مهره سفید است ، بنابراین کامپیوتر اقدام به حرکت مهره سفید می کند . اما اینکه کدام مهره را حرکت دهد جای بحث دارد . می دانیم که مهره سفید یا سیاه برای شروع بازی هر کدام می توانند ۲۰ حرکت انجام دهند :
▪ ۸ حرکت برای سربازها اگر یک خانه به جلو بروند ، ۸ حرکت دیگر اگر همان سربازها دو خانه به جلو بروند .
▪ دو حرکت برای هر یک از اسب ها (دو اسب) که در جمع ۴ حرکت می شود .
بنابراین هر مهره سفید یا سیاه برای شروع می تواند یکی از ۲۰ حرکت ممکن را انتخاب کند .
حال فرض کنیم کامپیوتر بدون توجه به ارزش حرکات ؛ یکی از این ۲۰ حرکت را انتخاب می کند و بازی را شروع می کند . بعد از این حرکت نوبت به مهره مشکی می رسد ، مهره مشکی هم می تواند یکی از ۲۰ حرکت مورد نظر خود را انجام دهد .
دوباره نوبت به کامپیوتر می رسد تا مهره دوم خود را حرکت دهد . اما اینبار بسته به اینکه کدام یک از مهره ها را در حرکت قبل حرکت داده است می تواند به تعداد ۲۰ حرکت یا کمتر یا بیشتر را انتخاب نماید . و دوباره مهره مشکی هم بسته به حرکت قبلی خودش می تواند مهره ها را تکان دهد .
نکته کار اینجاست که کامپیوتر از کجا بداند کدام یک از این ۲۰ حرکت یا کمتر یا بیشتر را انجام دهد . کامپیوتر برای حل این مساله با درست کردن درختی در حافظه خود تمامی حرکات ممکن را انجام می دهد تا بهترین نتیجه را بدست بیاورد . فرض می کنیم به این ترتیب باشد که برای حرکت اول برای هر کدام از ۲۰ حرکت یک بار بازی را تمام می کند باین ترتیب که بعد از حرکت دادن مهره در حافظه خود فرض را بر این می گیرد که طرف مقابل کدام مهره را حرکت خواهد داد و اگر حرکت داد خودش کدام مهره را حرکت بدهد تا در نهایت بازی را ببرد . یعنی اگر در مرحله اول امکان ۲۰ انتخاب را دارد مهره مشکی می تواند بسته به حرکت مهره سفید ۲۰*۲۰ حرکت انجام دهد . بنابراین در حرکت دوم خود می تواند ۴۰۰*۲۰ حرکت را انتخاب کند و دوباره مشکی ۸۰۰۰*۲۰ انتخاب و به همین ترتیب این تعداد حرکات ممکن پیش بینی می شود تا بازی تمام شود . عدد حاصل عدد یک بهمراه ۱۲۰ عدد صفر در جلوی آن خواهد بود . این عدد ۱۰۱۲۰ در مقابل عددی مانند تعداد کل اتم های دنیا که معادل ۱۰۷۵ می باشد بسیار بزرگ است . بنابراین متوجه می شوید که بازی شطرنج تا چه حد می تواند پیچیده باشد .
اما واقعیت اینستکه هیچ کامپیوتری نمی تواند کل درخت مورد نظر را ایجاد کند . و تمام ۱۰۱۲۰ حرکت ممکن را انجام دهد . بلکه کامپیوتر به جای تمام کردن کل بازی می تواند ۳ یا ۵ یا حتی ۱۰ تا ۲۰ حرکت بعدی را انجام دهد (پیش بینی کند) . اگر فرض را بر این بگیریم که برای هر حرکت مهره در بازی تنها ۲۰ انتخاب داریم برای ایجاد یک درخت ۵ مرحله ای که بتواند ۵ حرکت جلوتر را پیش بینی کند ۳۲۰۰۰۰ حرکت ممکن باید بررسی شود . همچنین اگر بتوان یک درخت ۱۰ مرحله ای ایجاد کرد بنابراین می توان ۱۰۰۰۰۰۰۰۰۰۰۰۰۰ ( ۱۰ تریلیون) حرکت ممکن را بررسی کرد . بنابراین در اینجاست که سرعت کامپیوتر برای بازی شطرنج مشخص می شود . هرقدر سرعت کامپیوتر برای بازی بیشتر باشد حرکات اینده بهتری در نتیجه با قدرت بیشتری پیش بینی می شود . اما واقعیت اینجاست که پرسرعتترین کامپیوتر شطرنج باز دنیا تنها می تواند تا چند میلیون حرکت را در هر ثانیه پیش بینی کند .
اما کار به همین جا تمام نمی شود پس از تولید درخت کامپیوتر باید به ارزیابی موقعیت های درست شده بپردازد و اینکه تشخیص دهد که کدام حرکت را انجام دهد تا بهترین حرکت ممکن باشد .
اولین گام برای ارزیابی تعداد مهره هایی ست که کامپیوتر در صفحه شطرنج خواهد داشت . برای انجام این کار به کمک یک تابع ارزیابی می تواند تعداد مهره هایی که هر یک از طرفین بعد از حرکت مهره خواهند داشت را محاسبه کند . به کمک تابع ارزیابی می تواند تشخیص دهد که حرکتی که انجام دهد "خوب" است یا "بد" . اگر خوب است مهره را حرکت می دهد و اگر بد حرکت دیگری را انتخاب می کند . مثلا اگر کامپیوتر در انتهای حرکت ۱۱ مهره خواهد داشت و حریف ۹ مهره در نهایت دو مهره) ۲=۹-۱۱ ( بیشترخواهد داشت که این نتیجه "خوب" دارد .
البته تابع فوق برای بازی شطرنج بسیار ساده است و تنها ملاک برای بازی تعداد مهره ها نیست . همانطور که همه می دانیم هر کدام از مهره ها برای خود ارزشی دارند . موقعیت و محل مهره ها نیز قابل توجه است . اینکه آیا شاه ما در خطر کیش هست یا خیر . وزیر ما در خطر از دست رفتن می باشد یا خیر و موارد دیگر . اینجا وظیفه برنامه نویس است که فرضا با ارزش گذاری روی مهره ها با اعداد بتواند ارزش مهره ها را مشخص کند مثلا قلعه معادل ۵ سرباز است . فارغ از اینکه تابع ما چه پیچیدگی های دیگری می تواند داشته باشد . مهم اینستکه تابع ما در نهایت چه عددی بر می گرداند . که این تابع نشانگر میزان خوب یا بد بودن حرکتی است که قرار است انجام شود .
فرض را براین می گیریم که در هر حالت هر یک از مهره ها می توانند تنها سه حرکت انجام دهند .
کامپیوتر مهره سفید است و می تواند یکی از سه حرکت ممکن را انجام دهد . اگر هر یک از سه حرکت ممکن را انجام دهد مهره گردان مشکی هم میتواند سه حرکت انجام دهد ( در عمل تعداد حرکات بیشتر است که بدلیل بزرگ شدن درخت از کشیدن تمامی حالات صرف نظر می کنیم ) . بعد از حرکت مهره های سیاه مهره های سفید هم میتوانند دو حرکت انجام دهند . پایین ترین مرحله درخت.( parsx)
اما برای تحلیل درخت کامپیوتر از پایین ترین گره ( برگ) شروع به محاسبه می کند از سمت چپ پایین عدد بین دو برگی که ارزش ۸ و ۲ دارند عدد ۸ انتخاب می شود این بآن دلیل است که از آنجایی که مهره سیاه حریف است باید پرارزشترین حرکت را انتخاب کرد ( مهره سیاه = ماکسیمم) از بین برگ های ۴ و ۸ هم ۸ را انتخاب می کند
حال که به انتخاب حرکت مشکی رسیدیم باید مقادیر مینیمم را در مرحله دوم یعنی عمق ۳ ( مهره های مشکی ) انتخاب کنیم یعنی بصورت قراردادی حرکات مهره های سفید که خودش می باشد باید کمترین ارزش را داشته باشند بنابراین از سمت چپ بین سه عدد ۸۸۷ عدد ۷ برای مهره سفید سمت راستی قرار می گیرد و برای بعدی عدد ۵ و بعدی عدد : ۴
همانطور که از شکل پیداست نوبت به انتخاب برای حرکات سفید است بنابراین باید دوباره ماکسیموم مقادیر را انتخاب کنیم . اکنون کامپیوتر آماده انتخاب مقدار ماکسیموم از بین سه عدد ۷۵۴ می باشد بنابراین کامپیوتر حرکتی که ارزش ۷ دارد را انتخاب می کند ( ماکسیموم).