Изменения

Перейти к: навигация, поиск

Visibility graph и motion planning

587 байт добавлено, 00:09, 30 апреля 2014
Нет описания правки
|[[Файл:notShort.png|300px|thumb|right|Такой путь не самый короткий]]
|}
Рассмотрим задачу нахождения кратчайшего пути от точки <tex> S </tex> до <tex> T </tex> с препятствиями. Для начала рассмотрим движение материальной точки, случай произвольного полигона будет [[Visibility graph и motion planning#Motion planning|позднее]]. Для нахождения можно построить [[Трапецоидная карта | трапецоидную карту]], соединить ребрами середины вертикальных сторон с центрами трапецоидов и в этом графе любым алгоритмом поиска кратчайших путей (например, алгоритмом [[Алгоритм Дейкстры|Дейкстры]] или [[Алгоритм A*|A*]]) найти путь от <tex> S </tex> до <tex> T </tex>. Но этот путь, очевидно, не будет кратчайшим.
Для нахождения пути можно построить [[Трапецоидная карта | трапецоидную карту]], соединить ребрами середины вертикальных сторон трапецоидов с их центрами и в этом графе любым алгоритмом поиска кратчайших путей (например, алгоритмом [[Алгоритм Дейкстры|Дейкстры]] или [[Алгоритм A*|A*]]) найти путь от <tex> S </tex> до <tex> T </tex>. Однако , этот путь не будет абсолютно кратчайшим.  Этот алгоритм поиска пути через трапецоидную карту обширно используется, так как трапецоидная карта дает хорошее приближение, строится работает за <tex> O(n \log n) </tex> и занимает <tex> O(n) </tex> линейное количество памяти, в то время как точные решения в лучшем случае работают за <tex> O(n^2) </tex> времени и требуют <tex> O(n^2) </tex> памяти (здесь и далее <tex> n </tex> {{---}} количество всех вершин). Теперь рассмотрим точное решение с помощью построения графа видимости. Для этого нам потребуется лемма:
{{Лемма
|about=О кратчайшем пути
|statement=
Любой кратчайший путь от <tex> S </tex> до <tex> T </tex> с полигональными препятствиями представляет собой ломаную, вершины которой {{---}} вершины полигонов.
|proof=
[[Файл:short.png|150px|thumb|right|Short cut]]
Пусть кратчайший путь {{---}} не ломаная. Тогда рассмотрим участок В таком случае, на путисуществует такая точка <tex> p </tex>, которая не принадлежит ни одному прямому отрезку. Это означает, где он что существует <tex>\epsilon</tex>-окрестность точки <tex> p </tex>, в которую не является прямымпопадает ни одно препятствие. По В таком случае, подпуть, который находится внутри <tex>\epsilon</tex>-окрестности, по неравенству треугольника в может быть сокращён по хорде, соединяющий точки пересечения границы <tex>\epsilon</tex>-окрестности этого участка мы сможем немного срезатьс путем. Значит этот Раз часть пути может быть уменьшена, значит и весь путь не кратчайшийможет быть уменьшен, а значит исходное предположение некорректно.}}{{Определение|definition ='''visibility graph''' {{---}} граф, вершины которого {{---}} вершины полигонов, а также <tex> S </tex> и <tex> T </tex>. ПротиворечиеМежду вершинами <tex> u </tex> и <tex> v </tex> существует ребро, значит лемма доказанаесли из <tex> u </tex> <i> видна </i>(mutually visible) <tex> v </tex>.
}}
Таким образом для нахождения точного решения определим visibility graph. Его вершины {{---}} вершины полигонов. Между вершинами <tex> u </tex> и <tex> v </tex> существует ребро, если из <tex> u </tex> <i> видна </i>(mutually visible) <tex> v </tex> (ребра полигонов тоже входят в этот граф). К множеству вершин графа нужно добавить <tex> S </tex> и <tex> T </tex>, а также ребра в видимые из них вершины полигонов. В получившемся графе опять же любым алгоритмом находим кратчайший путь. По лемме любое ребро кратчайшего пути {{---}} ребро visibility графа, так что мы нашли то, что нужно.
 
Чтобы уменьшить объем графа, из него можно удалить ребра, по которым точно не пройдет путь.
{{Лемма
|statement=
[[Файл:edgeToDelete.png|150px|thumb|right|Удаляем <tex> BD </tex>]]
Если существуют вершины <tex> A, B, C </tex> одного препятствия и вершина <tex> D </tex> такая, что поворот <tex> DBA </tex> не совпадает с поворотом <tex> DBC </tex>, то ребро <tex> DB </tex> не принадлежит кратчайшему пути и его можно удалитьиз графа. (См. поясняющую картинку справа)
|proof=
[[Файл:edgeNotToDelete.png|200px|thumb|right|Не удаляем <tex> BS </tex>]]
Путь проходящий через ребро <tex> BD </tex> будет длиннее, чем через соседей точки <tex> B </tex>, так как по неравенству треугольника <tex> AB + BD < AD </tex>
}}
 
По доказанным леммам любое ребро кратчайшего пути содержится в графе, таким образом для нахождения кратчайшего пути осталось найти кратчайший путь в этом графе от <tex> S </tex> до <tex> T </tex>.
 
=== Построение visibility графа ===
==== Наивный алгоритм. <tex> O(n ^ 3) </tex> ====
222
правки

Навигация