2009-09-12 2 views
2

Есть ли другой способ рассчитать кратчайший путь для близкого полного графика, кроме Dijkstra? У меня около 8000 узлов и около 18 миллионов ребер. Я прошел через нить "a to b on map" и решил использовать Дейкстра. Я написал свой скрипт в Perl, используя библиотеку Boost :: Graph. Но результат не тот, который я ожидал. Для вычисления одного кратчайшего пути понадобилось около 10 + минут, используя вызов $ graph-> dijkstra_shortest_path ($ start_node, $ end_node);Оптимизация Дейкстры для плотного графа?

Я понимаю, что есть много краев, и это может быть причиной медленного времени работы. Я мертв в воде? Есть ли другой способ ускорить это?

ответ

3

Короткий ответ: Дикстра - ваша лучшая ставка, если вы хотите только несколько кратчайших путей, а алгоритм Флойда-Варшалла лучше, если вы хотите найти кратчайшие пути между каждой парой узлов.

  • алгоритм Дейкстры находит кратчайшие пути от одного источника ко всем другим узлам в графе, для взвешенных графов. Он работает на плотных графах в O (V^2) времени.

  • Floyd-Warshall находит кратчайшие пути между всеми парами узлов. Он требует плотного представления и работает в O (V^3) времени. Он работает на взвешенных или невзвешенных графиках.

Даже если ваш график плотно (в соответствии с названием вашего вопроса), что может быть какая-то польза для преобразования его в разреженный граф и используя редкую реализацию Дейкстры, если вы просто хотите, чтобы найти несколько кратчайшие пути. Пробежчики Dijkstra работают в O (E log V).

Обратите внимание, что это означает, что все ваши весы отрисовки неотрицательны; если они есть, то вы не можете использовать ни одно из них. Вам придется использовать еще более медленный алгоритм, например, Bellman-Ford.

+0

1. Плотная матрица смежности. Они попарно точны, но не совсем образуют полный график. 2. Да, они имеют положительный вес. 3. Идеально все. Но в этот момент я буду рад принять случайные образцы или столько, сколько я могу получить. Из 3 вы упомянули, что Dijkstra соответствует моей проблеме, что лучше всего. Но производительность не поддерживает заявленное время работы. Я все еще теряюсь за то, что может быть узким местом. – 2009-09-12 04:16:43

+0

Если ваши веса могут быть сжаты до 8 или 16 бит с целым представлением, возможно, вы могли бы сэкономить некоторое пространство и, следовательно, время? – Greg

+0

Кроме того, если граф неориентирован, то вы можете уменьшить объем памяти наполовину, используя только верхний треугольник матрицы. Я сосредоточен на памяти здесь, потому что у вас могут быть проблемы с пропускной способностью данных. – Greg

0

Вы также можете попытаться дать A* algorithm a spin.

Этот подход особенно полезен, если у вас есть доступ к хорошей эвристике.

Смежные вопросы