В настоящее время я занимаюсь программированием на языке Java и пытаюсь попробовать ИИ. В этом случае моему ИИ дают 2 секунды, чтобы ответить на новое состояние игры. Если эти две секунды превышены без получения ответа, мой ИИ потеряет. Игра состоит из сетки с целями и противниками, каждый из которых является независимым ИИ, созданным игрой. Я применил стандарт A *, чтобы найти ближайшую доступную цель.A * с осознанием противника
Я бы хотел, чтобы мой алгоритм A * увеличил стоимость квадратов рядом с врагом, который потенциально может оказаться опасным, тем самым избегая опасных путей. Я рассматриваю двумерный массив, содержащий предполагаемую потерю здоровья для каждого квадрата, ограниченную вычислением в пределах ~ 2 квадратов каждого врага (~ 5x5). Каждый оборот, для каждого врага, этот массив имел бы квадрат 5x5, равный 0, и пересчитывался.
Предполагаю, что я пишу код, который только делает то, что он должен и движется дальше ... Будет ли двумерный массив элементов 20x20 и 100x100 значительно влиять на время выполнения? Является ли двумерный массив оцениваемой угрозы на квадрат хорошим методом расчета стоимости в алгоритме 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 * обычно используется для поиска путей, но я собираюсь изменить его с целью просмотра состояния игры. Я уверен, что превращает его в минимаксный алгоритм.
Вы пытались запустить профилировщик своего кода, чтобы узнать, где узкие места? –
@Robert Harvey Нет. В настоящее время я выполняю около 0,1-0,5 секунды на AI (я могу запускать несколько AI-потоков) в соответствии с System.nanoTime(). Я размышляю о том, как улучшить поведение, не увеличивая это количество времени. user2864740: Да, они тоже ходят на каждом шагу. – Aarowaim
Не видя своего кода, я не уверен, насколько мы можем вам помочь. Профилировщик будет лучше советом; он расскажет вам, где находятся горячие точки. –