Якщо дається нескінченна потужність обробки, чи існує алгоритм, який би чудово грав у шахи?


29

Чи існує такий алгоритм, коли комп'ютер міг би грати в шахи ідеально, щоб ніколи не програти?

Якщо так, то де я можу знайти псевдо-код для цього?


8
Що ви маєте на увазі під ідеальними шахами?
Герб Вулф

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

5
@DavidSchwartz - "ідеальний шахмат", звичайно, не можна визначити. Не може також "нескінченна потужність обробки". Чи означає це "виконує всі послідовності інструкцій за 0 разів"? "Чи доступна нескінченна кількість процесорів"? FWIW - моє визначення «ідеального шахів» - це «ніколи не програє гру».
Боб Джарвіс - Відновіть Моніку

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

4
Поняття "алгоритм" і поняття нескінченної потужності обробки насправді не поєднуються. Теорія алгоритмів та обчислюваності базується на припущенні досягнення результату в кінцевій кількості кроків. Якщо вам дозволено нескінченна кількість кроків, відмінність між тим, що можна обчислити, і тим, що не зникає.
Майкл Кей

Відповіді:


62

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

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

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


13
@Wildcard Ні, він нічого не передбачає: він просто містить усі можливі легальні ігри в шахи, і він вибере всіх тих, де гравець під рукою не програє.
покладено

11
@gented, я мав на увазі крок "відставки" алгоритму. Це зовсім не необхідний крок.
Wildcard

38
Правило трьох повторень обмежує простір пошуку, тому комп'ютер не повинен бути нескінченно потужним, а просто астрономічно потужним.
Хоа Лонг Там

9
Для ознайомлення порівняйте нижню межу кількості можливих ігор ( 10 ^ 120 ) до кількості атомів у спостережуваному Всесвіті (порядку 10 ^ 80 ). Найпростіший алгоритм повинен був би знайти всі ці ігри та зберегти їх дані. Зберігання однієї гри на атом потребує 10 ^ 40 разів більше атомів, ніж ми оцінюємо у спостережуваному Всесвіті.
Інженер Тост

6
Ця відповідь чудова до самого кінця, коли ви посилаєтесь на "нескінченно потужний комп'ютер". Це не те, що ви маєте на увазі, і ця фраза не належить ні до питання, ні до дискусії.
Дон Хетч

25

Дивіться https://en.wikipedia.org/wiki/Endgame_tablebase .

Маючи нескінченну силу комп’ютера, можна було б скласти таку таблицю для вихідної позиції та вирішити шахи .

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


9
Як бічна примітка, якби ви насправді створили таку таблицю, незалежно від того, на чому ви зберігали інформацію, вона важила б приблизно в 10 ^ 43 рази більше, ніж спостережувана Всесвіт; враховуючи, що у спостережуваному Всесвіті є ~ 10 ^ 123 можливих шахових позицій і лише ~ 10 ^ 80 баріонів.
Shufflepants

6
@Shufflepants, який сказав, що я зберігаю його за допомогою баріонів?
Майкл

3
@Christoph І якщо припустити збереження інформації та припускаючи, що у вас є детектор і ваш суперкомп'ютер з нескінченною потужністю обробки, ви могли повільно впродовж чогось на зразок googolplex років читати табличну базу як радіацію Хокінга.
Shufflepants

3
@Shufflepants Зауважте, що фактична стратегія виграшу може зажадати набагато менше місця, ніж повна база даних. Наприклад, у Німа є стратегія виграшу, яку просто описати, немає необхідності будувати величезну таблицю всіх можливих станів.
Федеріко Полоні

1
Таке рішення, як заявлено, не є життєздатним. Маса такої таблиці утворювала б чорну діру, і неможливо було б відфільтрувати дані з неї.
emory

19

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


Що це не так. Він сказав, що ви маєте нескінченну потужність обробки, але нічого не сказав про нескінченний простір.
убадуб

