Чи зберігають шахові двигуни всі раніше проаналізовані положення між ходами


17

Я починаю грати в шахові двигуни. Зауважую, що найкращі шахові двигуни можуть зайняти кілька хвилин для переміщення. Мені цікаво, чому. Перед кожним рухом двигун вивчає всі законні майбутні кроки на деяку глибину. Однак потім, здається, повторити цю вправу для наступного кроку. Зважаючи на те, що попередній хід уже був включений до дерева досліджуваних кроків, чи це неефективно? Або я неправильно зрозумів?

[Редагувати: я припускаю, що причина, чому аналізи переміщення не кешуються, пов’язана з деякими обмеженнями пам'яті комп'ютера, які просто прискорюють перезапуск аналізу]

Відповіді:


20

Програмування шахових двигунів є дуже складною територією, тому на передньому напрямку я вкажу на Шахове програмування 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, ймовірно, є занадто низьким .


Дуже цікаво, це пояснює, чому моя оперативна пам’ять майже руйнується, коли я глибоко аналізував свій двигун (таємниця, яка мене певний час спалахнула).
Пабло С. Окал

Спасибі! Дуже цікаво. Я вважав, що обговорення вікі-шахового двигуна є захоплюючим.
Дом

3

Типовий шаховий двигун зберігатиме деякі позиції та їхні дужки з альфа-бета-балів у таблиці переміщення, з якою можна ознайомитися під час наступних пошуків. Ця таблиця не консультується безпосередньо для вибору наступного кроку, але це робить її пошук більш ефективним двома способами.

  1. Позиція, ймовірно, буде зустрічатися кілька разів у дереві пошуку, досягається переміщенням або перестановкою послідовності рухів. Оскільки в таблиці можна ознайомитися з такою позицією, можливо, потрібно буде оцінити лише кілька разів (для різних фіксованих глибин пошуку), а не десятки разів, коли позиція відвідується та переглядається.

  2. Стандартною технікою пошуку альфа-бета-пошуку є використання ітеративного поглиблення , повторно зондування дерева на більшій глибині пошуку до досягнення глибини терміналу. Оцінки оцінки, обчислені в попередніх ітераціях, використовуються для впорядкування кроків, шуканих у наступних ітераціях. Як відомо, альфа-бета працює краще (тобто обрізає більше дерева пошуку), якщо хороші рухи шукаються перед поганими рухами.


3

Приклад підтвердження пам'яті двигуна:

Розгляньте позиції, де відкриті глибокі теоретичні новинки, зокрема гра в цьому році Каруана проти Топалова . Якщо ви дозволите двигуну аналізувати положення після переміщення 12 протягом більш-менш короткого часу (скажімо, 10-15 хвилин), ви можете перевірити запропоновані рухи і побачити, що TN ( 13.Re2!) не відображається серед них. Введіть хід самостійно, поверніться назад і дозвольте двигуну знову проаналізувати те саме положення протягом більш-менш того ж часу. Дивно, після деяких думок, тепер двигун вважає TN одним з найкращих кроків і затверджує його.

EDIT: Оригінальна відповідь (міститься нижче) помилкова, однак вона є корисним прикладом пам’яті двигуна, яка була цитована вгорі.

Наскільки я знаю, їх немає, тобто вони починають пошук дерев майже з нуля при кожному русі.

Однак вони повинні мати якусь функцію, яка актуалізує значення для кожного ходу, і ця функція, безумовно, має деяку короткочасну пам'ять. Деякі приклади - позиції, де виявляються глибокі теоретичні новинки, зокрема гра в цьому році Каруана проти Топалова . Якщо ви дозволите двигуну аналізувати положення після переміщення 12 протягом більш-менш короткого часу (скажімо, 10-15 хвилин), ви можете перевірити запропоновані рухи і побачити, що TN ( 13.Re2!) не відображається серед них. Введіть хід самостійно, поверніться назад і дозвольте двигуну знову проаналізувати те саме положення протягом більш-менш того ж часу. Дивно, після деяких думок, тепер двигун вважає TN одним з найкращих кроків і затверджує його.

Я не знавець шахового програмного забезпечення, але це трапляється. Це можна принаймні частково пояснити, якщо (як було сказано) функція, яка оцінює ходи для позиції, має деяку пам’ять.


2
Ні. Двигуни не починають пошук дерева з нуля. Зверніться до моєї відповіді.
HelloWorld

Вибачте, але я вважаю, що ваша відповідь трохи оманлива
BlueTrin

1
Я намагався зробити це зрозумілішим. Як було сказано, відповідь неправильна, проте приклад є і це приємно перевірити (для нас, романтиків, це дає нам певні надії, що, незважаючи на те, що комп’ютери набагато сильніші за людей, іноді інтуїція, досвід та наполеглива робота можуть "перевершити" свої оригінал).
Пабло С. Окал

