Навигация AI вокруг 2-й карты - предотвращение препятствий

Я знаю, что мой вопрос кажется довольно неопределенным, но я не могу думать о лучшем способе поместить его, таким образом, я начнусь путем объяснения, что я пытаюсь сделать.

Я в настоящее время работаю над проектом, посредством чего мне дали карту, и я кодирую 'Существо', которое должно смочь переместиться по ее пути вокруг карты; у существа есть различные другие функции, но они не относятся к текущему вопросу. Целая программа и решение пишутся в C#.

Я могу контролировать скорость существа и получить ее текущее местоположение на карте путем возврата ее текущего положения X и Y, я могу также установить его направление, когда она сталкивается с ландшафтом, который блокирует ее.

Единственная проблема, которую я имею, состоит в том, что я не могу думать о способе разумно переместиться по моему пути вокруг карты; до сих пор я основывал его на том, с каким направлением существо сталкивается, когда это сталкивается с ландшафтом, и это никоим образом не хороший способ переместить карту!

Я не игровой программист, и это для присвоения программного обеспечения, таким образом, у меня нет подсказки о методах AI.

Вот ссылка на изображение того, на что похожи карты и существа:

Карта и изображение Существа

Я никоим образом не ищу никого, чтобы дать мне полное решение, просто нажатие в общем направлении на навигации карты.

8
задан Bill the Lizard 18 September 2012 в 14:16
поделиться

3 ответа

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

Некоторые из наиболее популярных типов алгоритмов: ...

Потенциальные поля - это причудливый способ сказать, что каждое препятствие или стена имеет «силу отталкивания», в то время как каждая цель имеет «силу притяжения». Сила силы зависит от расстояния от объекта и его «тяжести». (Яма с лавой намного труднее преодолевать, чем ухабистая дорога) После построения силовых полей наивный алгоритм сводится к следованию по пути наименьшего сопротивления. Более совершенные версии могут обнаруживать локальные минимумы и максимумы и выходить из этих скважин.

    Critter
    -----\    /-------\
          \  /         \ 
           \/           \
   Local Minima Trap     \
                          \
                           \
                             Goal
6
ответ дан 5 December 2019 в 18:57
поделиться

A* Поиск

Посмотрите на алгоритм поиска пути A*. Это, по сути, стандартный подход для подобных вещей.

В статье Амита Пателя о поиске пути для игр есть довольно хорошее введение в A*, а также популярные варианты алгоритма.

Вы найдете реализацию на C# здесь, и здесь

Dynamic A*

Допустим, местность, которую вы будете искать, не известна заранее, а скорее обнаруживается по мере того, как агент исследует свое окружение. Если ваш агент наткнется на ранее неизвестное препятствие, вы можете просто обновить его карту местности, а затем повторно запустить A*, чтобы найти новый путь к цели, который обойдет препятствие.

Хотя это решение вполне работоспособно, повторный запуск алгоритма планирования с нуля каждый раз, когда вы находите новое препятствие, приводит к значительному объему избыточных вычислений. Например, после того как вы обойдете препятствие, может оказаться, что наиболее эффективный маршрут к цели следует по тому же пути, по которому вы планировали идти до обнаружения препятствия. Если просто повторно запустить A*, вам придется заново вычислять этот участок предыдущего пути.

Вы можете избежать этого, используя Dynamic A* (D*). Поскольку она отслеживает ранее рассчитанные пути, когда агент находит новое препятствие, системе нужно рассчитать новые маршруты только в области вокруг препятствия. После этого она может просто повторно использовать существующие пути.

3
ответ дан 5 December 2019 в 18:57
поделиться

Я бы использовал подход, ориентированный на цель. В вашем вопросе говорится, что цель состоит в том, чтобы исследовать карту и избегать препятствий, так что это то, что мы делаем нашей целью. Но как мы исследуем всю карту? Мы исследуем то, что еще не исследовано.

С самого начала у вас есть только одна неисследованная область - квадрат, на котором вы находитесь. Остальная часть карты помечена как неисследованная. Вы выбираете неисследованное место и ставите перед собой цель исследовать его. Но как вы туда попадете? Вы создаете подцель, чтобы исследовать место рядом с ним. А как вы это сделаете - исследуете соседний квадрат, и так далее, пока ваша первоначальная цель не будет разбита на последовательность исследований, начиная с вашего текущего квадрата и продвигаясь к целевому квадрату.

По мере того, как вы натыкаетесь на препятствия и открываете особенности карты, некоторые из подцелей могут быть изменены. Например, когда вы натыкаетесь на стену, подцель по исследованию этого квадрата должна быть стерта, и вы создаете новый план для поиска альтернативного маршрута. Это известно как откат назад.

Вот, в общем-то, и все для высокоуровневого описания. Надеюсь, это поможет!

0
ответ дан 5 December 2019 в 18:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: