Pull to refresh

Простое объяснение алгоритмов поиска пути и A*

Reading time13 min
Views65K
image

Часть 1. Общий алгоритм поиска


Введение


Поиск пути — это одна из тех тем, которые обычно представляют самые большие сложности для разработчиков игр. Особенно плохо люди понимают алгоритм A*, и многим кажется, что это какая-то непостижимая магия.

Цель данной статьи — объяснить поиск пути в целом и A* в частности очень понятным и доступным образом, положив таким образом конец распространённому заблуждению о том, что эта тема сложна. При правильном объяснении всё достаточно просто.

Учтите, что в статье мы будем рассматривать поиск пути для игр; в отличие от более академических статей, мы опустим такие алгоритмы поиска, как поиск в глубину (Depth-First) или поиск в ширину (Breadth-First). Вместо этого мы постараемся как можно быстрее дойти от нуля до A*.
Читать дальше →
Total votes 29: ↑29 and ↓0+29
Comments11

Новый алгоритм поиска пути в Factorio

Reading time6 min
Views22K

На прошлой неделе мы говорили в своём блоге об изменениях, которые позволят врагам (biters, кусакам) не наталкиваться друг на друга, но это было не единственное обновление, связанное с biter-ами. Совпало так, что в обновления этой недели вошло то, над чем мы работали предыдущие несколько недель — обновление системы поиска пути для врагов.

Поиск пути


Когда юнит хочет куда-то переместиться, ему сначала нужно понять, как туда добраться. В самом простом случае можно двигаться прямиком к цели, но на пути иногда возникают препятствия — скалы, деревья, гнёзда врагов (spawners), юниты игрока. Чтобы проложить дорогу, мы должны сообщить функции поиска пути (pathfinder) текущую и конечную позиции, а pathfinder вернёт нам (возможно, через много тактов) путь, который просто является набором промежуточных точек (waypoints), по которым должен двигаться юнит, чтобы добраться до места назначения.

Для выполнения своей работы pathfinder использует алгоритм под названием A* (произносится «A star»). Простой пример поиска пути при помощи A* показан на видео: biter хочет найти путь в обход скал. Функция поиска пути начинает исследовать карту вокруг biter-а (исследование показано белыми точками). Сначала она пытается пойти напрямик к цели, но как только достигает скал, «разливается» в обе стороны, пытаясь найти позицию из которой снова можно будет двигаться к цели.
Total votes 58: ↑57 and ↓1+56
Comments29

Попытки сделать изучение алгоритмов поиска пути проще

Reading time8 min
Views24K
Алгоритмы поиска пути — неотъемлемая часть разработки игр. А также различных систем навигации, ориентации и много чего ещё. Но мы сосредоточимся на именно игровой индустрии и алгоритмах, которые в ней применяются.

Каждый игровой разработчик сталкивается с задачей, в которой требуется заставить персонажа(или бота) пройти из одной точки в другую, при этом не собрав все стены. А разработчикам стратегий ещё нужно учитывать проходимость клеток(дороги, болота, леса и так далее). Вот здесь на помощь приходят алгоритмы поиска пути.

image
Читать дальше →
Total votes 46: ↑42 and ↓4+38
Comments18

Простейший вариант поиска пути: объяснение на Python

Reading time8 min
Views27K

Как именно мы находим выход из лабиринта? Как быстрее всего проехать из точки А в ближайшую пиццерию? Можем ли мы провести игрового персонажа к выходу так, чтобы он не уперся в стену?

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

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

Здесь мы рассмотрим практическое применение этого алгоритма. Вам понадобятся базовые знания программирования и языка Python.

Читать далее
Total votes 11: ↑8 and ↓3+5
Comments2

Трансформером по A*, или как уменьшить число итераций самого известного алгоритма поиска пути

Level of difficultyMedium
Reading time24 min
Views7.3K

Привет! Меня зовут Константин Яковлев, я научный работник и вот уже более 15 лет я занимаюсь методами планирования траектории. Часто эта задача сводится к поиску пути на графе, для чего обычно используется алгоритм эвристического поиска A*. Этот алгоритм был предложен в 60-х годах XX века и с тех пор используется повсеместно. Скорее всего, юнит вашей любимой RTS бежит по карте с помощью той или иной вариации A*. Точно так же, под капотом беспилотного авто вы, наверняка, найдёте A*, хотя там, конечно, не только он.

