Стратегии 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.