Параллельный алгоритм кратчайшего пути с одним источником - Parallel single-source shortest path algorithm
Центральная проблема алгоритмической теория графов это проблема кратчайшего пути. Одно из обобщений задачи поиска кратчайшего пути известно как кратчайшие пути из одного источника (SSSP) задача, заключающаяся в нахождении кратчайшего пути между каждой парой вершин графа. Есть классические последовательные алгоритмы которые решают эту проблему, например Алгоритм Дейкстры. Однако в этой статье мы представляем два параллельные алгоритмы решение этой проблемы.
Другой вариант проблемы - это проблема кратчайших путей всех пар (APSP), которая также имеет параллельные подходы: Параллельный алгоритм кратчайшего пути для всех пар.
Определение проблемы
Позволять ориентированный граф с узлы и края. Позволять быть выделенной вершиной (называемой «источником») и - функция, назначающая неотрицательный вещественный вес каждому ребру. Задача задачи поиска кратчайших путей с одним источником - вычислить для каждой вершины достижимый из , вес пути минимального веса из к , обозначаемый и сокращенно . Вес пути - это сумма весов его ребер. Мы установили если недоступен из .[1]
Последовательные алгоритмы кратчайшего пути обычно применяют итеративные методы маркировки, основанные на поддержании ориентировочного расстояния для всех узлов; всегда или вес некоторого пути от к и, следовательно, верхняя оценка . Ориентировочные расстояния улучшаются за счет релаксации кромок, т. Е. Для кромки алгоритм устанавливает .[1]
Для всех параллельных алгоритмов мы будем предполагать PRAM модель с одновременным чтением и одновременной записью.
Алгоритм дельта-шага
Алгоритм дельта-шага - это алгоритм коррекции меток, что означает, что предварительное расстояние до вершины может корректироваться несколько раз с помощью релаксации краев до последнего шага алгоритма, когда все ориентировочные расстояния фиксированы.
Алгоритм поддерживает подходящие узлы с примерными расстояниями в массиве сегментов, каждый из которых представляет диапазон расстояний размера. . На каждом этапе алгоритм удаляет все узлы первого непустого ведра и ослабляет все исходящие ребра веса не более чем . Ребра с более высоким весом расслабляются только после того, как их соответствующие начальные узлы надежно установлены.[1] Параметр является положительным вещественным числом, которое также называется «шириной шага» или «шириной ковша».[1]
Параллелизм достигается за счет одновременного удаления всех узлов первого непустого ведра и ослабления их исходящих светлых краев в одной фазе. Если узел был удален из текущей корзины с неокончательным значением расстояния, тогда в какой-то последующей фазе в конечном итоге будет повторно вставлен в , а исходящие светлые края будет повторно расслаблен. Оставшиеся тяжелые ребра, исходящие от всех узлов, которые были удалены из до сих пор расслаблены раз и навсегда, когда наконец остается пустым. Затем алгоритм ищет следующую непустую корзину и действует, как описано выше.[1]
Максимальный вес кратчайшего пути для исходного узла определяется как , сокращенно .[1] Кроме того, размер пути определяется как количество ребер на пути.
Мы отличаем светлые края от тяжелых, где светлые края имеют максимальный вес. и тяжелые кромки имеют вес больше, чем .
Ниже приводится алгоритм дельта-шага в псевдокоде:
1 для каждого делать 2 ; (* Вставить исходный узел с расстоянием 0 *) 3 пока делать (* Фаза: осталось несколько узлов в очереди (a) *) 4 | (* Наименьшее непустое ведро (b) *) 5 | (* Узлы для сегмента B [i] еще не удалены *) 6 | пока делать (* Новая фаза (c) *) 7 | | (* Создание запросов для светлых краев (d) *) 8 | | (* Запомнить удаленные узлы (e) *) 9 | | (* Текущее ведро пусто *) 10 | | (* Делайте расслабления, узлы могут (повторно) войти в B [i] (f) *) 11 | (* Создать запросы на толстые края (g) *) 12 | (* Расслабления не пополнят B [i] (h) *) 1314 Функция : набор Request15 вернуть 1617 Процедура 18 для каждого делать 1920 Процедура (* Вставьте или переместите w в B, если x < operatorname {tent} (w) *) 21 если тогда22 | (* Если в, удалить из старого ведра *) 23 | (* Вставить в новое ведро *) 24 |
пример
Ниже приводится пошаговое описание выполнения алгоритма для небольшого примера графа. Исходной вершиной является вершина A и равно 3.
В начале алгоритма все вершины, кроме исходной вершины A, имеют бесконечные ориентировочные расстояния.
Ведро имеет диапазон , ведро имеет диапазон и ведро имеет диапазон .
Ведро содержит вершину A. Все остальные корзины пусты.
Узел | А | B | C | D | E | F | г |
---|---|---|---|---|---|---|---|
Ориентировочное расстояние | 0 |
Алгоритм ослабляет все световые грани, падающие на , которые являются ребрами, соединяющими A с B, G и E.
Вершины B, G и E вставляются в ведро . С все еще пусто, тяжелая кромка, соединяющая A и D, также ослаблена.
Узел | А | B | C | D | E | F | г |
---|---|---|---|---|---|---|---|
Ориентировочное расстояние | 0 | 3 | 5 | 3 | 3 |
Теперь светлые края, падающие на расслаблены. Вершина C вставлена в ведро . С этого момента пусто, тяжелый край, соединяющий E с F, можно расслабить.
Узел | А | B | C | D | E | F | г |
---|---|---|---|---|---|---|---|
Ориентировочное расстояние | 0 | 3 | 6 | 5 | 3 | 8 | 3 |
На следующем этапе ведро проверяется, но не приводит к каким-либо изменениям ориентировочных расстояний.
Алгоритм завершается.
Время выполнения
Как упоминалось ранее, - максимальный вес кратчайшего пути.
Назовем путь с общим весом не более и без краевых повторов а -дорожка.
Позволять обозначают множество всех пар узлов связаны некоторыми -дорожка и разреши . Аналогичным образом определим как набор троек такой, что и это легкий край и пусть .
Алгоритм последовательного дельта-шага требует не более операции. Простое распараллеливание выполняется во времени .[1]
Если мы возьмем для графиков с максимальной степенью и случайные веса ребер, равномерно распределенные в , для последовательной версии алгоритма требуется общее среднее время и простое распараллеливание занимает в среднем .[1]
График 500
Третье вычислительное ядро График 500 В тесте выполняется вычисление кратчайшего пути из одного источника.[2] В эталонной реализации теста Graph 500 для этого вычисления используется алгоритм дельта-шага.
Алгоритм изменения радиуса
Для алгоритма шагового радиуса мы должны предположить, что наш график неориентированный.
Входными данными для алгоритма являются взвешенный неориентированный граф, исходная вершина и значение целевого радиуса для каждой вершины, заданные как функция .[3] Алгоритм посещает вершины на увеличивающемся расстоянии от источника . На каждом шагу , Radius-Stepping увеличивает радиус с центром в из к , и устанавливает все вершины в кольцевом пространстве .[3]
Ниже приводится алгоритм изменения радиуса в псевдокоде:
Вход: График , радиусы вершин , и исходный узел . Вывод: Расстояния на графике из . 1 , 2 для каждого делать , , 3 пока делать 4 | 5 | повторение 6 | | для каждого s.t делать 7 | | | для каждого делать 8 | | | | 9 | до тех пор нет был обновлен 10 | 11 | 12 вернуть
Для всех , определять быть набор соседей С. При исполнении стандарта поиск в ширину или Алгоритм Дейкстры, то граница - набор соседей всех посещенных вершин.[3]
В алгоритме Radius-Stepping новое круглое расстояние решается в каждом раунде с целью ограничения количества подшагов. Алгоритм принимает радиус для каждой вершины и выбирает на шаге взяв минимум в общем и целом на границе (строка 4).
Строки 5-9 затем запускают Беллман-Форд подшаги до тех пор, пока все вершины с радиусом меньше чем улажены. Вершины внутри затем добавляются в посещенный набор .[3]
пример
Ниже приводится пошаговое описание выполнения алгоритма для небольшого примера графа. Исходная вершина - это вершина A, а радиус каждой вершины равен 1.
В начале алгоритма все вершины, кроме исходной вершины A, имеют бесконечные ориентировочные расстояния, обозначенные в псевдокоде.
Все соседи A расслаблены и .
Узел | А | B | C | D | E | F | г |
---|---|---|---|---|---|---|---|
Ориентировочное расстояние | 0 | 3 | 5 | 3 | 3 |
Переменная выбирается равным 4, а соседи вершин B, E и G расслаблены.
Узел | А | B | C | D | E | F | г |
---|---|---|---|---|---|---|---|
Ориентировочное расстояние | 0 | 3 | 6 | 5 | 3 | 8 | 3 |
Переменная выбрано равным 6, и значения не меняются. .
Переменная выбрано равным 9, и значения не меняются. .
Алгоритм завершается.
Время выполнения
После фазы предварительной обработки алгоритм ступенчатого изменения радиуса может решить проблему SSSP в работа и глубина, для . Кроме того, этап предварительной обработки занимает работа и глубина, или работа и глубина.[3]
Рекомендации
- ^ а б c d е ж грамм час Meyer, U .; Сандерс, П. (2003-10-01). «Δ-степпинг: распараллеливаемый алгоритм кратчайшего пути». Журнал алгоритмов. Европейский симпозиум по алгоритмам 1998 г. 49 (1): 114–152. Дои:10.1016 / S0196-6774 (03) 00076-2. ISSN 0196-6774.
- ^ «График 500».
- ^ а б c d е Blelloch, Guy E .; Гу, Ян; Сунь, Ихан; Танвонгсан, Канат (2016). «Параллельные кратчайшие пути с использованием шага по радиусу». Материалы 28-го симпозиума ACM по параллелизму в алгоритмах и архитектурах - SPAA '16. Нью-Йорк, Нью-Йорк, США: ACM Press: 443–454. Дои:10.1145/2935764.2935765. ISBN 978-1-4503-4210-0.