A* — это хороший алгоритм, но его вычислительная эффективность сильно зависит от эвристической функции, которую должен задать разработчик. Основная проблема стандартных эвристик заключается в том, что они не учитывают расположение препятствий на карте и ведут поиск буквально напролом, тратя на это ресурсы (итерации поиска). Почему бы нам не воспользоваться современными нейросетями для решения этой проблемы, а именно попросить нейросеть посмотреть на карту и подсказать поиску как лучше обходить препятствия, чтобы быстрее (за меньшее число итераций) найти нужный путь?

Этот текст посвящен как самому алгоритму A*, так и попыткам повысить его эффективность с помощью методов искусственного интеллекта. Заодно я расскажу о том, какие новшества в этом направлении придумали мы с коллегами: научная статья на эту тему опубликована в сборнике конференции AAAI 2023.

Читать далее
Total votes 34: ↑34 and ↓0+34
Comments35

Реализация поиска путей для ИИ-агентов с помощью NavMesh

Reading time10 min
Views37K
image

Следование по пути и управление движением


Иногда нам нужно, чтобы ИИ-персонажи бродили по игровому миру, следуя по грубо очерченному или точно заданному пути. Например в гоночной игре ИИ-противники должны ехать по дороге, а в RTS юниты должны уметь перемещаться в нужную точку, двигаясь по рельефу и учитывая положение друг друга.

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

Избегание препятствий — это простое поведение, позволяющее ИИ-сущностям достигать целевых точек. Важно заметить, что поведение, реализуемое в этом посте, предназначается для таких поведений, как симуляция толпы, в которой основной целью каждого агента является избегание других агентов и достижение цели. Они не определяют наиболее эффективный и кратчайший путь.

Технические требования


Необходима версия Unity 2017, установленная в системе с Windows 7 SP1+, 8, 10 или с Mac OS X 10.9+. Код из данной статьи не будет работать на Windows XP и Vista, а серверные версии Windows и OS X не тестировались.

Файлы кода для этого поста можно найти на GitHub.

Чтобы изучить код в действии, посмотрите это видео.
Читать дальше →
Total votes 14: ↑13 and ↓1+12
Comments3

В поисках пути — царь Салтан осваивает лапласиан

Reading time11 min
Views21K
… Молвит он: «Коль жив я буду, чудный остров навещу, у Гвидона погощу».



В царстве Салтана не без изьяна. Принят закон — не лезть за кордон, да тут князь Гвидон.
Опять прислал поклон, да приглашение на угощение,- надо принимать политическое решение.

Дворцовые интриганки, похожие на поганки, встали стеной — «мол, скажи, что больной». Но прослышал Салтан про Гвидонов кальян, про изумрудную белку, да богатырскую стрелку. А главная новинка — молодая жинка. В общем, ехать решено — «Я не был за морем давно».

Было однако одна проблема,- нужен был маршрут или схема. Поскольку никто (кроме Врангеля барона) не знал, как добраться до острова Гвидона. Корабельщики дали карту,- пришлось сесть за парту. Над картой склонился Салтан, — где тут остров Буян? Задача была как будто знакома — проложить путь к острову Гвидона. Но как найти дорогу, когда путей слишком много?

До ночи решал Салтан задачку, в итоге свалился в спячку. Снились ему матрицы и точки, да на болоте кочки. На кочку прыгнул Нео с острова Борнео.
— Если хочешь добраться ко сроку — плыви по максимальному потоку.
— Чего? — Салтан почти проснулся. Но Нео уже в зайца обернулся.
Плывем дальше
Total votes 36: ↑31 and ↓5+26
Comments6

Вражеский ИИ: преследование игрока без Navigation2D и поиска пути A*

Reading time3 min
Views13K
Создаёте игру, в которой враги должны преследовать игрока? Всё начинается с простого — заставим врага бежать к игроку. Но что произойдёт, если он находится за деревом, или за углом стены? Ну, теперь враг будет выглядеть довольно глупо — упрётся в объект, перебирая ногами на месте. Не очень хорошо!

Чтобы решить эту проблему, можно использовать встроенные в Godot ноды Navigation2D или AStar (вот туториал GDQuest, посвящённый обоим нодам). Но в Helms of Fury мы использовали другой способ, который отлично подошёл нашей игре, и мы хотим поделиться им в этом туториале. Вот как это выглядит:


Приступаем к работе


Будем считать, что вы создаёте врагов как объекты KinematicBody2D и используете для управления их состояниями конечный автомат. Не знаете, что такое конечный автомат? Мне нравится эта статья с объяснением конечных автоматов, а также способов их использования. Вот ещё одна статья о реализации простых конечных автоматов в Godot.
Читать дальше →
Total votes 18: ↑18 and ↓0+18
Comments6

