Я припускаю, що ви вже знаєте про концепцію Min-Max, дерева та обрізку, евристичні та інші основи, і те, що я тут пишу, - лише деякі деталі, які, можливо, були недооцінені.
Я з товаришем по друку писав свій шаховий двигун іноді тому. Я поділяю деякі проблеми та ідеї, які ми мали, і сподіваюся, ви вважаєте їх корисними.
Оскільки ми обидва були програмістами Java, наша мова перетворилася на java, і ми почали з об'єктно-орієнтованого підходу. Шматки були предметами, дошка - об’єктом, файли та ранги (рядки та стовпці в шаховій літературі) - об’єкти. І це було неправильно. Накладні витрати були масивними, і програма намагалася пройти далі, ніж два кроки (4-х шарів) у дереві пошуку.
Тож з деяким пошуком у нас виникла геніальна ідея (не наша, проте!): Представляючи шматки та плату у вигляді довгих цілих чисел (64 біт). Це має сенс, оскільки шахова дошка має 64 квадрата. Решта - трохи розумні операції (працює дуже близько до cpu = надзвичайно швидко). Наприклад, розглянемо двійкове 64-бітове ціле число, в якому представлені квадрати на дошці, на які ваш шматок може атакувати. Тепер, якщо ви виконаєте логічне "І" між двома подібними числами, ненульовий результат зазначає, що у вас є квадрат з нападниками. Існує кілька способів подання шахової дошки та фігур. Отже:
1 - прийняти рішення про презентацію вашої ради
Тоді вам потрібно і відкрити базу даних. Відкриття шахів якимось чином вирішено, тому дуже рекомендується мати та відкривати книгу. У цьому випадку у вас є багато додаткового часу в бліц-іграх.
2 - Знайдіть собі відкриття книги.
Ми зробили це, але все ж нам було далеко не добре:
3 - Хороший шаховий двигун повинен мати можливість бачити на 6 кроків (12 шарів) попереду.
Тож, що ми зробили тоді, було використовувати мертвий час (якщо це людина від комп'ютера).
4 - Використовуйте час, коли противник думає, щоб створити деякі рівні вашого дерева.
І все-таки ми були далеко від 12 верств. Шляхом більшого вивчення ми виявимо деякі хитрощі! Наприклад, було запропоновано пропустити один шар дерева і почати з наступного (наприклад, немає суперника). Ідея полягає в тому, що якщо рух є вкрай ідіотським, то навіщо витрачати час і бачити, які відповіді на цей хід відповідають опоненти. Однак один хороший двигун повинен вміти розрізняти і ідіотський хід і геніальну жертву королеви.
5 - Вивчіть прийоми програмування цієї конкретної проблеми (шахи).
Мені та моєму другові в цьому стані було все ще погано: / Що ми могли зробити - і ми частково зробили - це зберегти обчислені позиції. Якщо ви обчислюєте позицію, то збережіть її на майбутнє! Те саме стосується циклів у дереві пошуку. Сенс полягав у ефективному збереженні / відновленні:
6 - Збережіть отримані вами дані ... Ефективно!
і, нарешті:
7 - Код з максимальною оптимізацією.
Ця проблема надзвичайно дорога як у процесорі, так і в пам'яті. Дуже важливо дуже ефективно написати свій код. Пам'ятайте, що ми говоримо про галузевий коефіцієнт 35. Це означає марне "якщо" десь у вашій евристиці, може перетворитися на 3.3792205e+18
марне "якщо" десь глибоко у вашому дереві пошуку.
Шахове програмування - дуже цікавий виклик, і саме час ви можете поставити свої можливості програмування в серйозне випробування. Я можу запропонувати ще декілька моментів, але я впевнений, що ви їх відкриєте самі. Є ще багато пунктів, про які я не знаю, але їх можна знайти в Інтернеті!
Хай щастить!
ps Я не знаю JavaScript дуже добре, але щось говорить мені на основі складності проблеми, можливо, враховуючи все, що може запропонувати C ++, було б краще кинути javascript і зробити це на C ++.