Как мне разработать хорошую функцию оценки для Connect 4?
У меня есть Java-реализация игры "Connect 4" (с переменным количеством столбцов и строк) .
В этой реализации используется (по выбору пользователя) алгоритм Mini-max Mini-max с отсечкой альфа-бета с максимальной глубиной поиска maxDepth
Моя проблема сейчас заключается в разработке хорошей функции оценки состояния платы (это значение, возвращаемое в maxDepth).
Значение находится в диапазоне от -100 (худший вариант, соответствует проигрышной ситуации) до 100 (наилучший выбор соответствует выигрышной ситуации), где 0 считается ситуацией "ничьей".
На самом деле я реализовал две функции (я сообщаю псевдокод, потому что код очень длинный)
1)
- нет победы / нет проигрыша
-> если таблица заполнена ==> сделать (0)
-> если таблица не заполнена ==> неуверенная ситуация (50)
- выиграть
-> если моя победа: 100
-> если победа противника: -100
2)
Of me:
- InARow[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow[1] = maximum number of pieces in a VERTICAL in a row
- InARow[2] = maximum number of pieces in a DIAGONAL (ascending) in a row
- InARow[3] = maximum number of pieces in a DIAGONAL (descending) in a row
Of the opponent
- InARow2[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow2[1] = maximum number of pieces in a VERTICAL in a row
- InARow2[2] = maximum number of pieces in a DIAGONAL (ascending) in a row
- InARow2[3] = maximum number of pieces in a DIAGONAL (descending) in a row
value = (100* (InARow[0] + InARow[1] + InARow[2] + InARow[3]) )/16 - (100* (InARow2[0] + InARow2[1] + InARow2[2] + InARow2[3]) )/16
Мне нужно разработать третью (и, если возможно, лучшую) функцию. Любое предложение?
Заранее спасибо.
3 ответа
Просто посчитайте количество возможных 4 в строках, которые каждый игрок может сделать, и вычтите их друг от друга.
Например, оба игрока начинают со счета 7*4 (horizontal) + 4*7 (vertical) + 4*4 (diagonal up) + 4*4 (diagonal down)
, Если красный ставит один в левом нижнем углу, то желтый теряет счет 1 + 1 + 1 + 0 = 3
, Но если красный ставит один в середине, желтый теряет счет 4 + 1 + 1 + 1 = 7
,
Конечно, если один из игроков выигрывает, то счет другого игрока -infinity
независимо от системы выше.
У вас есть сглаженные базовые случаи: мой выигрыш = 100 очков, мой проигрыш = -100, ничья = 0. "Неуверенный" случай, который вы можете убить, не отражает "доброту" доски. Так что теперь вам нужно заполнить пробелы. Случаи, которые вы хотите рассмотреть и назначить значения:
- У меня есть X в ряду (если у меня есть 3 в ряду, это лучше, чем только два в строке - ваша функция должна предпочесть добавление к более длинным строкам по сравнению с более короткими)
- У моего оппонента Х подряд (аналогично, чем больше у него / нее подряд, тем хуже для нас)
- Подсчитайте, сколько строк вы заполняете (Размещение фигуры и формирование 2 рядов по 3 лучше, чем размещение фигуры и формирование только одного ряда по 3).
- Подсчитайте, сколько строк вы блокируете (аналогично, если вы можете сбросить фигуру и заблокировать два ряда противников по 3, это лучше, чем блокирование одного ряда по 2)
Вот две отдельные функции оценки для подключения 4
- Одна базовая функция оценки, как предложено в другом ответе, мы можем вычислить количество возможных 4 в рядах, которые игрок все еще может сделать, и вычесть это из противника. Вы можете назначать разный вес или важность блокам, которые уже имеют три плитки, по сравнению с блоками, которые имеют только 1 плитку.
- Еще одна более сильная функция оценки может быть построена с использованием концепции угроз. Угроза - это квадрат, соединяющий 4, когда противник сбрасывает плитку. Вы можете просто вернуть разницу в количестве угроз для каждого игрока, но мы можем добиться большего успеха, фактически отфильтровывая бесполезные угрозы (например, угрозу чуть выше угрозы оппонента или все угрозы выше угрозы со стороны обоих игроков) и даже назначая бонус для некоторых угроз (например, самая низкая угроза столбца или 2 последовательных угрозы от одного и того же игрока).
Вес может быть настроен вручную или самообучением для более крупного проекта.