@ubadub: Нам не знадобиться нескінченний простір. Тривалість гри обмежена завдяки 50-хвилинному правилу, і можна скласти правило для сортування всіх можливих рухів з позиції. Оскільки вони можуть бути відсортовані, вони можуть зберігатися як ціле число. Це вся пам’ять, необхідна для прогулянки по всьому дереву. А якщо у вас є нескінченний час, ви можете ходити по дереву стільки разів, скільки захочете, тому вам не доведеться зберігати всі можливі ігри в шахи.
vsz

Тривалість гри обмежена, але вона надзвичайно велика; як хтось інший зазначив, якби ви створили таблицю для зберігання всіх подібних ігор, "незалежно від того, на чому ви зберігали інформацію, вона важила б приблизно 10 ^ 43 рази більше, ніж спостережувана Всесвіту; враховуючи, що існує ~ 10 ^ 123 можливо шахові позиції та лише ~ 10 ^ 80 баріонів у спостережуваному Всесвіті
ubadub

2
@ubadub: Це правда, але я не говорив про "стіл для зберігання всіх таких ігор". Існує багато алгоритмів, пов’язаних з деревами, які не повинні зберігати в пам'яті всі вузли всього дерева.
vsz

@ vsz хороший пункт
ubadub

13

Щоб безпосередньо вирішити питання: так, існує такий алгоритм. Його називають мінімакс. (Бази даних кінцевих ігор генеруються за допомогою цього алгоритму (назад!), Але звичайний старий простий алгоритм minimax - це все, що вам потрібно). Цей алгоритм може чудово грати в будь-яку гру з нульовою сумою двох гравців. Знайдіть псевдокод тут:

https://en.wikipedia.org/wiki/Minimax

зауважте, що варіанти цього алгоритму використовуються сучасними комп'ютерними шаховими програмами.


4

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

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

З урахуванням цих функцій простий рекурсивний алгоритм "вирішує" гру.

Цей факт був нагаданий у попередніх відповідях у шаховому програмісті (minimax) та Acccumulation (який надає версію програми в python).

Я писав таку програму понад 20 років тому. Я перевірив це, граючи в нутси і кроси (тик-так-носок, якщо ви американці). Впевнений, що він зіграв ідеальну гру.

Звичайно, це швидко перепадає на будь-який уявний комп'ютер для будь-якої серйозної гри. Оскільки він є рекурсивним, він ефективно будує все ігрове дерево на стеці, тож ви отримаєте "переповнення стека" (пенальті дуже призначено), перш ніж дістатись поблизу, аналізуючи 10 ^ 123 станів шахів, про які йдеться в інших відповідях. Але цікаво знати, що в принципі ця маленька програма зробить цю роботу.

Для мене це також говорить щось цікаве про AI: як би більше "інтелекту", на вашу думку, демонструється Deep Blue, Go Go Zero, або справді люди, що грають у шахи або Go, є сенс, в якому ці ігри мають тривіальний, точно обчислювальний оптимальний рішення. Завдання полягає в тому, як отримати хороше, хоча й не оптимальне рішення за розумний час.


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

Дійсні бали. Я відредагую свою відповідь.
Гарет

3

Я проігнорую можливості малюнків або нескінченних послідовностей рухів для простоти. Після того, як алгоритм буде зрозумілий, його не особливо важко поширити на ці випадки.

По-перше, деякі визначення:

  1. Будь-який хід, який виграє гру для гравця, який зробив цей хід, - виграшний хід.

  2. Будь-який хід, який програє гру для гравця, який робить цей хід, є програшним кроком.

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

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

  5. Ідеальна стратегія означає завжди робити виграшні кроки, якщо такі залишаються, і подати у відставку, коли у вас залишилися лише втрачені ходи.

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

Тепер стратегія банальна. Подивіться на всі можливі ваші кроки. Якщо якісь виграшні рухи залишаються, візьміть один і виграйте. Якщо залишаються лише втрачені рухи, подайте у відставку, оскільки ваш противник може змусити вас програти.

Не важко скорегувати стратегію, щоб включити можливість тупикової ситуації.

