بهروز نوعی پور
منبع: ماهنامه شبکه - مهر ۱۳۸۵ شماره 69
اشاره :
درباره
موفقیت كامپیوتر در شكست دادن قهرمانان بازی شطرنج حتماً شنیدهاید. به
راستی كامپیوتر چگونه شطرنج بازی میكند؟ این سؤال جالبی است. به نظر من
بهترین پاسخ را میتوانید از برنامهنویسان بازیهای شطرنج كامپیوتری
بپرسید. این مقاله تحقیقی در همین زمینه است. در اینجا كوشیدهام مدل
برنامهنویسی شطرنج و شیوه تجزیه و تحلیل بازی از نگاه كامپیوتر را تشریح
كنم. اطلاعاتی را كه در اینجا آوردهام، همه از سایت برنامهنویسان
بازیهای كامپیوتری، بهویژه برنامهنویسان بازی شطرنج، استخراج شدهاند.
چرا بررسی شطرنج كامپیوتری؟
ممكن
است بپرسید بررسی آناتومی یك برنامه شطرنج اصلاً چه فایدهای دارد؟ پاسخ
را در دو سه نكته میتوانم خلاصه كنم. در وهله نخست، بررسی آناتومی یك
بازی شطرنج از لحاظ تئوری هوشمصنوعی میتواند نمونه بسیار جالبی از
كاربرد این علم تلقی شود. در بسیاری مواقع وقتی گفته میشود هوش مصنوعی،
برای بسیاری از مردم واقعاً سؤال است كه این هوش از كجا میآید و چگونه
شكل میگیرد. شطرنج یكی از جاهایی است كه میتوانید ببینید چگونه یك سری
معادلات ریاضی كه ظاهری ساده، اما باطنی پیچیده دارند، به تدریج در پیچ و
خم پردازشهای بعدی مبنای هوشمندی ماشین1 را فراهم میكنند.
گذشته
از این، بررسی مكانیزم شطرنجبازیِ كامپیوتر یك موضوع تأملبرانگیز است و
به شما نوعی بینش شبه فلسفی درباره تفاوت رویكرد انسان و ماشین نسبت به
نوع خاصی از معماها میدهد. ضمن اینكه، دریچه ذهن شما را به روی برخی
اشتباهات رایج ذهن انسان بازمیكند كه منجر به تصمیمگیریهای اشتباه و در
نتیجه پیامدهای نامطلوب میشوند. از این رهیافت میتوانید ببینید كه از
دیدگاه علمی یكی از نظریههای مربوط به مبنای اشتباهكردن انسان هنگام
تصمیمگیری میان گزینههای مختلف چیست.
آگاهی از این مسئله
میتواند برای هركارشناس كامپیوتر، آن هم در دنیایی كه یك اشتباه كوچك
میتواند به مدد شبكه جهانی اطلاعات در عرض چند ثانیه سراسر كره زمین را
درنوردد و همچون ویروسهای مخرب كامپیوتری، پیامدهای وخیمی را ایجاد كند،
مهم و آموزنده باشد.
این موضوع نكته دیگری را نیز روشن میكند و آن
اینكه، چگونه برنامهنویسان باهوشی كه توسعهدهنده مدل برنامهنویسی
شطرنج بودهاند، به منطق این اشتباهات پیبردهاند و سعی كردهاند به
كامپیوتر یاد دهند با پیشبینی این اشتباهات، از انسان پیشدستی كند. جالب
اینجاست كه در مدل برنامهنویسی شطرنج، دغدغه كامپیوتر نه سرمایهگذاری
روی اشتباهات حریف، بلكه چارهجویی در مورد اشتباهات احتمالی خودش است! از
آن جالبتر اینكه، بازی شطرنج جزء بازیهای اصطلاحاً <با اطلاعات
كامل> طبقهبندی میشود. بازیهایی كه هر دو طرف دستشان برای یكدیگر رو
شده است.
بنابراین، وقتی میفهمیم كه بهرغم اطلاع طرفین از
وضعیت مهرههای یكدیگر، این همه پیچیدگی در تجزیه و تحلیل وضعیتهای پیش
رو وجود دارد، میتوانید حدس بزنید علت این همه ناكامی آدمیزاد در
پیشبینی سرنوشت بسیاری از تحولات چیست؛ آن هم هنگامی كه دست حریف برایش
رو نیست.
در نهایت، مطالعه و بررسی مدل برنامهنویسی شطرنج یك
تمرین فكری خوب و آموزنده برای همه برنامهنویسان ماجراجوست و می تواند
ذهن كاوشگر آنان را بیش از پیش ورزیده كند. به قول معروف، هم فال است و هم
تماشا!
اثر افق
كالبد
یك نرمافزار شطرنج از قسمتهای مختلفی تشكیل شده است كه كمی جلوتر خواهم
گفت، اما اجازه بدهید برای ورود به بحث، شما را با یكی از چالشهای همیشگی
برنامهنویسان شطرنج آشنا كنم تا ببینید كامپیوتر برای موفقیت در یك بازی
شطرنج، با چه معماهای غامضی دست و پنجه نرم میكند.
لابد
شنیدهاید كه كامپیوتر هنگام شطرنج بازی تا چند مرحله جلوتر را در ذهن
خودش مرور میكند و پیامدهای هر یك از حركتهای فرضی را در هر مرحله
ارزیابی میكند. واقعاً هم همینطور است.
حالا فرض كنید یك
نرمافزار طوری برنامهریزی شده است كه تا هفت مرحله جلوتر را میتواند
محاسبه و ارزیابی كند. تصور كنید یك كامپیوتر با استفاده از چنین الگویی
ناگهان متوجه شود كه ممكن است در پنج نوبت دیگر مُهرهِ وزیرِ خودش را از
دست بدهد و حتماً میدانید مهره وزیر چقدر مهم است.
بنابراین،
باید جایی در منطق نرمافزارِ شطرنج، به كامپیوتر گفته شده باشد كه در
تصمیمسازی برای حركت بعدی خودت <به وضعیت مهره وزیر اولویت بده.>
البته از لحاظ تئوریِ مدرن شطرنج، میتوان پرسید كه آیا واقعاً ارزش یك
مهره وزیر در سراسر یك بازی یكسان است؟ و آیا باید یك شطرنج باز در هر
شرایطی به حفظ جان این مهره بیش از هر مهره دیگر اهمیت بدهد؟
اگر
پاسخ منفی باشد، وضعیت خیلی پیچیدهتر خواهد شد، ولی فعلاً بیایید برای
ساده شدن صورت مسئله، فكر كنیم كه منطق تصمیمسازی كامپیوتر چنین باشد. در
آن صورت نتیجه بدیهی این منطق این خواهد بود كه كامپیوتر شروع به بررسی
سناریوهای مختلف نجات جان وزیر در پنج نوبت دیگر كند و در این میان به این
نتیجه برسد كه بهترین گزینه این است كه مهره اسب خود را در همین نوبت
قربانی كند تا با افزودن فلان حركت در نوبت سوم، دستیابی حریف به این هدف
را دست كم تا نوبت هشتم به تعویق بیندازد. اما مشكل اینجاست كه این
كامپیوتر میتواند تا هفت نوبت جلوتر را محاسبه كند. بنابراین، عملاً تا
یك دست دیگر بازی نكند، نمیتواند پیشبینی كند در نوبت هشتم چه اتفاقی
خواهد افتاد.
از دیدگاه كامپیوتر، عدم روِیت یك معضل در افق دیدش
به معنی نبودن آن معضل است. بنابراین، وقتی با انجامدادن یك حركت
میتوان آن معضل را تا عمق هفت مرحله از میدان دید خارج كرد، شاید به این
معنی باشد كه مشكل حل شده است، ولی چنین نیست. چون در همان گام اول یك اسب
فدا میشود، یك نوبت بازی انجام میشود و دوباره همان مشكل (تهدید شدن
وزیر) در افق دید كامپیوتر ظاهر میشود. پس مشكل حل نشد و كامپیوتر اشتباه
كرد.
<اثر افق> در شطرنج كامپیوتری كه اولین بار توسط هانس
برلینر مطرح شد، از این جهت جالب است كه بهگونه طنزآمیزی تبلور ماهیت
بعضی از خطاهای انسانی نیز هست. به راستی خیلی از ما آدمها دقیقاً به
دلیل همین كوتهبینی، اشتباه میكنیم. یعنی بارها در زندگی تصور میكنیم
وقتی مشكلی در افق دیدمان نیست، یعنی آن مشكل وجود ندارد؛ در حالی كه مشكل
وجود دارد و كافی است یك گام به جلو برداریم تا آن را ببینیم، ولی تا آن
گام را برنداریم، از دیدنش ناتوان هستیم. درست مثل زمانی كه یك بطری
نوشابه گازدار را ناگهان بدون حضورذهن باز میكنیم و تازه وقتی آن را باز
كردیم و گازش بیرون جهید و پیراهنمان را كثیف كرد، یادمان میافتد كه باید
در بطری را آرام باز میكردیم.
اولین درسی كه از اثر افق میتوان
گرفت این است كه پیدا كردن وضعیتی كه نرمافزار بتواند قدرت نسبی نیروها
را در وضعیت كنونی سبك و سنگین كند، اصلاً خیلی مهم نیست؛ زیرا این
ارزیابی ماهیت پویا بودن نیروها را در طول زمان درنظر نگرفته است. ارزیابی
كنونی به درد آرایش كنونی میخورد، ولی چون لحظه بعد آرایش نیروها عوض
میشود، ارزیابی كنونی شاید به كلی بیهوده باشد!!
به زبان ریاضیات
مهندسی، میتوان گفت كه وقتی شرایط اولیه یك معادله ریاضی ثابت باشد، یك
كامپیوتر میتواند این معادله را هرچند هم پیچیده باشد، به سادگی حل كند.
اما اگر بلافاصله در ثانیه بعدی شرایط اولیه تغییر كند، آن هم تغییری كه
خودش تابعی از چگونگی اولین برخورد شما با معادله است، در آن صورت حل این
معادله ممكن است از لحاظ نظری تا بینهایت به تعویق بیفتد.
درس
دیگری كه از این پدیده میتوان گرفت این است كه دنبال كردن خط سیر تحولات
در هرجهت تا عمق x مرحله كار بیهودهای است. بعضی از مسیرها مهمترند. این
مسیرها را باید تا عمق مثلاً ده یا پانزده نوبت بازی دنبال كرد و بعضی
دیگر را باید تا عمق پنج مرحله دنبال و بعد از آن را رها كرد. اشتباه است
اگر همه مسیرها را تا عمق مثلاً هفت نوبت دنبال كنیم. در این صورت چگونه
باید تشخیص دهیم كدام مسیر اهمیت استراتژیك بیشتری دارد و كدامیك از
مسیرها كم اهمیتتر هستند؟
این چیزی است كه یك انسان هوشمند
گاهی به صورت خودآگاه و گاهی ناخودآگاه انجام می دهد. به همین دلیل وقتی
مثلاً شیئی را در اتاقمان گم میكنیم، تمام اتاق را به شعاع سه متر زیر و
رو نمیكنیم. این كار نادرست است. پس با خود میگوییم كجاها را باید
دقیقتر بگردیم؟ كجاها را باید یك نگاه سطحی بیندازیم؟ شما از كجا
میفهمید برخی مناطق داخل اتاقتان اهمیت بیشتری برای پیدا كردن یك شی
گمشده دارد؟
نوعی از هوش مصنوعی در بازی شطرنج به همین ترتیب شكل
میگیرد. در واقع این هوش مصنوعی بیشتر معطوف به هوشمندی در انتخاب
مسیرهای مهمتر برای دنبال كردن تحولات هستند. خوشبختانه چندین الگوریتم
ریاضی جالب تاكنون عرضه شدهاند تا بتوان اثر افق را شكست داد و ماورای آن
را دید. بسطهای ویژه Deep Blue از جمله همین الگوریتمها هستند.
(احتمالاً بلافاصله می توانید حدس بزنید چرا كامپیوتر Deep Blue سرانجام
توانست كاسپاروف، قهرمان جهانی شطرنج، را شكست دهد.)
آناتومی یك نرمافزار شطرنج
اثر
افق یك موضوع مهم در معماری فكری یك نرمافزار شطرنج است، ولی تمامِ
مسئلهای نیست كه كامپیوتر باید حل كند. اثر افق فقط یك جنبه از مشكلات
تكنیكهای جستوجو است و تكنیكهای جستوجو یكی از چهار ستون اصلی هر
نرمافزار شطرنج هستند. كامپیوتر باید به حل سه مسئله محوری دیگر نیز فكر
كند: چیدمان مهرهها، تولید حركت، و ارزیابی، به ترتیب سه موضوع مهم دیگری
است كه هر نرمافزار شطرنج باید به آن فكر كند و در ادامه نیز به بررسی
این چهار ركن میپردازیم.
چیدمان مهرهها
چیدمان
مهرهها، عبارت است از تصویرسازی كامپیوتر از صفحه بازی. كامپیوتر چگونه
باید صفحه بازی را <ببیند>؟ چگونه باید بفهمد این مهرهها كجا
هستند؟
چگونه باید فهمید الان پنج مهره سیاه، هفت مهره سفید را
تهدید میكنند؟ نرمافزارهای شطرنج عمدتاً از تكنیكی به نام bitboard برای
دیدن صفحه بازی استفاده میكنند.
بیت بورد كه ظاهراً اختراع شطرنج
بازان شوروی سابق است، متشكل از یك آرایه 64 بیتی است كه متناظر با 64
خانه شطرنج درنظرگرفته شدهاند.
نرمافزارهای امروزی شطرنج از
تعداد بسیار زیادی بیتبورد برای به تصویر كشیدن وضعیت مهرهها در ذهن خود
استفاده میكنند. هر بیت از این آرایه ممكن است صفر یا یك باشد. وضعیت
<یك> به معنی اشغال بودن خانه و وضعیت <صفر> به معنی خالی
بودن خانه متناظر در صفحه شطرنج است. مثلاً یك بیتبورد ممكن است مربوط به
خانههایی باشد كه توسط فیل سیاه اشغال شدهاند. یك بیت بورد دیگر ممكن
است مربوط به خانههایی باشد كه مهرههای سفید، مهرههای سیاه را مورد
حمله قرار دادهاند و یك بیت بورد دیگر نشان دهد اسبی كه در خانه 4e قرار
دارد، كدام خانهها را زیر نفوذ خود دارد.
تولید حركت
<تولید
حركت> قسمت دیگری از وظیفه نرمافزار است و منظور از آن این است كه
هنگامی كه نوبت بازی به كامپیوتر میرسد، قبل از این كه تصمیم بگیرد چه
كار كند، باید بداند حركتهای مجاز او كدامند. در وهله نخست ممكن است به
نظر برسد این كار آسان است، ولی به یاد بیاورید كه هر مهره شطرنج قوانین
حركتی خاصی دارد. مثلاً شاهی كه در حالت كیش است، قابل حركت دادن نیست.
همچنین
فیل به صورت قطری حركت میكند. اسب به صورت حرف L مانور میدهد. رخ
حركتهای عمودی و افقی دارد و وزیر تركیبی از قدرت حركتی رخ و فیل را به
صورت همزمان در اختیار دارد، اما از شیوه حركتی منحصر به فرد اسب بیبهره
است. بنابراین تركیب قوانین حركتی این مهرهها - آن هم با درنظر گرفتن این
واقعیت كه برخی خانهها هماكنون اشغال هستند - وضعیت پیچیدهای را ایجاد
میكند كه محاسبه همه حالتهای مجاز، به شدت توان پردازشی كامپیوتر را طلب
میكند.
خوشبختانه در مدل نرمافزاری شطرنج از قوانین این بازی
چندین ساختار یا آرایش دادهای مختلف استخراج شده است كه میتوانید آنها
را نوعی از <محاسبات قبلاً انجام شده> بنامید. اینها در واقع
الگوهای آرایشی خاصی هستند كه میتوانند مسیر محاسبه برای به دست آوردن
تمام حركتهای مجاز بعدی را كوتاه كنند.
تكنیكهای جستوجو
<تكنیكهای
جستوجو> قلب هر نرمافزار شطرنج هستند. منظور از <جستوجو>
یافتن حركتهای خوب و مجاز بعدی است. مجاز بودنشان در مرحله تولید حركت
شناسایی شده است و ارزیابی میزان خوب یا بد بودن این حركتها و سرانجام
انتخاب یكی از آنها میماند. این كار به واقع مشكل است. چنان كه دیدید،
اثر افق یكی از مسائلی است كه باید حل شود. جستوجو در پایهایترین شكل
آن با معادلهای به صورت b به توان n توصیف میشود كه در آن b اصطلاحاً
فاكتور انشعاب و n عمق حركت است.
فاكتور انشعاب تعداد حركتهای
مجاز از سوی هر دو حریف در هر نوبت بازی است و عمق عبارت از تعداد
نوبتهایی است كه قرار است به ارزیابی حركتهای طرفین بپردازیم. بنابراین،
نتیجه این معادله یك منحنی نمایی است كه به سرعت رشد میكند و تنوع
فوقالعاده زیادی را در انواع حالتهای ممكن به وجود میآورد. خوشبختانه
الگوریتمهای خیلی خوبی برای محاسبه انواع حالتهای پیش رو ابداع شدهاند.
البته
این الگوریتمها برای رویارویی با مقولاتی مانند اثر افق طراحی نشدهاند،
بلكه صرفاً مسیر ارزیابی حالتهای مختلف سود و زیان انجام دادن انواع
حركتهای مجاز را كوتاه میكنند. از جمله الگوریتمهای موفق میتوان به
الگوریتم نگا اسكوت، الگوریتم MTD)f) و الگورتیم تكرارشونده آلفابتا اشاره
كرد.
اما علاوه بر الگوریتمهای اصلی، در محاسبه حركتهای بعدی
باید به فكر راهكارهایی برای مقابله با اثر افق نیز بود. مثلاً تیم توسعه
كامپیوتر Deep Blue مفهوم <بسطهای ویژه> یا Singular Extensions را
توسعه دادند. این تكنیك میگوید: واضح است كه در بازی شطرنج بعضی حركتها
خیلی مؤثرتر و مهمتر از حركتهای دیگرند و نباید خیلی وقت تلف كرد تا به
درست بودن آن ها پی برد.
به تعبیر خودمان، نباید در مورد انتخاب
این حركتها زیاد تأمل كرد. مثلاً ممكن است به این نتیجه برسید كه با دو
حركت دیگر میتوانید وزیر حریف را بگیرید. تئوری بسطهای ویژه میگوید
وقتی به چنین موقعیتهایی برخورد میكنید، هوشمندانهتر این است كه وقت
بیشتری بگذارید و تا چند نوبت، بیشتر از مقدار پیش فرض خودتان برای محاسبه
حركتهای بعدی، این مسیر را دنبال كنید؛ مبادا دام یا اشتباهی در كار
باشد! این كار بهتر از این است كه ماشین وار همه مسیرها را به یك اندازه
دنبال كنید.
ارزیابی
سرانجام
مسئله چهارم دیگری كه باید كامپیوتر در فكر آن باشد، مسئله
<ارزیابی> وضعیت كلی بازی است. چگونه كامپیوتر باید بفهمد كه الان
از حریفش جلو است یا عقب؟ آیا در شرف پیروزی است یا شكست؟ باید برای نجات
از شكست یا به تعویق انداختن آن برنامهریزی كند یا به فكر تسریع پیروزی
قریبالوقوع خود باشد؟ معمای <ارزیابی بازی> از جمله مهمترین مسائل
پیش روی برنامهنویسان شطرنج است. مسئله <تكنیكهای جستوجو> حتی در
پیچیدهترین شكلش در سرتاسر ساختار بازی شطرنج تابع یك سری قواعد عمومی
است: اگرعمل A اتفاق بیفتد و سپس واكنش B روی دهد، آنگاه احتمال وقوع
حالت C وجود دارد.
این مسیر ممكن است دوباره پس از دو نوبت بازیِ
طرفین تكرار شود. در حالی كه مسئله <ارزیابی> یك مسئله راهبردی و
خاص هر مورد بازی شطرنج است و امكان ندارد آرایش كنونی بازی، تعداد
مهرههای طرفین و وضعیت قوت و ضعف آنها پس از یك نوبت بازی طرفین مانند
نوبت قبلی باشد. <ارزیابی> در سادهترین شكلش شامل بررسی این واقعیت
است كه هر یك از دو حریف در هر مقطعی از بازی چند مهره دارند و این
مهرهها صرف نظر از چیدمانشان چه ارزشی دارند. این در حقیقت نوعی ارزیابی
كمّی از وضعیت بازی است.
تئوری شطرنج برای هر نوع مهره وزن
مخصوصی قائل است. مثلاً میگویند وزیر نُه امتیاز میارزد، رخ پنج، فیل
چهار، اسب سه و پیاده یك امتیاز. به این ترتیب نرم افزار میتواند از
فرمول (Sum (Ni * Vi استفاده كند كه در آن مجموعِ حاصلضرب Ni در Vi به
ازای هر نوع مهره برای یك حریف محاسبه میشود. در اینجا Ni تعداد
مهرههایی از یك نوع و Vi ارزش هر نوع مهره است.
اما ارزیابی كمّی
كافی نیست. باید دید این مهرهها از نظر عملی چقدر كارآمد هستند. شاید یك
وزیر كه بالقوه میتواند خطر بزرگی باشد، به جهت آچمز شدن در شرایطی كه او
را ناگزیر از پاسبانی از جان شاه كرده است، عملاً در مراحل میانی یا
پایانی بازی كارایی محدودی داشته باشد. به هرحال برای ارزیابی بازی
معادلات مختلفی نوشته شده است كه در هر نرمافزار از بعضی از آنها
استفاده میشود. طبیعی است كه هرچه این معادلات جامعنگرتر باشند، دقت
نرمافزار بیشتر میشود. خود تكنیك ارزیابی چند ركن دارد: توازن كمی قوا،
قدرت مانور و میزان نفوذ مهرهها روی خانههای مختلف صفحه بازی، توسعه
بازی، آرایش پیاده نظام، و امنیت شاه، از جمله مهمترین اركان ارزیابی
هستند.
به عنوان مثال، تئوری كلاسیك شطرنج تأكید دارد كه مهرههای
ضعیفتر بازی مثل فیل و اسب باید هرچه سریعتر به وسط معركه آورده شوند.
شاه خوب است كه هرچه سریعتر به فكر رفتن به قلعه باشد و مهرههای رخ و
وزیر بهتر است در جای خود آرام بنشینند تا بازی به لحظات استراتژیك و
سرنوشتساز خود نزدیك شود. در تئوری مدرن شطرنج به جنبههای پیشرفتهتری
از بازی نیز اندیشیده میشود.
مثلاً اینكه مهرهایی مانند اسب و
فیل باید سریعاً در فكر فتح مركز باشند تا هم از حملات وزیر حمایت كنند و
هم فضا را برای مانور دادن رخها باز كنند. معادلات و تكنیكهای ارزیابی
در حقیقت میتوانند به این مسئله پاسخ دهند كه اگر كامپیوتر بخواهد از یك
استراتژی معین برای پیروزی استفاده كند (مثلاً فتح مركز)، چگونه باید
میزان تحقق این اهداف میانی را ارزیابی و بررسی كند. تكنیكهای ارزیابی
همچنین میتوانند به این مسئله فكر كنند كه آرایش پیاده نظام چگونه است؟
مثلاً تا چه اندازه نزدیك بودن پیادهها به یكدیگر شعاع عمل آنها را
محدود یا باز كرده است. چقدر شانس پیروزی برای وزیر شدن یك پیاده وجود
دارد و مواردی از این قبیل.
جمع بندی
به این ترتیب میتوان مدل هوشمند مصنوعی در یك نرمافزار شطرنج را چنین خلاصه كرد: این هوشمندی چهار ركن دارد:
یكم: <بینایی> نرمافزار
دوم: آگاهی از قوانین بازی
سوم: هوشمندی در جستوجو برای یافتن بهترین حركت بعدی
چهارم: هوشمندی در سنجش وضعیت كنونی و ارزیابی میزان تحقق استراتژی انتخاب شده برای رسیدن به پیروزی نهایی یا دستیابی به اهداف میانی
پی نوشت
لازم
به ذكر است كه تلقی هوشمندانه بودن محاسبات نرمافزارهای شطرنجباز، محل
بحث فراوان است و عدهای عقیده دارند كه چنین نرمافزارهایی را نباید
هوشمند به حساب آورد. در نتیجه در این نوشتار، هوشمند بودن نرمافزار
شطرنجباز، نظر شخصی نویسنده است.