Алгоритмы поиска путей на JavaScript

Reading time1 min
Views32K


Поиск оптимального маршрута юнита к цели на неизвестной карте — одна из самых сложных задач при разработке игры. К счастью, существует некоторое количество алгоритмов, которые решают эту задачу. Есть и отличная библиотека PathFinding.js с поддержкой 11 таких алгоритмов.
Читать дальше →
Total votes 65: ↑47 and ↓18+29
Comments14

Лабиринты: классификация, генерирование, поиск решений

Reading time44 min
Views81K

В этом классическом посте подробно рассказывается о самых популярных способах создания и прохождения лабиринтов. Статья разделена на четыре части: классификация, алгоритмы генерации, алгоритмы решения лабиринтов и другие операции с лабиринтами.

Классификация лабиринтов


Лабиринты в целом (а значит, и алгоритмы для их создания) можно разбить по семи различным классификациям: размерности, гиперразмерности, топологии, тесселяции, маршрутизации, текстуре и приоритету. Лабиринт может использовать по одному элементу из каждого класса в любом сочетании.
Читать дальше →
Total votes 82: ↑82 and ↓0+82
Comments13

Поиск пути среди круглых препятствий

Reading time9 min
Views14K

Навигация по лесу


Алгоритм поиска пути A* — это мощный инструмент для быстрой генерации оптимальных путей. Обычно A* демонстрируют при навигации по картам из сеток, но он может использоваться не только для сеток! Он может работать с любыми графами. Можно использовать A* для поиска пути в мире круглых препятствий.


В оригинале статьи все изображения интерактивны.

Как один алгоритм решает обе эти задачи? Давайте начнём с краткого описания того, как работает A*.

Алгоритм A*


Алгоритм A* находит оптимальный путь из начальной в конечную точку, избегая по дороге препятствия. Он реализует это, постепенно расширяя множество частичных путей. Каждый частичный путь — это серия шагов от начальной точки до какой-то промежуточной точки на дороге к цели. В процессе работы A* частичные пути становятся всё ближе конечной точке. Алгоритм прекращает работу тогда, когда находит полный путь, который лучше оставшихся вариантов, и это можно доказать.

На каждом шаге алгоритма A* оценивает множество частичных путей и генерирует новые пути, расширяя наиболее многообещающий путь из множества. Для этого A* хранит частичные пути в очереди с приоритетами, отсортированном по приблизительной длине — истинной измеренной длине пути плюс примерное оставшееся расстояние до цели. Это приближение должно быть недооценкой; то есть приближение может быть меньше истинного расстояния, но не больше него. В большинстве задач поиска пути хорошей преуменьшенной оценкой является геометрическое расстояние по прямой от конца частичного пути до конечной точки. Истинный наилучший путь до цели от конца частичного пути может быть длиннее, чем это расстояние по прямой, но не может быть короче.
Читать дальше →
Total votes 46: ↑46 and ↓0+46
Comments15

Опыт разработки ассета Unity для поиска пути в 3D пространстве

Reading time7 min
Views5.1K
Вас приветствует команда «Graceful Algorithms»!

В качестве эксперимента нами было принято решение вести «дневники» разработчиков, в которых мы будем делиться опытом и освещать некоторые интересные результаты проводимых нами экспериментов. Это наша дебютная статья по проекту «Pathfinder 3D» — ассету для игрового движка Unity, который позволяет производить поиск пути в трёхмерном пространстве. В ней мы расскажем о пути от зарождения идеи до полноценного продукта и о некоторых проблемах, с которыми мы встретились. Данный материал будет полезен для людей, которые хотят начать свой проект и поддерживать его в дальнейшем, а также для желающих реализовать поиск пути в пространстве.
Читать дальше →
Total votes 21: ↑20 and ↓1+19
Comments4

Алгоритмы поиска пути: Алгоритм дейкстры и А*

Level of difficultyMedium
Reading time7 min
Views12K


Автор статьи: Артем Михайлов

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

Пространство, в котором происходит поиск, обычно представляется в виде графа. Вершины графа представляют собой точки или места, а ребра графа представляют собой пути или дороги между этими точками. Веса на ребрах графа могут представлять расстояния или стоимости перемещения между вершинами. Целью алгоритма поиска пути является нахождение кратчайшего или наиболее экономичного пути от начальной вершины до конечной вершины.

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

