2014-03-18 2 views
1

В настоящее время я занимаюсь программированием на языке 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 * обычно используется для поиска путей, но я собираюсь изменить его с целью просмотра состояния игры. Я уверен, что превращает его в минимаксный алгоритм.

+1

Вы пытались запустить профилировщик своего кода, чтобы узнать, где узкие места? –

+0

@Robert Harvey Нет. В настоящее время я выполняю около 0,1-0,5 секунды на AI (я могу запускать несколько AI-потоков) в соответствии с System.nanoTime(). Я размышляю о том, как улучшить поведение, не увеличивая это количество времени. user2864740: Да, они тоже ходят на каждом шагу. – Aarowaim

+2

Не видя своего кода, я не уверен, насколько мы можем вам помочь. Профилировщик будет лучше советом; он расскажет вам, где находятся горячие точки. –

ответ

2

Если вы только вычисление содержания вашего массива раз и вычисление для каждой ячейки что-то простое, как проверка несколько соседних ячеек для врагов, то 100x100 массив не будет работать вообще относительно ваших временных ограничений.

Учитывая, что информация на вашем посту для меня звучит как хорошая идея.

Смежные вопросы