В настоящее время я занимаюсь программированием на языке Java и пытаюсь попробовать ИИ. В этом случае моему ИИ дают 2 секунды, чтобы ответить на новое состояние игры. Если эти две секунды превышены без получения ответа, мой ИИ потеряет. Игра состоит из сетки с целями и противниками, каждый из которых является независимым ИИ, созданным игрой. Я применил стандарт A *, чтобы найти ближайшую доступную цель.
Я бы хотел, чтобы мой алгоритм A * увеличил стоимость квадратов рядом с врагом, который потенциально может оказаться опасным, тем самым избегая опасных путей. Я рассматриваю двумерный массив, содержащий предполагаемую потерю здоровья для каждого квадрата, ограниченную вычислением в пределах ~ 2 квадратов каждого врага (~ 5x5). Каждый оборот, для каждого врага, этот массив имел бы квадрат 5x5, равный 0, и пересчитывал.
Предполагая, что я пишу код, который только делает то, что ему нужно, и движется дальше... Будет ли двумерный массив элементов 20х20 и 100х100 значительно влиять на время выполнения? Является ли двумерный массив оцениваемой угрозы на квадрат хорошим методом расчета стоимости в алгоритме A *, чтобы избежать врагов?
ОБНОВЛЕНИЕ: У меня это работает абсолютно отлично. Функция стоимости, которую я использовал:
For each enemy
Calculate manhattan distance
If 0 or 1, cost += absolute(enemy health - health) / 5
Else if 2, cost += absolute(enemy heath - health) / 10
Else cost += 0
Используя его, я видел несколько действительно впечатляющих путей и движений; бот часто принимал рассчитанные риски, когда не было других ходов, чтобы добраться до цели, но в основном избегали врагов в противном случае. Я был очень впечатлен тем, как незначительная стоимость исполнения заключалась в добавлении эвристики. Это не идеальное решение для игры, но оно показало мне, насколько надежным может быть A *.
A * обычно используется для поиска пути, но я собираюсь изменить его с целью просмотра состояния игры. Я уверен, что превращает его в минимаксный алгоритм.
Если вы только вычисляете содержимое своего массива один раз, а вычисление для каждой ячейки - это что-то простое, например, проверка нескольких соседних ячеек для врагов, тогда массив 100x100 не работает вообще по отношению к вашим временным ограничениям.
Учитывая информацию в вашем посте, это звучит для меня как хорошая идея.