Чтобы успешно применить мин / макс в пошаговой стратегии, вам нужно правильно применить все доступные шахматные приемы ...
Функция оценки
Даже шахматные движки имеют очень плохую силу, если ваши функции оценки плохие. Наиболее простая версия функции оценки: 1 = игра, выигранная белым, -1 = игра, выигранная черным, 0 = все остальные случаи; Но это даст вам очень плохую производительность. То же самое происходит с вашей пошаговой игрой! Если вы хотите использовать мин / макс (с альфа / бета-обрезкой и прочим), как в шахматах, вы также должны реализовать разумную функцию оценки! Иначе, вы не можете сравнить производительность этих алгоритмов применительно к вашей стратегии и к случаю, когда она применяется к шахматам.
Что оценивают функции шахматных движков, так это оценивают такие вещи, как:
- Насколько хорошо положение фигуры на доске?
- Сколько раз атакован кусок?
- Сколько раз это изделие защищено?
- Насколько хорошо каждая фигура может свободно «двигаться» на доске? (или: сколько плиток «контролирует»)
Те части функции оценки должны быть сначала «переведены» в вашу игру:
- Положение фигуры: это, например, на холме, который расширяет диапазон стрельбы?
- Атаковано: Насколько каждый предмет находится в опасности? (например, сумма значений атаки юнитов, способных атаковать специальный юнит, умноженная на некоторую вероятность быть атакованной им; вероятность увеличивается, если юнит уже поврежден; уменьшается, если в радиусе действия атакующего юнита много других юнитов)
- Собственная атака: Сколько юнитов может быть атаковано этим юнитом?
- Защита: Сколько собственных фигур рядом с ним (чтобы помочь)? Возможно, юнит не может атаковать юнитов на минимальном расстоянии, и его предпочтительно защищать юнитом, имеющим возможность атаковать соседние юниты.
- Мобильность: Насколько мобильно ваше устройство? (это может сбежать?)
Различные рейтинги должны суммироваться с помощью весовой функции (factor_a * rating_a + factor_b * ranting_b + ...) для всех единиц ...
В стратегических играх также должны учитываться оставшиеся ресурсы (золото, дерево, ...).
Если ваша функция оценки достаточно хороша, вам не нужно действительно искать «глубоко» в дереве в большинстве случаев. Таким образом, вам, вероятно, нужно только присмотреться к 3 или 10 наиболее перспективным вариантам. Смотрите следующую главу ...
Возможные ходы в каждой позиции
Наиболее проблемная вещь в использовании мин / макс для стратегических игр состоит в том, что вы можете командовать несколькими юнитами за один ход, тогда как в шахматах вам разрешено командовать только одним юнитом (за исключением рокировки, но это четко определенная комбинация ходов). Это вызывает 5 ^ N возможных ходов для N юнитов для каждой «позиции» (шахматный термин), если вы решите только «двигаться на север, юг, запад, восток ИЛИ остановиться» для каждого юнита. Вы можете решить эту проблему, разбив сложную команду на команды низкого уровня: например, выберите действие для блока A, углубитесь и выберите блок B .... выберите блок N ... и затем завершите этот ход. Но одно это не меняет сложности! Вы должны оптимизировать порядок, в котором действия назначаются единицам (например, первая единица B, C, D, а затем единица A). Вы можете записать влияние решения для каждой единицы во время последнего расчета, а затем отсортировать по важности. Таким образом, альфа-бета-обрезка может быть использована для раннего удаления любой плохой комбинации из дерева поиска. Наивысшим приоритетом всегда должно быть «ничего не делать и закончить свой ход» (обрезка нулевого хода) в каждой итерации. Таким образом, вы можете «пропустить» назначение большинства задач большинству юнитов и позволить им просто продолжить то, что они делали раньше. Таким образом, поиск быстро углубится в глубину, просто взглянув на «критические» юниты (например, те, которые действительно сейчас находятся в бою). Обязательно командуйте каждым юнитом только один раз ... Вы также можете использовать некоторую случайность, чтобы убедиться, что «важные» юниты тоже время от времени получают команду. Особенно, единицы, заканчивающие некоторую работу (например,
Итеративное углубление + кеширование / хеш-таблица
Затем вы можете «углубляться друг в друга», чтобы углубляться в глубины, пока не будет достигнут некоторый срок. Так что вы будете искать глубже, если будет меньше единиц, и у вас всегда будет какой-то «результат», если вы перестанете искать лучшее решение. Итеративное углубление потребовало бы использования хеш-таблицы для кэширования прежних результатов поиска. Это также позволяет повторно использовать некоторые результаты поиска последних ходов (ветвь дерева поиска, которая охватывает команды, которые были фактически выполнены в последнем ходу). Чтобы реализовать это, вам нужна очень хорошая функция хеширования (взгляните на «ключ zobrist»), которую можно многократно обновлять. Обновление хеш-ключа означает, что вы можете просто взять хеш-ключ старой «позиции» и просто нажать на изменение позиции (например, уберите устройство в положение x и поместите его в положение y). Таким образом, вычисление ключа хеша происходит быстро, и вам не нужно обрабатывать всю ситуацию с досками, чтобы вычислить ее, просто чтобы проверить, содержит ли хэш прежнюю запись для этой позиции. В некотором смысле вы должны убедиться, что коллизии хэшей не происходят.
Недетерминированное поведение
Недетерминированное поведение является проблемой для минимального / максимального поиска. Это означает, что вы не уверены, попадете ли вы в атакуемую цель (например, вероятность составляет 10%). Тогда вы не можете просто планировать, что это произойдет. В этом случае вам нужно изменить алгоритм и поместить «вероятностный» слой между ними. Это немного похоже на «поворот вероятностей». Каждый независимый результат должен рассматриваться отдельно. Оценка через этот глубинный «слой» должна быть затем отобрана (выборка Монте-Карло), и результат углубленной оценки должен быть взвешен вероятностью возникновения. Разные результаты слоя вероятности должны рассматриваться как разные ходы противника (но вместо min / max следует вычислять «среднее»). Это, конечно, увеличит сложность дерева поиска.
Резюме
Применяя все эти приемы (которые все используются нынешними шахматными движками) в детерминированной игре, вы наверняка сможете достичь разумных результатов и для игры. Для недетерминированных игр это, вероятно, будет более сложным, но я думаю, что все еще управляемым.
Хороший ресурс для объяснения этих методов (для шахмат) - http://chessprogramming.wikispaces.com/
Вы даже можете реализовать какую-то направленную случайность в поисках мин / макс. Вместо детерминистского исследования лучших результатов сначала в каждой итерации, вы можете просто рандомизировать это и позволить его порядку определяться распределением вероятностей, основанным на текущих оценках ...