Стратегия AI для гомоку (вариация tic tac toe)

Я пишу игру, что вариант Gomoku. В принципе, носок с тик-таком на огромной доске.

Интересно, знает ли кто-нибудь хорошую стратегию ИИ для игры. Моя текущая реализация очень глупа и занимает много времени (O (n ^ 3), примерно 1-2 секунды, чтобы сделать ход):

-(void) moveAI {
    //check if the enemy is trying to make a line horizontally, vertically, or diagonally
    //O(n^3 * 3)
    [self checkEnemies];

    //check if we can make a line horizontally, vertically, or diagonally
    //O(n^3 * 3)
    [self checkIfWeCanMakeALine];

    //otherwise just put the piece randomly
    [self put randomly];
}

EDIT: Спасибо всем за отзыв! Я попробую ваши ответы и дам вам знать, смогу ли я сделать какие-либо улучшения.

Ответ 1

Для gomoku стратегия выигрыша уже найдена. См. Эту статью: L. Виктор Аллис, Х. Дж. Ван ден Херик, М. П. Хунтженс. Go-Moku и поиск угроз в космосе. Это очень помогло мне, когда я писал свою собственную программу. Таким образом, вы сможете написать программу, которая очень хороша в атаке противника и поиске выигрышных комбинаций.

Ответ 2

Традиционная и довольно эффективная стратегия написания ИИ для таких игр - это типичная стратегия поиска деревьев. То есть, каждое состояние платы формирует node на графике, а направленный край помещается между каждым node и состояниями, которые могут быть приведены одним движением. Таким образом, дерево построено с корневой доской, пустой node. Затем, пересекайте дерево каким-то умным способом, чтобы найти то, что выглядит как "хорошее" состояние. "Хорошее" состояние обычно измеряется функцией оценки, которая использует некоторые умные эвристики. Очевидно, вы не хотите посещать все узлы в дереве - это будет очень много работы! Вы просто хотите что-то умное.

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

Фактическое имя таких алгоритмов обхода дерева - это алгоритм "Минимакс". Ищите его в Википедии, и вы увидите много довольно приличного материала. Существуют некоторые способы повышения эффективности алгоритма, наиболее заметным из которых является обрезка альфа-бета, поэтому не забудьте взглянуть на это. Вы можете взглянуть на четыре эвристики соединения и решить, как вы можете применить их к своей игре. Например, вероятная правильная эвристика для оценки состояния правления будет состоять в том, чтобы подсчитать количество продолжающихся 2-х тактов, 3-х и 4-х и весить их в счет. (например, каждый 2-ход будет стоить 1 балл, каждый 3 прогон будет стоить 10 очков, а каждый 4-ход будет стоить 1000 очков).

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

С помощью этой стратегии вы сможете получить не-так глупый AI за такое же количество времени. Тем не менее, действительно, действительно хороший AI требует больших усилий для создания даже в таких "простых" играх, и все равно может потребоваться более 10 секунд или больше, чтобы уйти с ума. С другой стороны, есть некоторые умные программные трюки, такие как предварительные вычисления, проходящие через дерево, в то время как человеческий противник занят мышлением. Эй, люди думают, пока компьютер делает. Ярмарка честна!

Надеюсь, я помог. Удачи! Это забавный проект.

Ответ 3

Я пытаюсь создать алгоритм для той же программы некоторое время.

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

Сколько вы играли Гомоку? Насколько хорошо вы владеете базой?

Хорошо, следующий шаг - подумать: как мы можем добраться до тех позиций, где мы можем победить? Очевидно, чтобы победить, у нас должно быть четыре подряд. Но мы просто формируем четыре строки следующим образом:

__________
____XOOOO_
__________

Затем противник может закрыть его.

Но если мы сформируем "открытое четыре", вот так:

__________
____OOOO__
__________

Затем противник не может закрыть обе стороны, и вы можете победить. Таким образом, формирование открытой четверки - один из способов победить. Теперь возникает вопрос: как мы можем сформировать открытую четверку? Разумеется, если мы сформируем "открыть три", вот так:

__________
____OOO___
__________

Затем противник может заблокировать нас:

___________
____XOOO___
___________

и мы вернемся к началу.

Чтобы выиграть, мы можем одновременно создать две открытые тройки:

____________
____OOO_____
_____O______
____O_______

Теперь, если противник блокирует один из них, мы можем использовать другое, чтобы сформировать открытое четыре:

____________
_______O____
___XOOO_____
_____O______
____O_______
____________

и выиграть:

________O___
_______O____
___XOOO_____
_____O______
____O_______
___X________

В терминах gomoku это называется 3x3, если вы одновременно делаете два открытых тройки.

Обратите внимание, что оба троя должны быть открыты: вы можете понять, почему?

Есть и другие способы выиграть:

4x3: Вы видите выигрышный ход и почему он выигрывает?

____________
__XOOO______
__XXXO______
____OX______
____________

4x4: см. выигрышный ход?

____________
__XOOO______
__XXXO______
__OXOX______
___O________
__X_________

Это всего лишь основы игры. Знание тактики помогает вам подумать о том, как создать ИИ, чтобы вы могли жестко закодировать принципы.

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

Я пытаюсь написать программу на Java. Хотели бы вы увидеть код, который я сделал, чтобы вы могли играть? Это еще не очень хорошо, но вы могли бы получить оттуда новые идеи. Хотя комментарии и имена переменных написаны на эстонском языке, это может быть очень трудно понять.: (

Ответ 4

Я создал игрока gomoku один раз, и это было довольно успешно, используя обрезку альфа-беты и давая каждой позиции оценку, зависящую от того, сколько полуоткрытых и полностью открытых 2s, 3s и 4s, которые были у каждого игрока.

Вычисление это не n ^ 3. Вы просто проверяете, будет ли последнее движение закрывать любую из ваших линий противников, и если оно расширяет некоторые из ваших линий, а затем соответствующим образом изменяйте оценку.

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

Когда у вас есть плеер, вы должны попытаться выяснить, какой выигрыш для разных элементов (2s, 3s, 4s, open и half-open и т.д.) лучше всего, играя разные версии друг против друга.

Ответ 5

Гомоку разрешен, но он не решается, когда он воспроизводится с позиции открытия и ограниченными ресурсами.

Я автор программа Hewer gomoku и Gomocup, и я могу сказать вам, что для написания хорошего Гомоку AI требуется очень много времени. Ренджу намного сложнее. Вы можете упростить свою работу, используя Gomocup интерфейс и написать "только" AI.