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

More Related Content

More from it-people

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Coit-people
 
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghubit-people
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrainsit-people
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologiesit-people
 
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндексit-people
 
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...it-people
 
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalrit-people
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...it-people
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАНit-people
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банкit-people
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Coit-people
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...it-people
 
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologiesit-people
 
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn Systemit-people
 
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologiesit-people
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндексit-people
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...it-people
 
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognicianit-people
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...it-people
 

More from it-people (20)

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
 
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
 
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
 
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
 
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
 
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
 
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
 
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
 
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
 

"Знакомьтесь, М*" Муратшин Борис, 2ГИС

  • 1. М* Строим кратчайшие пути на большом графе, используя ограниченные ресурсы.
  • 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* работает с исходным графом, нет никаких препятствий к использованию временных ограничений, например, паромов, разводных мостов, данных о пробках …
  • 29. Источники [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21]