Итак, я экспериментировал с деревьями minmax, чтобы создать простого компьютерного игрока в настольной игре для двух человек. Я понимаю основы алгоритма, но есть случай, который ускользает от моего мозга, наполненного индейкой ... что происходит, когда MIN может выиграть в два этапа?
Например, предположим, что игра типа connect4 / tic-tac-toe, в которой только один из двух игроков может владеть квадратом. Как сделать так, чтобы MAX занимал квадрат исключительно для того, чтобы MIN не попал в квадрат?
Давайте попробуем упрощенный пример (показанный изящным рисунком ASCII), где варианты - «Левый» и «Правый». Предположим, что дерево слишком велико, чтобы пройти весь путь до конечных состояний, поэтому промежуточные значения вычисляются на основе эвристической функции (отмеченной * ниже). -INF - это конечное состояние, в котором MIN побеждает.
MAX (a)
/ \
A B
/ \
MIN (b) MIN (c)
/ \ / \
A B A B
/ | | \
-INF *5 *22 *20
MIN выберет действие A в состоянии (b) со счетом -INF
MIN выберет действие B в состоянии (c) со счетом +20
MAX выберет действие B в состояние (а) на сумму +20 баллов
Проблема - конечно же - в том, что если MAX выберет B, то MIN выполнит действие A (поскольку этот квадрат все еще доступен), и, таким образом, MIN победит. Мне нужно получить MAX, чтобы понять значение выбора действия A в состоянии (a), чтобы MIN не получил -INF на следующем ходу.
Я бы поставил в код кучу тестов, чтобы проверить, может ли MIN победить, но мне кажется, что алгоритм должен позаботиться об этом. Я думаю, что мне не хватает части определения значения в отношении MAX, которое вызывает это.
(Отредактировано для пояснения)