В этой статье мы сосредоточимся на двух популярных алгоритмах поиска пути — алгоритме Дейкстры и алгоритме A*. Оба алгоритма имеют свои преимущества и недостатки, и выбор между ними часто зависит от конкретной задачи и условий ее выполнения.
Читать дальше →
Total votes 15: ↑9 and ↓6+3
Comments2

Унификация поиска пути вместо различной логики ИИ

Level of difficultyEasy
Reading time7 min
Views1.9K

ИИ нужно бегать по разным навигационным картам, каждая из которых требует свои входные и выходные данные, но прописывать дополнительную логику не хочется? Отлично, в этом вопросе нам поможет унификация поиска пути!

Объяснение и реализация
Total votes 9: ↑8 and ↓1+7
Comments2

Алгоритм поиска пути A* в воксельной 3d игре на Unity

Reading time7 min
Views18K

Введение


При разработке своей игры, я дошёл до момента создания первых NPC. И появился вопрос как заставить NPC обойти стену а не "идти в неё".


Полазив по интернету я нашёл такие алгоритмы:


  • Поиск в ширину (BFS, Breadth-First Search)
  • Алгоритм Дейкстры (Dijkstra)
  • А Star "A со звёздочкой"
  • Поиск по первому наилучшему совпадению (Best-First Search)
  • IDA (A с итеративным углублением)
  • Jump Point Search

И решил попробовать реализовать свой A* на воксельной 3д сетке.


Читать дальше →
Total votes 19: ↑18 and ↓1+17
Comments18

Алгоритм поиска пути Jump Point Search

Reading time6 min
Views123K
Этот алгоритм является улучшенным алгоритмом поиска пути A*. JPS ускоряет поиск пути, “перепрыгивая” многие места, которые должны быть просмотрены.  В отличие от подобных алгоритмов JPS не требует предварительной обработки и дополнительных затрат памяти. Данный алгоритм представлен в 2011 году, а в 2012 получил высокие отклики. Что из себя представляет данный алгоритм и его реализацию можно прочитать дальше в статье.


Читать дальше →
Total votes 110: ↑108 and ↓2+106
Comments37

Алгоритм поиска путей в лабиринте

Reading time5 min
Views127K
Доброго времени суток, уважаемое сообщество.

Предыстория



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

Вот собственно и он:




Рабочий день был скучный, настроение было отличное. Цель, средства и желание имеются. Вывод очевиден, будем проходить.

Кого заинтересовал, прошу под кат
Total votes 65: ↑41 and ↓24+17
Comments100

Библиотека быстрого поиска путей на графе

Reading time8 min
Views35K

Привет, Друзья!


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


Пример использования на огромном графе:



Поиграться с демо можно здесь


В библиотеке используется мало-известный вариант A* поиска, который называется NBA*. Это двунаправленный поиск, с расслабленными требованиями к функции-эвристике, и очень агрессивным критерием завершения. Не смотря на свою малоизвестность у алгоритма отличная скорость сходимости к оптимальному решению.


Описание разных вариантов A* уже не раз встречалось на хабре. Мне очень понравилось вот это, потому повторяться в этой статье я не буду. Под катом расскажу подробнее почему библиотека работает быстро и о том, как было сделано демо.

Читать дальше →
Total votes 114: ↑112 and ↓2+110
Comments53

Голосовой поиск: путь к удобству и оперативности в цифровой эпохе

Level of difficultyEasy
Reading time5 min
Views878

Раньше обращение человека к компьютеру голосом можно было увидеть только в фантастическом кино. В настоящее время больше половины пользователей предпочитают голосовые запросы. Это очень удобно: не нужно отвлекаться от текущих дел, чтобы напечатать свой вопрос, поэтому ежедневно люди разговаривают со своими девайсами. Да и сказать гораздо быстрее, чем ввести текст, даже если в настоящий момент руки свободны.

Распространено убеждение, что голосовой ввод заменяет собой текст. На самом деле письменный формат остаётся основным: компьютер умеет всего лишь фиксировать речь, но не обрабатывать её. Алгоритмы переводят сказанную фразу в тестовый формат, а только потом анализируют и ищут в глобальной сети ответ на запрос.

Читать далее
Total votes 6: ↑3 and ↓30
Comments0

Визуализация алгоритмов поиска пути на Svelte: Практические заметки

Level of difficultyEasy
Reading time2 min
Views2.7K

Привет, Хабр! В этом посте делюсь опытом разработки на Svelte, демонстрируя это на моем пет-проекте.

Код проекта: GitHub
Лайв демо: ivan-sem.com

Читать далее
Total votes 2: ↑2 and ↓0+2
Comments11
1
23 ...