Оновлення : про всяк випадок, якщо не зрозуміло, як це визначає кожен хід як виграшний хід чи програш, врахуйте:

  1. Кожен хід, який призводить до виграшу, - виграшний хід.
  2. Кожен хід, що призводить до втрати, є програшним кроком.
  3. Кожен хід, в результаті якого суперник має лише перемогу або програв, - це виграшний або програш.
  4. Назвіть nкількість рухів у найдовшій грі в шахи. (Зараз ми ігноруємо безмежні послідовності, хоча включити їх не складно.)
  5. Немає рухів із nпопередніми кроками, які нам потрібно враховувати.
  6. Кожна хода з n-1попередніми рухами є або виграшною ходою, або програшною, оскільки nрухається закінчення найдовшої гри.
  7. Таким чином, за кожним переміщенням на глибині n-2супроводжуються лише виграшні ходи або програшні рухи, і, таким чином, це є самим виграшним ходом або програшним ходом.
  8. І так назад до першого кроку.

1
Ваші визначення виграшних та програшних рухів недостатньо вичерпні. Наприклад, перший хід, ні виграє гру (№1), ні суперника лише втрачає ходи (№4), тож це не "виграшний хід". Ні він не програє гру (№2), ні залишає суперника жодним виграшним кроком (№3), тому це не є «програшною ходою». Ваша стратегія вимагає, щоб кожен хід визначався як "хід виграшу" або "хід, який програв", що просто не так, як ви його визначили.
Ядерна Ванга

2
@NuclearWang Він визначає кожен хід як виграшний хід або програш. Як ви думаєте, що третя альтернатива? Візуалізуйте дерево всіх можливих шахових ігор (і пам’ятайте, що зараз ми виключаємо зв’язки чи нескінченні послідовності). Кожен ланцюг закінчується або виграш, або програш. Це пронизується через дерево, врешті-решт ідентифікуючи кожен хід як переможний хід, або програш.
Девід Шварц

13
@NuclearWang або перший хід - це виграшний хід для одного гравця, або в іншому випадку шахи - це (як тик-так-носок) - намальована гра з ідеальною грою. Ми не знаємо, що через те, що ніхто ніколи не мав обчислювальної сили для запуску цього алгоритму до завершення, і більш прямого доказу ніхто не знайшов.
варення

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

2
@DavidSchwartz: Якщо хтось не перебуває в програшній позиції, кожен рух, який не є ідеальним, є поганим. У програшній позиції, як правило, не буде жодного "ідеального" кроку [крім випадків вимушеного переїзду], оскільки будь-який законний хід може мати певну ймовірність бути єдиним виграшним або жеребкуючим рухом у деяких мислимих (можливо, дуже надуманих) обставинах. Відставка, однак, здавалася б однозначно найгіршим "кроком". Припустимо, гра виявляється вирішеною як виграш для White з d4. Ви хотіли б грати шахову програму , яка відповіла на 1. d4з ...resigns?
supercat

2

Припустимо , у вас є три функції: win_state, get_player, і next_states. Вхідний сигнал win_state- це ігровий стан, а вихід -1, якщо білий у матчі, 0, якщо це нічия, 1, якщо чорний - у матчі, та Noneінше. Вхід для get_playerігрового стану, а вихід -1, якщо черга чорного і 1, якщо черга білого. Вхідний next_statesопис - це список можливих наступних ігрових станів, які можуть бути результатом законного кроку. Тоді наступна функція, коли вам надано стан гри та гравця, повинна повідомити вам, до якого стану гри потрібно перейти, щоб той гравець виграв.

def best_state(game_state,player)
  def best_result(game_state):
     if win_state(game_state):
        return(win_state)
     else:
         player = get_player(game_state)
         return max([best_result(move)*player for move in next_states(game_state)])*player
  cur_best_move = next_states(games_state)[0]
  cur_best_outcome = -1
  for state in next_states(game_state):
     if best_result(state)*player > cur_best_outcome:
           cur_best_outcome = best_result(state)*player
           cur_best_move = state
return(best_move)

0

Скористайтеся таблицею огляду

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

def play-move(my-color, board-position):
    return table-of-best-moves[my-color, board-position]

Улов

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

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

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