@pablo, ваш приклад чудовий. Пам'ять є, тому що при першому запуску пошуку двигун зберігає оцінки позицій у таблиці. При повторному пошуку тієї ж позиції двигун зможе здійснювати пошук набагато швидше. Тому це дасть вам інший результат.
HelloWorld

Остання редакція була для @BlueTrin, який вважав, що це вводить в оману.
Пабло С. Окал

2

Генрі Кейтер вже дав вам загальну відповідь, я дам вам більш технічну відповідь. Вся справа в таблиці транспозиції, глибині пошуку та обрізанні. Дискусія тут набагато технічніша за інші відповіді, але це буде корисно тому, хто хоче навчитися шаховому програмуванню.

Поширене непорозуміння, що якщо позиція оцінювалася раніше, оцінка оцінювання може бути повторно використана до тих пір, поки буде достатньо пам'яті для зберігання ходів. Шахове програмування складніше за це. Навіть маючи нескінченну пам'ять, вам доведеться знову шукати позиції. Кожному кроку додається оцінка оцінки з її глибиною та її межею. Наприклад, якщо двигун зберігає хід в режимі невдалого, запис таблиці матиме нижню межу. Це означає, що якщо ви шукаєте посаду, вам все одно доведеться перевіряти межі, чи можете ви використовувати попередній бал оцінювання.

Крім цього, до кожної оцінки додається глибина. У рамках ітеративно-поглиблюючої рамки, коли ви збільшуєте глибину кожної ітерації, вам все одно доведеться шукати ті позиції, які ви шукали вже в попередній ітерації.

Коротка відповідь на ваше запитання полягає в тому, що двигун зберігає всі попередні проаналізовані позиції (поки достатньо пам'яті), але ці збережені результати не можуть бути використані так легко, як ви могли подумати . На етапі відкриття, де повторень менше, ці збережені результати є найбільш корисними для впорядкування руху та десятка евристики зменшення руху. Наприклад, можна вважати, що найкращий хід з останньої глибини є найкращим переміщенням на поточній глибині, тому ми б сортували списки переміщення та шукали найкращий хід перед будь-якими іншими рухами. Сподіваємось, ми отримаємо раннє невдале відсічення.

У нас немає нескінченної пам'яті для зберігання позицій. Нам потрібно було б визначити алгоритм хешування. Алгоритм хешування зубристів дає нам псевдовипадковий розподіл, але рано чи пізно нам все одно доведеться замінити деякі існуючі записи.


0

У кожного двигуна є своя схема управління часом. Деякі двигуни та графічні інтерфейси дозволяють вам встановити темп, з яким рухатиметься двигун. Двигуни завжди обчислюють / оцінюють / мінімуму настільки, наскільки вони можуть давати обмеження, накладені підпрограмами управління часом або налаштуваннями користувачів. Якщо двигун думає тривалий час, це, мабуть, тому, що контроль часу для гри є повільним, або користувач налаштував його на гру повільно.

Позиції та оцінки, обчислені двигуном, зберігаються в хеш-таблиці. Користувач може встановити розмір доступного хешу в налаштуваннях більшості двигунів UCI. Сам движок використовує певну кількість оперативної пам’яті, і якщо встановити розмір хеш-таблиці занадто високий, комп'ютер почне зберігати хеш на вашому жорсткому диску у вигляді віртуальної ОЗУ. Доступ до пам’яті на жорсткому диску відбувається повільніше, ніж оперативна пам’ять, і ви, як правило, зможете почути, як жорсткий диск перебирається. Багато користувачів встановлюють розмір хеш-таблиці, щоб вона вмістилася в межах доступної оперативної пам’яті.

Значна частка будь-якої хеш-таблиці стає марною після того, як двигун та його опонент зробили свої кроки, оскільки інші розглянуті позиції вже не актуальні. Двигун буде повторно використовувати оцінки, збережені в хеші, але деякі оцінки виявляються невірними через ефекти горизонту, як тільки двигун заглиблюється вниз по тій же лінії, тому часто доводиться повторно замовляти свої ходи кандидата.

Оскільки кількість хешу є кінцевим, двигун також повинен приймати рішення щодо того, яку інформацію видалити зі свого хешу, оскільки він додає нову інформацію. Двигун не знає заздалегідь, які рухи будуть відтворюватися, тому він може ненавмисно видалити інформацію, яка була б корисною, оскільки вона додає нові дані.

Двигуни взагалі не вивчають усі легальні кроки на певну глибину. Вони усувають певні гілки дерева з розгляду на основі обрізки вперед і назад. Крім того, якщо в положенні вузла листів є захоплення або перевірки ще не зроблено, двигун буде продовжуватись вниз по цій лінії, поки не досяг тихого (спокійного) положення. Дійсне дерево, ймовірно, місцями досить глибоке, тоді як інші лінії, можливо, були обрізані після невеликої кількості ходів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.