Режим поиска консенсуса
- 1 year ago
- 0
- 0
Алгоритм поиска D* (произносится как «Ди стар» ) — это любой из трёх связанных :
Все три алгоритма поиска решают одни и те же основанные на предположениях проблемы, включая планирование с предположением о свободном пространстве , когда робот должен перемещаться к заданным координатам цели на неизвестной местности. Он делает предположения о неизвестной части местности (например, что на ней нет препятствий) и находит кратчайший путь от её текущих координат до координат цели при этих предположениях. Затем робот следует по пути. Когда он наблюдает новую информацию на карте (например, ранее неизвестные препятствия), он добавляет эту информацию на свою карту и, при необходимости, перепланировывает новый кратчайший путь от текущих координат к заданным координатам цели. Он повторяет процесс до тех пор, пока не достигнет координат цели или не определит, что координаты цели не могут быть достигнуты. При пересечении неизвестной местности могут часто обнаруживаться новые препятствия, поэтому это перепланирование должно быть быстрым. Инкрементальные (эвристические) алгоритмы поиска ускоряют поиск последовательностей похожих поисковых задач, используя опыт решения предыдущих проблем для ускорения поиска текущей. Если предположить, что координаты цели не меняются, все три алгоритма поиска более эффективны, чем повторные поиски A* .
D* и его варианты широко использовались для мобильного робота и автономного транспортного средства навигации . Современные системы обычно основаны на облегчённом , а не на оригинальном или сфокусированном D* . Фактически, даже лаборатория Стенца в некоторых реализациях использует облегчённый , а не оригинальный D* . Такие навигационные системы включают в себя прототип системы, испытанный на марсоходах Opportunity и Spirit , и навигационную систему победителя конкурса DARPA Urban Challenge , оба разработанные в Университете Карнеги — Меллона .
Оригинальный D* был представлен Энтони Стенцем в 1994 году . Название D* происходит от термина « D ynamic A* » ( рус. « Д инамический A* » ), потому что алгоритм ведёт себя как A* , за исключением того, что стоимость дуги может изменяться по мере выполнения алгоритма.
Основные операции D* описаны ниже.
Подобно алгоритму Дейкстры и A* , D* поддерживает список узлов для оценки, известный как ОТКРЫТЫЙ список . Узлы помечаются как имеющие одно из нескольких состояний:
Алгоритм работает путём итеративного выбора узла из ОТКРЫТОГО списка и его оценки. Затем он распространяет изменения узла на все соседние узлы и помещает их в ОТКРЫТЫЙ список . Этот процесс распространения называется «расширением» . В отличие от канонического A* , который следует по пути от начала до конца, D* начинает поиск в обратном направлении от целевого узла. Каждый расширенный узел имеет обратный указатель, который относится к следующему узлу, ведущему к цели, и каждый узел знает точную стоимость для цели. Когда начальный узел является следующим расширяемым узлом, алгоритм выполнен, и путь к цели можно найти, просто следуя обратным указателям.
Когда на заданном пути обнаруживается препятствие, все затронутые точки снова помещаются в ОТКРЫТЫЙ список , на этот раз с пометкой ПОДНЯТЫЙ . Однако перед увеличением стоимости ПОДНЯТОГО узла алгоритм проверяет его соседей и исследует, может ли он снизить стоимость узла. В противном случае состояние ПОДНЯТЫЙ распространяется на всех потомков узлов, то есть узлы, на которые есть обратные указатели. Затем эти узлы оцениваются, и состояние ПОДНЯТЫЙ передаётся, формируя волну. Когда ПОДНЯТЫЙ узел может быть уменьшен, его обратный указатель обновляется и передаёт состояние НИЖНИЙ своим соседям. Эти волны состояний ПОДНЯТЫЙ и НИЖНИЙ являются сердцем D* .
К этому моменту волны не могут коснуться целого ряда других точек. Следовательно, алгоритм работал только с точками, на которые влияет изменение стоимости.
На этот раз невозможно так элегантно выйти из тупика. Ни одна из точек не может найти новый маршрут через соседа к пункту назначения. Поэтому они продолжают распространять своё повышение стоимости. Можно найти только точки за пределами канала, которые могут привести к месту назначения по жизнеспособному маршруту. Так развиваются две НИЖНИЕ волны, которые расширяются в виде точек, отмеченных как недостижимые с новой информацией о маршруте.
while (!openList.isEmpty()) {
point = openList.getFirst();
expand(point);
}
void expand(currentPoint) {
boolean isRaise = isRaise(currentPoint);
double cost;
for each (neighbor in currentPoint.getNeighbors()) {
if (isRaise) {
if (neighbor.nextPoint == currentPoint) {
neighbor.setNextPointAndUpdateCost(currentPoint);
openList.add(neighbor);
} else {
cost = neighbor.calculateCostVia(currentPoint);
if (cost < neighbor.getCost()) {
currentPoint.setMinimumCostToCurrentCost();
openList.add(currentPoint);
}
}
} else {
cost = neighbor.calculateCostVia(currentPoint);
if (cost < neighbor.getCost()) {
neighbor.setNextPointAndUpdateCost(currentPoint);
openList.add(neighbor);
}
}
}
}
boolean isRaise(point) {
double cost;
if (point.getCurrentCost() > point.getMinimumCost()) {
for each(neighbor in point.getNeighbors()) {
cost = point.calculateCostVia(neighbor);
if (cost < point.getCurrentCost()) {
point.setNextPointAndUpdateCost(neighbor);
}
}
}
return point.getCurrentCost() > point.getMinimumCost();
}
Как следует из названия, сфокусированный D* является расширением D* , которое использует эвристику, чтобы сфокусировать распространение ПОДНЯТОГО и НИЖНЕГО в направлении робота. Таким образом, обновляются только важные состояния, так же как A* вычисляет затраты только для некоторых узлов.
Облегчённый D* не основан на исходном или сфокусированном D* , но реализует то же поведение. Это проще для понимания и может быть реализовано меньшим количеством строк кода, отсюда и название «Облегчённый D*» . По производительности он не хуже сфокусированного D* . Облегчённый D* основан на LPA* , который был представлен Кёнигом и Лихачёвым несколькими годами ранее.
Для D* важно различать текущие и минимальные затраты. Первые важны только во время сбора, а последние решающие, потому что они сортируют ОТКРЫТЫЙ список . Функция, которая возвращает минимальную стоимость, всегда является наименьшей стоимостью для текущей точки, поскольку это первая запись в ОТКРЫТОМ списке .
{{
cite journal
}}
: Википедия:Обслуживание CS1 (множественные имена: authors list) (
ссылка
)
{{
cite journal
}}
: Википедия:Обслуживание CS1 (множественные имена: authors list) (
ссылка
)
{{
cite journal
}}
: Википедия:Обслуживание CS1 (множественные имена: authors list) (
ссылка
)