Какой алгоритм для игры tic-tac-toe можно использовать для определения «лучшего движения» для ИИ?

В реализации tic-tac-toe я предполагаю, что сложной задачей является определение лучшего движения, которое будет играть машина.

Какие алгоритмы можно использовать? Я изучаю реализации от простого до сложного. Как мне решить эту часть проблемы?

Страtagsя из Википедии для игры в идеальную игру (победа или галстук каждый раз) кажется простым псевдокодом:

Цитата из Википедии (Tic Tac Toe # Strategy)

Игрок может сыграть в идеальную игру Tic-tac-toe (чтобы выиграть или, по крайней мере, привлечь), если они выбирают первый ansible ход из следующего списка, каждый оборот, как используется в Newell и Simon’s 1972 tic-tac-toe программа. [6]

  1. Выиграйте: если у вас есть два подряд, сыграйте третье, чтобы получить три подряд.

  2. Блок: Если противник имеет два подряд, сыграйте третье, чтобы заблокировать их.

  3. Вилка: создайте возможность, где вы можете выиграть двумя способами.

  4. Вилка блокирующего оппонента:

    Вариант 1. Создайте два подряд, чтобы заставить противника защищаться, если это не приводит к созданию вилки или выигрыша. Например, если «X» имеет угол, «O» имеет центр, а «X» имеет противоположный угол, «O» не должен играть в углу, чтобы выиграть. (Игра в углу в этом сценарии создает вилку для «X», чтобы выиграть.)

    Вариант 2: Если есть конфигурация, в которой противник может разблокировать, заблокируйте эту вилку.

  5. Центр: играть в центр.

  6. Противоположный угол: если противник находится в углу, сыграйте противоположный угол.

  7. Пустой угол: играйте в пустой угол.

  8. Пустая сторона: играйте на пустой стороне.

Признание того, как выглядит ситуация с «вилкой», может быть сделано с помощью грубой силы, как это было предложено.

Примечание: «идеальный» противник – это хорошее упражнение, но в конечном счете не стоит «играть» против. Однако вы могли бы изменить приоритеты, чтобы дать характерные недостатки личностям противника.

Что вам нужно (для tic-tac-toe или гораздо более сложной игры, такой как Chess) – это минимаксный алгоритм или его несколько более сложный вариант, альфа-бета-обрезка . Обыкновенный наивный минимакс отлично справится с игрой с таким маленьким пространством поиска, как tic-tac-toe.

В двух словах, что вы хотите сделать, это не поиск хода, который имеет наилучший возможный результат для вас, а скорее переход, где наихудший возможный результат максимально эффективен. Если вы предполагаете, что ваш оппонент играет оптимально, вы должны предположить, что они сделают для вас худший для вас ход, и поэтому вам нужно сделать ход, который минимизирует их максимальный выигрыш.

Метод грубой силы для создания каждой единственной возможной доски и подсчета ее на основе плат, которые он позже производит дальше по дереву, не требует большой памяти, особенно если вы узнаете, что 90-gradleусные вращения платы являются избыточными, а также сальто вокруг вертикали, горизонтальной и диагональной.

Как только вы дойдете до этого момента, в дереве-графе есть что-то вроде менее 1 k данных, чтобы описать результат и, следовательно, лучший способ для компьютера.

-Адам

Типичный алго для tic-tac-toe должен выглядеть так:

Совет: девятиэлементный вектор, представляющий плату. Мы сохраняем 2 (указывая Бланк), 3 (обозначая X) или 5 (обозначая O). Поворот: целое число, указывающее, какое движение игры должно быть воспроизведено. 1-й ход будет обозначен 1, последним – 9.

Алгоритм

Основной алгоритм использует три функции.

Make2: возвращает 5, если центральный квадрат платы пуст, т.е. если плата [5] = 2. В противном случае эта функция возвращает любой квадрат без угла (2,4,6 или 8).

Posswin (p): возвращает 0, если игрок p не может выиграть при следующем ходу; в противном случае он возвращает число квадратов, составляющее выигрышный ход. Эта функция позволит программе выиграть и заблокировать победу противников. Эта функция работает, проверяя каждую из строк, столбцов и диагоналей. Путем умножения значений его квадрата на целую строку (или столбец или диагональ) можно проверить возможную ситуацию выигрыша. Если произведение составляет 18 (3 x 3 x 2), то X может выиграть. Если продукт равен 50 (5 x 5 x 2), тогда O может выиграть. Если найдена выигрышная строка (столбец или диагональ), пустой квадрат в ней может быть определен и номер этой квадрата возвращается этой функцией.

Go (n): делает движение в квадрате n. эта процедура устанавливает плату [n] в 3, если параметр «Поворот» нечетный, или 5, если «Поворот» ровный. Он также увеличивает оборот на один.

Алгоритм имеет встроенную страtagsю для каждого шага. Он делает нечетное числовое движение, если он играет X, четный ход, если он играет O.

Turn =1 Go(1) (upper left corner). Turn =2 If Board[5] is blank, Go(5), else Go(1). Turn =3 If Board[9] is blank, Go(9), else Go(3). Turn =4 If Posswin(X) is not 0, then Go(Posswin(X)) ie [ block opponent's win], else Go(Make2). Turn =5 if Posswin(X) is not 0 then Go(Posswin(X)) [ie win], else if Posswin(O) is not 0, then Go(Posswin(O)) [ie block win], else if Board[7] is blank, then Go(7), else Go(3). [to explore other possibility if there be any ]. Turn =6 If Posswin(O) is not 0 then Go(Posswin(O)), else if Posswin(X) is not 0, then Go(Posswin(X)), else Go(Make2). Turn =7 If Posswin(X) is not 0 then Go(Posswin(X)), else if Posswin(X) is not 0, then Go(Posswin(O)) else go anywhere that is blank. Turn =8 if Posswin(O) is not 0 then Go(Posswin(O)), else if Posswin(X) is not 0, then Go(Posswin(X)), else go anywhere that is blank. Turn =9 Same as Turn=7. 

Я использовал его. Дайте мне знать, как вы себя чувствуете.

Поскольку вы имеете дело только с матрицей 3×3 возможных местоположений, было бы довольно просто написать поиск по всем возможностям, не облагая налогом вычислительную мощность. Для каждого открытого пространства вычисляйте все возможные результаты после того, как обозначаете это пространство (рекурсивно, я бы сказал), а затем используйте ход с наибольшими возможностями выигрыша.

Оптимизация этого была бы пустой тратой усилий. Хотя некоторые легкие могут быть:

  • Сначала проверьте возможные выигрыши для другой команды, заблокируйте первый, который вы найдете (если в любом случае есть 2 игры).
  • Всегда принимайте центр, если он открыт (и у предыдущего правила нет кандидатов).
  • Возьмите углы впереди сторон (опять же, если предыдущие правила пустые)

Вы можете получить игру AI в некоторых примерах игр, чтобы учиться. Используйте контролируемый алгоритм обучения, чтобы помочь ему.

Попытка без использования игрового поля.

  1. выиграть (ваш двойной)
  2. если нет, не потерять (двойник противника)
  3. если нет, у вас уже есть вилка (есть двойной двойной)
  4. если нет, если противник имеет вилку
    1. поиск в блокирующих точках для возможных двойных и fork (конечная победа)
    2. если не искать фоки в блокирующих точках (что дает противнику самые проигрышные возможности)
    3. если не только блокировать точки (не терять)
  5. если не искать двойную и вилку (конечная победа)
  6. если не искать только вилки, которые дают оппоненту самые проигрышные возможности
  7. если не искать только двойную
  8. если не тупик, галстук, случайный.
  9. если нет (это означает ваш первый ход)
    1. если это первый ход игры;
      1. дать противнику самую проигрышную возможность (алгоритм приводит только к углам, что дает 7 очков потери возможности противнику)
      2. или для взлома скуки просто случайно.
    2. если это второй ход игры;
      1. найти только те потери (дает немного больше вариантов)
      2. или найти точки в этом списке, которые имеют лучший выигрышный шанс (это может быть скучно, потому что это приводит только к всем углам или смежным углам или центру)

Примечание. Если у вас есть двойные и вилки, проверьте, дает ли ваш двойник двойнику. Если он дает, проверьте, включен ли ваш новый обязательный пункт в ваш список.

Размещайте каждый квадрат с числовыми оценками. Если взять квадрат, перейдите к следующему выбору (отсортированный в порядке убывания по рангу). Вам нужно будет выбрать страtagsю (есть два основных для первого и трех (я думаю) для второго). Технически вы можете просто запрограммировать все страtagsи, а затем выбрать один случайным образом. Это сделало бы для менее предсказуемого противника.

Этот ответ предполагает, что вы понимаете реализацию совершенного алгоритма для P1 и обсуждаете, как добиться победы в условиях против обычных человеческих игроков, которые будут совершать некоторые ошибки чаще, чем другие.

Конечно, игра должна заканчиваться ничьей, если оба игрока играют оптимально. На человеческом уровне игра P1, играющая в углу, выигрывает гораздо чаще. По какой-то психологической причине P2 приманивается к мысли, что играть в центре не так важно, что для них является неудачным, поскольку это единственный ответ, который не создает выигрышную игру для P1.

Если P2 правильно блокируется в центре, P1 должен играть в противоположном углу, потому что снова по какой-либо психологической причине P2 предпочтет симметрию игры в углу, что снова приведет к проигрышной доске для них.

Для любого хода, которое P1 может сделать для начального хода, есть шаг P2, который может создать выигрыш для P1, если оба игрока будут играть оптимально после этого. В этом смысле P1 может играть везде. Движения края слабее в том смысле, что наибольшая часть возможных ответов на этот ход приводит к ничьей, но есть еще ответы, которые создадут выигрыш для P1.

Эмпирически (точнее, анекдотически) лучшие стартовые шаги P1 кажутся первым углом, вторым центром и последним краем.

Следующей задачей, которую вы можете добавить лично или через графический интерфейс, является не отображение платы. Человек может определенно помнить все состояние, но добавленная задача приводит к предпочтению симметричных плат, которые требуют меньше усилий, чтобы запомнить, что привело к ошибке, которую я описал в первой ветви.

Я очень доволен вечеринками.

Вот решение, которое рассматривает все возможные шаги и последствия каждого шага, чтобы определить наилучший возможный ход.

нам понадобится раскол данных, представляющий плату. Мы будем представлять плату с двухмерным массивом. Внешний массив представляет всю плату, а внутренний массив представляет строку. Вот состояние пустой доски.

 _gameBoard: [ [“”, “”, “”], [“”, “”, “”], [“”, “”, “”] ] 

Мы будем заполнять доску символами «x» и «o».

Далее нам понадобится функция, которая может проверить результат. Функция будет проверять последовательность символов. Как бы то ни было, состояние доски – результат одного из четырех вариантов: либо неполный, игрок X выиграл, игрок O выиграл, либо связал. Эта функция должна возвращать состояние платы.

 const SYMBOLS = { x:'X', o:'O' } const RESULT = { incomplete: 0, playerXWon: SYMBOLS.x, playerOWon: SYMBOLS.o, tie: 3 } function getResult(board){ // returns an object with the result let result = RESULT.incomplete if (moveCount(board)<5){ {result} } function succession (line){ return (line === symbol.repeat(3)) } let line //first we check row, then column, then diagonal for (var i = 0 ; i<3 ; i++){ line = board[i].join('') if(succession(line)){ result = symbol; return {result}; } } for (var j=0 ; j<3; j++){ let column = [board[0][j],board[1][j],board[2][j]] line = column.join('') if(succession(line)){ result = symbol return {result}; } } let diag1 = [board[0][0],board[1][1],board[2][2]] line = diag1.join('') if(succession(line)){ result = symbol return {result}; } let diag2 = [board[0][2],board[1][1],board[2][0]] line = diag2.join('') if(succession(line)){ result = symbol return {result}; } //Check for tie if (moveCount(board)==9){ result=RESULT.tie return {result} } return {result} } 
Interesting Posts

Очень длинный процесс загрузки?

Анонимные типы. Существуют ли какие-либо отличительные характеристики?

Создайте PDF в памяти вместо физического файла

Как отслеживать изменения содержимого буфера обмена в C #?

Регулярное выражение пунктуации в Java

Загрузка на несколько CDN-серверов одновременно через FTP или SSH

Обнаружение, когда SerialPort отключается

Как создать общую учетную запись рабочей группы для учетной записи Windows 8 Online?

Как выполнять команды через дочерний процесс NodeJS?

Каков размер этого видеокарты?

Как получить выбранный элемент поля со списком в строковой переменной в c #

Обнаружение прокрутки пользователя вниз или прокрутка вверх в jQuery

Идеи создания базы данных для захвата аудиторских маршрутов

Как зеркалировать ячейки в excel 2013

Могу ли я загрузить SQLite db on / sdcard и получить доступ к нему из своего приложения для Android?

Давайте будем гением компьютера.