Чи існує такий алгоритм, коли комп'ютер міг би грати в шахи ідеально, щоб ніколи не програти?
Якщо так, то де я можу знайти псевдо-код для цього?
Чи існує такий алгоритм, коли комп'ютер міг би грати в шахи ідеально, щоб ніколи не програти?
Якщо так, то де я можу знайти псевдо-код для цього?
Відповіді:
Чи існує алгоритм? Так. Відповідно до теореми Зермело , є три можливості для кінцевої детермінованої гри з ідеальною інформацією для двох гравців, такі як шахи: або перший гравець має виграшну стратегію, або другий гравець має виграшну стратегію, або будь-який гравець може примусити нічию. Ми ще не знаємо, що це для шахів. (З іншого боку, шашки вирішені : будь-який гравець може примусити нічию.)
Концептуально алгоритм досить простий: побудуйте повне дерево ігор , проаналізуйте вузли аркушів (позиції, що закінчуються іграми), або зробіть початковий хід перемоги, подайте у відставку або запропонуйте нічию.
Проблема полягає в деталях: є приблизно 10 43 можливих позицій і ще більша кількість рухів (більшість позицій можна досягти більш ніж одним способом). Вам справді потрібен ваш нескінченно потужний комп'ютер, щоб скористатися цим, оскільки комп'ютер, який може скористатися цим алгоритмом, або не може вміститись у відомий Всесвіт, або не закінчить обчислення до того часу, коли всесвіт закінчиться.
Дивіться https://en.wikipedia.org/wiki/Endgame_tablebase .
Маючи нескінченну силу комп’ютера, можна було б скласти таку таблицю для вихідної позиції та вирішити шахи .
На практиці лише позиції, що мають до семи "чоловіків" (пішаки та шматки, рахуючи царів), вирішувались за допомогою сучасних суперкомп'ютерів, тому ми дуже далекі від вирішення шахів. Складність проблеми зростає експоненціально з кількістю творів.
Якби ви справді мали нескінченну потужність обробки, такий алгоритм був би насправді тривіальним для написання. Оскільки шахи мають обмежене число можливих станів, ви можете теоретично просто переглядати їх, поки не знайдете шлях ідеальної гри. Це було б жахливо неефективно, але якщо у вас є нескінченна потужність обробки, це не має значення.
Щоб безпосередньо вирішити питання: так, існує такий алгоритм. Його називають мінімакс. (Бази даних кінцевих ігор генеруються за допомогою цього алгоритму (назад!), Але звичайний старий простий алгоритм minimax - це все, що вам потрібно). Цей алгоритм може чудово грати в будь-яку гру з нульовою сумою двох гравців. Знайдіть псевдокод тут:
https://en.wikipedia.org/wiki/Minimax
зауважте, що варіанти цього алгоритму використовуються сучасними комп'ютерними шаховими програмами.
Мало того, що існує алгоритм, щоб грати в ідеальні шахи, можна написати коротку програму, яка дозволить (з урахуванням нескінченних ресурсів) грати будь-яку детерміновану ідеальну гру з двома гравцями з кінцевою тривалістю .
Ігровому двигунові навіть не потрібно знати правила гри, в яку він грає. Все, що йому потрібно, - це непрозоре представлення "ігрового стану" та функцій, які (а) даються будь-яким станом гри, надають перелік наступних наступних ігрових станів і (б) заданий стан гри, вирішують, чи це виграш для гравця 1 , виграш для гравця 2, нічия, або це не кінцевий стан.
З урахуванням цих функцій простий рекурсивний алгоритм "вирішує" гру.
Цей факт був нагаданий у попередніх відповідях у шаховому програмісті (minimax) та Acccumulation (який надає версію програми в python).
Я писав таку програму понад 20 років тому. Я перевірив це, граючи в нутси і кроси (тик-так-носок, якщо ви американці). Впевнений, що він зіграв ідеальну гру.
Звичайно, це швидко перепадає на будь-який уявний комп'ютер для будь-якої серйозної гри. Оскільки він є рекурсивним, він ефективно будує все ігрове дерево на стеці, тож ви отримаєте "переповнення стека" (пенальті дуже призначено), перш ніж дістатись поблизу, аналізуючи 10 ^ 123 станів шахів, про які йдеться в інших відповідях. Але цікаво знати, що в принципі ця маленька програма зробить цю роботу.
Для мене це також говорить щось цікаве про AI: як би більше "інтелекту", на вашу думку, демонструється Deep Blue, Go Go Zero, або справді люди, що грають у шахи або Go, є сенс, в якому ці ігри мають тривіальний, точно обчислювальний оптимальний рішення. Завдання полягає в тому, як отримати хороше, хоча й не оптимальне рішення за розумний час.
Я проігнорую можливості малюнків або нескінченних послідовностей рухів для простоти. Після того, як алгоритм буде зрозумілий, його не особливо важко поширити на ці випадки.
По-перше, деякі визначення:
Будь-який хід, який виграє гру для гравця, який зробив цей хід, - виграшний хід.
Будь-який хід, який програє гру для гравця, який робить цей хід, є програшним кроком.
Будь-який хід, який залишає іншого гравця хоча б одним виграшним кроком, також є програшним кроком. (Оскільки опонент може скористатися цим рухом і нанести втрату.)
Будь-який хід, який залишає іншого гравця лише втраченими рухами, також є виграшним кроком. (Незалежно від того, який хід робить ваш противник, ви виграєте.)
Ідеальна стратегія означає завжди робити виграшні кроки, якщо такі залишаються, і подати у відставку, коли у вас залишилися лише втрачені ходи.
Тепер тривіально написати ідеальну стратегію. Просто підірвіть усі можливі послідовності переміщення та визначте переміщення / виграш. Ігноруючи тупикову ситуацію, це врешті ідентифікує кожен хід як переможний хід, чи програш.
Тепер стратегія банальна. Подивіться на всі можливі ваші кроки. Якщо якісь виграшні рухи залишаються, візьміть один і виграйте. Якщо залишаються лише втрачені рухи, подайте у відставку, оскільки ваш противник може змусити вас програти.
Не важко скорегувати стратегію, щоб включити можливість тупикової ситуації.
Оновлення : про всяк випадок, якщо не зрозуміло, як це визначає кожен хід як виграшний хід чи програш, врахуйте:
n
кількість рухів у найдовшій грі в шахи. (Зараз ми ігноруємо безмежні послідовності, хоча включити їх не складно.)n
попередніми кроками, які нам потрібно враховувати.n-1
попередніми рухами є або виграшною ходою, або програшною, оскільки n
рухається закінчення найдовшої гри.n-2
супроводжуються лише виграшні ходи або програшні рухи, і, таким чином, це є самим виграшним ходом або програшним ходом.1. d4
з ...resigns
?
Припустимо , у вас є три функції: 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)
Так. Це легко. Вам навіть не потрібна нескінченна потужність обробки. Все, що вам потрібно, - це оглядова таблиця, яка містить для кожного можливого положення дошки найкращий хід для гри в цій позиції. Ось псевдо-код:
def play-move(my-color, board-position):
return table-of-best-moves[my-color, board-position]
Єдина уловка полягає в тому, що ця оглядова таблиця повинна бути дуже-дуже великою - можливо, більшою, ніж галактика Чумацький Шлях - і для її побудови знадобиться багато часу - можливо, довше, ніж поточна епоха Всесвіту, якщо немає деяка нерозкрита закономірність у шахах, що робить його набагато простішим, ніж ми можемо бачити зараз. Але якби у вас була ця таблиця огляду, підпрограма для вибору ідеального кроку кожного разу могла бути реалізована всього за одну інструкцію процесора.
Крім того, враховуючи наші сучасні знання з шахів, немає жодного способу бути впевненим, що ідеальна гра гарантує, що ви не програєте. Наприклад, якщо ідеальна гра гарантує виграш для Білих, то Чорні програють, навіть якщо Чорний грає ідеально.