Поскольку определение подходящей целевой позиции во многих ситуациях может оказаться непростым делом, возможно, стоит рассмотреть следующий подход, основанный на двухмерных сеточных картах занятости. Его обычно называют «итерацией значения», и в сочетании с градиентным спуском / подъемом он дает простой и довольно эффективный (в зависимости от реализации) алгоритм планирования пути. Благодаря своей простоте, он хорошо известен в области мобильной робототехники, в частности, для "простых роботов", которые перемещаются в помещениях. Как подразумевается выше, этот подход предоставляет средства для нахождения пути от начальной позиции без явного указания целевой позиции следующим образом. Обратите внимание, что при желании можно указать целевую позицию, если она доступна. Кроме того, подход / алгоритм представляет собой поиск в ширину,
В двоичном случае двумерная сеточная карта занятости - одна для занятых ячеек сетки и ноль в другом месте. Обратите внимание, что это значение занятости также может быть непрерывным в диапазоне [0,1], я вернусь к этому ниже. Значение заданной ячейки сетки g i равно V (g i ) .
Базовая версия
- Предполагая, что ячейка сетки g 0 содержит начальную позицию. Установите V (g 0 ) = 0 и поместите g 0 в очередь FIFO.
- Возьмите следующую ячейку сетки g i из очереди.
- Для всех соседей g j of g i :
- Если g j не занят и ранее не посещался:
- V (g j ) = V (g i ) +1
- Отметить g j как посещенные.
- Добавьте g j в FIFO-очередь.
- Если заданный порог расстояния еще не достигнут, переходите к (2.), в противном случае переходите к (5.).
- Путь получается путем следования наискорейшего подъема градиента, начиная с g 0 .
Примечания к шагу 4.
- Как указано выше, шаг (4.) требует отслеживать максимальное пройденное расстояние, которое было опущено в вышеприведенном описании из соображений ясности / краткости.
- Если задана целевая позиция, итерация останавливается, как только достигается целевая позиция, т.е. обрабатывается / посещается как часть шага (3.).
- Конечно, также возможно просто обработать всю карту сетки, то есть продолжать, пока все (свободные) ячейки сетки не будут обработаны / посещены. Ограничивающим фактором, очевидно, является размер карты-сетки в сочетании с ее разрешением.
Расширения и дальнейшие комментарии
Уравнение обновления V (g j ) = V (g i ) +1 оставляет достаточно места для применения всех видов дополнительной эвристики путем уменьшения V (g j ).или аддитивный компонент, чтобы уменьшить значение для определенных опций пути. Большинство, если не все, такие модификации могут быть красиво и в общем случае встроены с использованием карты сетки с непрерывными значениями из [0,1], которая фактически представляет собой этап предварительной обработки исходной двоичной карты сетки. Например, добавление перехода от 1 к 0 по границам препятствий приводит к тому, что «субъект» предпочтительно остается чистым от препятствий. Такая сеточная карта может, например, быть сгенерирована из двоичной версии с помощью размытия, взвешенного расширения или подобного. Добавление угроз и врагов в качестве препятствий с большим радиусом размытия штрафует пути, которые приближаются к ним. Можно также использовать диффузионный процесс на общей карте сетки следующим образом:
V (g j ) = (1 / (N + 1)) × [V (g j ) + сумма (V (g i ))]
где « сумма » относится к сумме по всем соседним ячейкам сетки. Например, вместо создания двоичной карты начальные (целочисленные) значения могут быть пропорциональны величине угроз, а препятствия представляют «небольшие» угрозы. После применения процесса диффузии значения сетки должны / должны быть масштабированы до [0,1], а ячейки, занятые препятствиями, угрозами и врагами, должны быть установлены / принудительно установлены на 1. В противном случае масштабирование в уравнении обновления может не работает, как хотелось бы.
Существует много вариантов этой общей схемы / подхода. Препятствия и т. Д. Могут иметь небольшие значения, в то время как свободные ячейки сетки имеют большие значения, что может потребовать снижения градиента на последнем этапе в зависимости от цели. В любом случае, подход, на мой взгляд, удивительно универсален, довольно прост в реализации и потенциально довольно быстр (в зависимости от размера / разрешения сетки). Наконец, как и во многих алгоритмах планирования пути, которые не предполагают конкретной целевой позиции, существует очевидный риск застрять в тупиках. В некоторой степени может быть возможно применить выделенные этапы последующей обработки перед последним этапом, чтобы уменьшить этот риск.
Вот еще одно краткое описание с иллюстрацией в Java-Script (?), Хотя иллюстрация не работает с моим браузером :(
http://www.cs.ubc.ca/~poole/demos/mdp/vi.html
Много более подробной информации о планировании можно найти в следующей книге. Итерация значения конкретно обсуждается в главе 2, раздел 2.3.1 Оптимальные планы фиксированной длины.
http://planning.cs.uiuc.edu/
Надеюсь, что это помогает, с уважением, Дерик.