Стратегии AI для гомоку (вариация крестики нолики)

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

интересно, знает ли кто-нибудь хорошую стратегию AI для игры. Моя текущая реализация очень глупа и занимает много времени (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: спасибо всем за отзыв! Я опробую ваши ответы и дам вам знать, если смогу что-то улучшить.

5 ответов


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


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

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

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

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

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

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


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

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

сколько вы сами играли в гомоку? Насколько хорошо вы владеете основами?

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

__________
____XOOOO_
__________

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

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

__________
____OOOO__
__________

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

__________
____OOO___
__________

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

___________
____XOOO___
___________

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

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

____________
____OOO_____
_____O______
____O_______

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

____________
_______O____
___XOOO_____
_____O______
____O_______
____________

и выиграть:

________O___
_______O____
___XOOO_____
_____O______
____O_______
___X________

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

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

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

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

____________
__XOOO______
__XXXO______
____OX______
____________

4x4: видите выигрышный ход?

____________
__XOOO______
__XXXO______
__OXOX______
___O________
__X_________

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

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

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


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

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

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

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


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

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