2. ● Алгоритм поиска кратчайшего пути предложен в
1959г.
● Для разреженных графов сложность
O(n log(n) + m log(n)), где n - число вершин, m - ребер
● для графа с рёбрами одинаковой стоимости - просто
обход в ширину
● относится к неинформированным алгоритмам
Эдсгер Вибе
Дейкстра
1930 … 2002
3. ● Обобщение алг. Дейкстры
● Информированный алгоритм
● Стоимость точки периметра f(x) = g(x) + h(x),
где g(x) - пройденная часть пути,
h(x) - эвристическая оценка оставшейся части
● Сложность линейна для удачной эвристики,
экспоненциальна для неудачной
● Типично использование в эвристике
геометрического расстояния до цели
A*
1964 г. Нильс Нильсон
1967 г. Бертрам Рафаэль
1968 г. Питер Э. Харт
6. Двусторонний поиск
● для планарного графа просмотренная
часть графа ~вдвое меньше
● приходится поддерживать поиск в периметре
для обнаружения контакта
● поддержка односторонних дорог для обратной “волны”
● проблема утыкания А* в препятствие усугубляется
7. Иерархический подход. Использование иерархии дорог.
● хорошо спланированная дорожная сеть
имеет два уровня —
местные дороги и шоссе
● вводятся “шлюзы” (transit nodes)
● поиск распадается на —
“между шлюзами” и “до шлюзов”
8. Иерархический подход. Сепараторы.
● Основная идея — делим граф на части,
удаляя из него небольшое к-во рёбер — сепараторов
● Сепараторы и пред-вычисленные пути между ними
образуют иерархию
● Затратив немного времени и пространства на диске
для предварительного расчета, можно выполнять запросы
за O(sqrt(n)*log(n))
9. Иерархический подход. Grid based cепараторы.
● В целях масштабирования и простоты граф делится на
фрагменты решеткой или квадро—деревом
● Сепараторами назначаются ребра, пересекающие решетку
● Высокая эффективность, минимум ручного труда
Минусы
● Низкое качество иерархии
● Высокие затраты на иерархию
10. Иерархический подход.
Таблицы расстояний.
● На высших уровнях иерархии поиск не ведется
● Расстояния берутся из пред-вычисленных таблиц
● Когда маршрут определен, фрагменты дорог
восстанавливаются локальным поиском из точки в точку
11. Иерархический подход. Reach.
● Есть стадия обучения, когда строятся маршруты между
предопределенными точками
● Для каждого ребра, посещенного при этом, запоминается
минимальное расстояние до конца маршрута (reach)
● При “боевом” поиске маршрута мы стараемся избегать
ребер с маленьким reach
Минусы
● Для аморфной сети не работает
● Вопросы к качеству обучения, человеческий фактор
12. Целеустремленные алгоритмы. Arc-Flags.
● Граф делится на фрагменты.
● Проводится обучение.
● Для каждого ребра сохраняется факт,
что через него проходит кратчайший маршрут
в определенный фрагмент
13. Целеустремленные алгоритмы. ALT.
● ALT - эвристика для A*
● Из всех вершин выбирается небольшое
количество landmarks: λ.
● Изначально для каждой вершины рассчитывались
стоимости до каждого λ.
В дальнейшем вершины стали группировать.
● Для ребра (u,v) на пути к целевой вершине t
○ Для каждой λ имеем оценку оставшейся части пути:
dist(λ, t) − dist(λ, v) ≤ dist(v, t) и
dist(v, λ) − dist(t, λ) ≤ dist(v, t)
○ Минимум для всех λ и даст искомую оценку.
14. Вот “если бы губы Никанора Ивановича
да приставить к носу Ивана Кузьмича,
да взять сколь-нибудь развязности,
какая у Балтазара Балтазаровича,
да, пожалуй…” Н. В. Гоголь. Женитьба.
15. Для очень больших графов
● Неизбежно деление на фрагменты
● Фрагменты относятся к способу хранения а не часть алгоритма
● Минимизация периметра фрагментов
● Из-за разницы в населенности - требование самоподобия
● Наш выбор - квадродерево
17. 1) Карта населённости
● Раз уж мы работаем с OSM,
масштаб графа — вся планета
● Разобьем пространство сеткой в 1°
● При построении графа будем
растеризовать пути на этой сетке
18. 2) Предрасчет
● Карта - граф, где населенные
клеточки — вершины
● Населённые соседние клеточки - ребро,
из одной можно проехать в другую
● Запускаем “волну Дейкстры”,
запоминаем стоимость
достижения каждой вершины
● Получаем оценку стоимости пути
до финиша в любой достижимой точке.
19. Итак, для поиска:
● Мы храним только по биту на
квадратный градус поверхности
● Один раз запускаем волну по
битовой карте для финальной точки
● Для любой вершины в графе, зная её координаты,
мы за константное время получаем
оценку стоимости проезда до финиша.
20. Проблема №1: Слипаются проливы.
Решение: Запомним береговые точки и
запретим ходить из береговой точки в береговую.
21. Проблема №2:
● Береговая линия есть не везде
● Япония и др. целиком состоит из прибрежных клеток
● Гибралтар и Танжер оказались в одной клетке
● …
Решение:
разделительные линии.
22. Итого: в целом схема приемлема, но:
1. Она требует ручной работы
2. Ручной работы много
3. Надо быть очень осторожным,
если на одну клетку легло несколько
разделительных линий
23. План Б. Иерархия.
1. Пусть мы имеем вышестоящий уровень иерархию графа
2. Этот уровень достаточно груб для того,
чтобы поиск на любые расстояния в нем не представлял проблем
3. Строим путь в этом графе
24. План Б. Опорные точки
4. Нанесем на этот маршрут опорные точки, например,
через каждые 500 км, включая финиш, конечно
25. План Б. Эвристика
5. Для каждой опорной точки мы знаем остаток пути от неё до финиша.
Теперь эвристика остатка пути для A* будет состоять из двух частей:
a. геометрического расстояния до текущей опорной точки
b. остаток пути от текущей опорной точки до финиша
6. В начале поиска текущей назначается первая опорная точка.
Как только ма приближаемся к ней на геометрическое расстояние ближе чем 200 км
(условно, конечно), начинаем ориентироваться на следующую опорную точку. И так до
самого финиша.
27. Вот почему мы назвали алгоритм М*,
“М значит морковка”
28. Итого
● для обоих вариантов проверена их работоспособность на практике
● скорость работы A* примерно одинакова,
для указанного пути это 4.5 сек (рядовой десктоп)
с чтением и распаковкой данных,
0.5 сек - только проход волны на разогретом кэше
● количество дополнительно хранимой информации минимально -
0.2 % для второго варианта, для первого еще меньше.
● т.к. A* работает с исходным графом, нет никаких препятствий к
использованию временных ограничений, например,
паромов, разводных мостов, данных о пробках …