Я'м пишу курьерской/логистической моделирование на картах OpenStreetMap и поняли, что основной алгоритм поиска a*, как на фото ниже не будет достаточно быстро, на больших картах (как Большой Лондон).
Зеленые узлы соответствуют тем, что были введены в открыт набор/приоритетные очереди и из-за огромного числа (вся карта-это что-то вроде 1-2 миллиона), это занимает 5 секунд или около того, чтобы найти маршрут на фото. К сожалению, 100мс на маршрут О мой абсолютный предел.
В настоящее время узлы хранятся в оба списка смежности, а также пространственного 100х100 2Д массив.
Я'м ищу способы, где я могу разменять предобработки время, пространство и, при необходимости, оптимальности маршрута, для ускорения запросов. Прямолинейное формула Гаверсинуса для эвристики стоимость самых дорогих функцию по профилировщику - я оптимизировали свои основные на* столько, сколько я могу.
Например, если бы я выбрал произвольную вершину X из каждого квадранта 2Д массив и запустить между каждым, я могу хранить маршруты на диск для последующего моделирования. При запросе, я могу запустить искать только в квадрантах, чтобы получить маршрут между предварительно вычисленными и X.
Есть более изысканный вариант, что я'вэ, описанных выше, или, возможно, другой способ я должен преследовать. Большое спасибо!
Для справки, вот некоторые результаты тестов на произвольно весовой эвристики стоимость и вычислительной путь между 10 пар случайно выбранных узлов:
Weight // AvgDist% // Time (ms)
1 1 1461.2
1.05 1 1327.2
1.1 1 900.7
1.2 1.019658848 196.4
1.3 1.027619169 53.6
1.4 1.044714394 33.6
1.5 1.063963413 25.5
1.6 1.071694171 24.1
1.7 1.084093229 24.3
1.8 1.092208509 22
1.9 1.109188175 22.5
2 1.122856792 18.2
2.2 1.131574742 16.9
2.4 1.139104895 15.4
2.6 1.140021962 16
2.8 1.14088128 15.5
3 1.156303676 16
4 1.20256964 13
5 1.19610861 12.9
Удивительно увеличив коэффициент до 1,1 почти вдвое сократилось время выполнения в то время как сохраняя тот же маршрут.
Вы должны быть в состоянии сделать это гораздо быстрее по торговле от оптимальности. См. допустимость и оптимальность в Википедии.
Идея в том, чтобы использовать "Эпсилон" ценности, которые приведут к решению, не хуже, чем 1 + Эпсилон
раз оптимальный путь, но приведет к сокращению числа узлов, которые должны быть рассмотрены алгоритм. Обратите внимание, что это не означает, что возвращенное решение всегда будет 1 + Эпсилон
раз оптимальный путь. Это только в худшем случае. Я Дон'т знаю точно, как он будет себя вести на практике для вашей проблемы, но я думаю, что это стоит изучить.
Вы получаете ряд алгоритмов, которые полагаются на эту идею в Википедии. Я считаю, что это ваш лучший выбор, чтобы улучшить алгоритм, и что он имеет потенциал, чтобы работать в лимит времени, а еще платит добром пути.
Так как ваш алгоритм работает с миллионами узлов в 5 секунд, я предполагаю, что вы также использовать двоичные кучи для реализации, правильно? Если вы реализовали их вручную, убедитесь, что они реализуются как простые массивы и что они представляют собой двоичные кучи.
Есть специализированные алгоритмы для этой проблемы, что делать множество предварительных расчетов. Из памяти, предвычислении добавляет информацию в графической, что использует для того чтобы произвести более точный эвристический, чем расстояние прямой линии. Википедия дает названия ряда методов в http://en.wikipedia.org/wiki/Shortest_path_problem#Road_networks и говорит, что маркировка концентратора является лидером. Быстрый поиск по этим оказывается http://research.microsoft.com/pubs/142356/HL-TR.pdf. Старый, с помощью, в http://research.microsoft.com/pubs/64505/goldberg-sp-wea07.pdf.
Вам действительно нужно использовать гаверсинус? К обложке Лондон, я бы подумал, что вы могли бы предположить, плоскую землю и использовал Пифагор, или сохранить длину каждой ссылке в графе.
Там'ы действительно большая статья, что Microsoft исследовательских писал на эту тему:
http://research.microsoft.com/en-us/news/features/shortestpath-070709.aspx
Оригинал документа хранится здесь (PDF):
http://www.cc.gatech.edu/~Тэд/6601-gradAI-fall2012/02-поиск-Gutman04siam.формат PDF
По сути, там'ы несколько вещей, которые вы можете попробовать:
GraphHopper делает две вещи больше, чтобы получить быстрый, нет-эвристический и гибкая маршрутизация (примечание: Я'м автор и вы можете попробовать это онлайн здесь)
Так что это должно быть возможным, чтобы вы быстро маршрутах Большой Лондон.
Кроме того, режим по умолчанию-это скоростной режим, который делает все на порядок величины быстрее (например, 30 мс для общеевропейской стороны), но менее гибкий, так как он требует предварительной обработки (иерархий сжатие). Если вы Don'т, как это, просто отключить его, а также дальнейшая тонкая настройка включена улиц для автомобиля или, наверное, лучше создать новый профиль для грузовых автомобилей - например, исключить обслуживание улиц и дорожек, которые должны дать вам еще 30% прирост. И как с любой двунаправленный алгоритм можно легко реализовать параллельный поиск.
Я думаю, что это'квадрата "и стоит потренироваться ваша идея с". Более строго, Я'д называют его низким разрешением маршрут поиска.
Вы можете выбрать х взаимосвязанных узлов, которые достаточно близко, и относиться к ним как один с низким разрешением узел. Разделите весь свой график в такие группы, и вы получите низким разрешением графа. Это этап подготовки.
Для расчета маршрута от источника к мишени, сначала определить низкое-Res узлов они относятся, и найти с низким разрешением маршрут. Потом улучшить свой результат, находя путь с высоким разрешением графика, однако ограничения алгоритм только для узлов, которые относятся к авш низким разрешением узлы с низким разрешением маршрут (при желании вы можете также рассмотреть соседа с низким разрешением узлов до некоторой глубине).
Это может также быть обобщена в нескольких разрешениях, а не только высокая/низкая.
В конце вы должны получить маршрут, который достаточно близок к оптимальному. Это'с локально оптимальным, но может быть несколько хуже, чем оптимальное глобально определенной степени, которая зависит от разрешения перехода (т. е. в приближении, когда группа узлов определяется как один узел).
Есть множество* изменения, которые могут соответствовать всем требованиям. Вы должны думать хоть о случаях использования.
Там's нет способа для нас знать все детали, что вы и ваш работодатель в курсе. Таким образом, ваша первая остановка должна быть CiteSeer или ученый в Google: искать документы, которые рассматривают пути с той же генеральной совокупности ограничений как вы.
Затем downselect трех или четырех алгоритмов, сделать прототип, проверить, как они наращивать и управлять ими. Вы должны иметь в виду, что вы можете комбинировать различные алгоритмы, в том же гранд рутинную поиска пути в зависимости от расстояния между точками, оставшееся время, или любых других факторов.
Как уже было сказано, основана на малых масштабах вашей целевой зоной падения гаверсинус является, вероятно, вашим первым шагом, экономя драгоценное время на дорогие оценок тригонометрии. Примечание: Я не рекомендую использовать Евклидово расстояние в широта, координаты, долгота - перепроецировать карты в например, в поперечной проекции Меркатора недалеко от центра и использовать декартовы координаты в ярдах или метрах!
Препроцесса-второй, и изменение компиляторы может быть явный третья идея (переключение на C или C++ - см. https://benchmarksgame.alioth.debian.org/ для деталей).
Дополнительные шаги оптимизации может включать в себя избавление от динамического выделения памяти, и с помощью эффективной индексации для поиска среди узлов (думаю R-дерева и его производных/альтернатив).
Я работал в крупной пароходной компании, так что я могу с уверенностью сказать, что 100 мс должна вам маршрут из Лондона в Афины даже на встроенном устройстве. Большой Лондон будет тестовой карте для нас, как это's удобно небольшой (легко помещается в оперативной памяти - это вовсе'т действительно необходимо)
Во-первых,* это полностью устаревшая. Его основным преимуществом является то, что ее "технически" и не'т требуют предварительной обработки. На практике, необходимо предварительно обработать в любом случае OSM карты, так что'ы бессмысленно пользу.
Основной метод даст вам огромный прирост скорости флаги дуги. Если вы разделите на карте, скажем, 5х6 разделам можно выделить 1 бит в 32 бит целое число для каждого раздела. Теперь вы можете определить для каждого ребра будет ли это'ы всегда полезно, когда дома в разделе to {х,Г}
из другого раздела. Довольно часто, дороги являются двусторонними, а это значит только одно из двух направлений-это полезно. Так что одно из двух направлений имеет набор битов, а в другой он очищается. Это не может показаться, что реальную пользу, но это означает, что на многих перекрестках вам сократить количество вариантов для рассмотрения от 2 до 1, и это занимает всего один бит.
Обычно поставляется вместе с слишком большого потребления памяти, а не времени stuggles.
Однако я думаю, что это может быть полезно сначала только вычислительные узлы, которые являются частью "с улицы" Вы бы выбрали шоссе крошечный переулок обычно.
Я думаю, вы уже можете использовать эту функцию для вашего веса, но вы можете быть быстрее, если вы используете некоторые приоритетной очереди, чтобы определить, на какой узел следующий тест для дальнейшего путешествия.
Также вы можете попробовать снизить графику только узлы, которые являются частью низкими краями стоимости, а затем найти путь от начала/окончания до ближайшего из этих узлов. Поэтому у вас 2 пути от начала в "большую дорогу" и в "большую дорогу" до конца. Теперь вы можете вычислить оптимальный путь между двумя узлами, которые входят в "Улицы" в сокращенном графике.
Старый вопрос, но все же:
Попробуйте использовать разные кучи, что"в двоичной куче " и;. 'лучшей асимптотической сложности кучи' определенно Фибоначчи кучи и это'страницы Вики есть хороший обзор:
https://en.wikipedia.org/wiki/Fibonacci_heap#Summary_of_running_times
Обратите внимание, что двоичные кучи и проще код, и это'ы, реализуемых за массив и обход массива предсказуем, поэтому современный процессор выполняет операции двоичной кучи намного быстрее.
Однако, учитывая набор данных достаточно большой, другие кучи победит в двоичной куче, из-за их сложности...
Этот вопрос кажется достаточно большой набор данных.