Програмування шахових двигунів є дуже складною територією, тому на передньому напрямку я вкажу на Шахове програмування Wiki , яке має багато чудової інформації з цієї теми.
Фон
Шахові розрахунки (і багато подібних речей), як правило, моделюються і вважаються як "ігрові дерева" або " дерева рішень ". Загалом, це дерево - це спрямований графік з одним вузлом вгорі (поточне положення), що веде до вузла для кожного можливого переміщення, кожен з яких призводить до більшої кількості вузлів для кожного можливого наступного переміщення тощо.
У своїй найпростішій формі, грубі сили, шахові двигуни генерують усі позиції на цьому дереві до деякої межі глибини ("шару"), оцінюючи кожну результуючу позицію на основі деяких складних критеріїв 1 . Потім він відтворює хід, який, здається, призводить до найкращого результату. На сьогоднішній день було розроблено багато справді складних методик для обмеження кількості позицій, на які повинен дивитись двигун, але я збираюся ігнорувати їх для цілей цієї відповіді, оскільки вони не змінюють справжнього питання на рукою.
Math Tangent
Основна причина того, що двигунам зазвичай потрібно приблизно стільки ж часу, щоб розглянути кожен хід, це те, що розмір дерева рішень збільшується експоненціально з глибиною ( k
).
Розглянемо вихідне положення. Верхівка дерева ( k=0
) - один вузол. Для Білого існує двадцять можливих перших ходів, тому на глибині є двадцять вузлів k=1
. Тоді, у Black також є двадцять доступних рухів для кожного з варіантів White: так k=2
що, 20 * 20 = 400
можливі позиції! І це тільки погіршується, коли гравці розробляють свої твори!
Наприклад, зробимо вигляд, що для кожного гравця завжди є двадцять можливих рухів у будь-який момент 2 . Ви доручаєте комп’ютеру дивитися вперед по п’ять рухів для кожного гравця (десять шарів). Давайте розглянемо розмір грубої сили дерева на кожному рівні. Для задоволення ми також розглянемо загальну кількість позицій на дереві (від верху до заданого рівня).
Ply | Positions | Total Tree Size
----------------------------------------
0 | 1 | 1
1 | 20 | 21
2 | 400 | 421
3 | 8000 | 8421
4 | 160000 | 168421
5 | 3200000 | 3368421
6 | 64000000 | 67368421
7 | 1280000000 | 1347368421
8 | 25600000000 | 26947368421
9 | 512000000000 | 538947368421
10 | 10240000000000 | 10778947368421
Результатом кожного рівня є експоненціально більше попереднього рівня, що розмір цілого дерева переважає нижній рівень . Розглянемо приклад вище: один останній рівень містить десять трильйонів вузлів. Увесь решта дерева містить лише п'ятсот мільярдів. Десятий шар містить близько 95% вузлів у всьому дереві (це насправді вірно на кожному рівні). На практиці це означає, що весь час пошуку витрачається на оцінку "останнього" кроку.
Відповідь
То як це стосується вашого питання? Ну, скажімо, комп'ютер встановлений на десять планів, як зазначено вище, і далі він "запам'ятовує" результати своїх оцінок. Він обчислює хід, відтворює його, а потім робиш хід. Зараз було зроблено два рухи, тож воно обрізає всі позиції з пам’яті, пов’язані з рухами, які не відбулися, і залишається з деревом, яке опускається до решти восьми кроків, які вона вже обчислила: 26 947,368,421 позиції!
Гаразд! Тож нам потрібно лише обчислити останні два шари! Використовуючи нашу оцінку на 20 кроків на кожну глибину, загальна кількість рухів, які нам потрібно обчислити, все ще перевищує десять трильйонів. Позиції, які ми вже розраховували, складають лише 2,5% можливостей! Тож навіть кешуючи результати останнього ходу, найкраще, на що ми можемо сподіватися, - це швидкість на 2,5%! В основі цього, тому навіть якщо ваша програма кешує попередні результати, ви зазвичай не бачите значного прискорення між рухами (за винятком випадків, коли комп'ютер знаходить вимушеного товариша чи щось, звичайно!).
Спрощення відмови
У цьому питанні багато складності, саме тому я зв’язав вікі програмування в самому верху і лише спробував пояснити відповідь у широких математичних термінах. Насправді програми , як правило, кешують частини дерева з руху в рух, і є й інші причини, чому це недостатньо саме по собі - деякі прості причини (наприклад, певна лінія може виглядати на восьми ходах, але закінчується спиною -кінька дружина в русі дев'ять!) і багато дуже складних (як правило, пов'язаних з різними розумними методами обрізки). Тож комп'ютер повинен продовжувати дивитися далі вперед, намагаючись уникнути поганих припущень на основі глибини відключення попереднього ходу.
1 Я не збираюся потрапити в евристичні функції тут, тому що це його власна неймовірно складна область, але часто деякі вигоди , які можуть бути досягнуті з допомогою схем кешування позиції тут.
2 Середній коефіцієнт розгалуження 20, ймовірно, є занадто низьким .