Алгоритм Δ-шагания: различия между версиями
| [непроверенная версия] | [непроверенная версия] |
Daryin (обсуждение | вклад) |
Daryin (обсуждение | вклад) |
||
| Строка 64: | Строка 64: | ||
=== Выводы для классов архитектур === | === Выводы для классов архитектур === | ||
=== Существующие реализации алгоритма === | === Существующие реализации алгоритма === | ||
* C++, MPI: [http://www.boost.org/libs/graph_parallel/doc/html/index.html Parallel Boost Graph Library] (функция <code>[http://www.boost.org/libs/graph_parallel/doc/html/dijkstra_shortest_paths.html#delta-stepping-algorithm delta_stepping_shortest_paths]</code>). | |||
== Литература == | == Литература == | ||
<references /> | <references /> | ||
Версия от 16:27, 11 июня 2015
Свойства и структура алгоритмов
Общее описание алгоритма
Алгоритм дельта-шагания[1] (англ. Δ-Stepping) предназначен для решения задачи поиска кратчайшего пути на графе. Для заданного ориентированного взвешенного графа с неотрицательными весами алгоритм находит кратчайшие расстояния от выделенной вершины-источника до всех остальных вершин графа. Алгоритм изначально проектировался с целью эффективной параллелизации.
Математическое описание
Вычислительное ядро алгоритма
Макроструктура алгоритма
Описание схемы реализации последовательного алгоритма
Псевдокод последовательного алгоритма:
Входные данные:
граф с вершинами V, рёбрами E с весами W;
вершина-источник u;
параметр Δ > 0.
Выходные данные: расстояния d(v) до каждой вершины v ∈ V от вершины u.
procedure DeltaStepping(V, E, W, u, Δ):
LightEdges := { e ∈ E | W(e) ≤ Δ }
HeavyEdges := { e ∈ E | W(e) > Δ }
for each v ∈ V do d(v) := ∞
Relax(u, 0)
while any({ Buckets(i) ≠ ∅ }):
Bucket := first({ Buckets(i) ≠ ∅ })
Deleted := ∅
while Bucket ≠ ∅:
Requests := FindRequests(Bucket, LightEdges)
Deleted := Deleted ∪ Bucket
Bucket := ∅
RelaxAll(Requests)
RelaxAll(FindRequests(Deleted, HeavyEdges))
procedure Relax(v, x):
if x < d(v):
OldBucket := B(⌊d(v) / Δ⌋)
NewBucket := B(⌊x / Δ⌋)
OldBucket := OldBucket \ {v}
NewBucket := NewBucket ∪ {v}
d(v) := x
procedure RelaxAll(R):
for each (v, x) ∈ R do Relax(v, x)
function FindRequests(V', E'):
return { (w, d(w) + W(v, w)) | v ∈ V' and (v, w) ∈ E'}
Последовательная сложность алгоритма
Средняя последовательная сложность алгоритма на графах со случайными весами [math]\displaystyle{ O(n + m + dL) }[/math], где [math]\displaystyle{ L }[/math] – максимальный суммарный вес кратчайшего пути, [math]\displaystyle{ d }[/math] – максимальная длина кратчайшего пути.
Информационный граф
Описание ресурса параллелизма алгоритма
Средняя время работы параллельного алгоритма на графах со случайными весами на [math]\displaystyle{ O(n) }[/math] процессорах составляет [math]\displaystyle{ O((dL + \ln n) \ln n) }[/math] со средней работой [math]\displaystyle{ O(n + m + dL \ln n) }[/math]
Описание входных и выходных данных
Свойства алгоритма
Программная реализация алгоритмов
Особенности реализации последовательного алгоритма
Описание локальности данных и вычислений
Возможные способы и особенности реализации параллельного алгоритма
Масштабируемость алгоритма и его реализации
Динамические характеристики и эффективность реализации алгоритма
Выводы для классов архитектур
Существующие реализации алгоритма
- C++, MPI: Parallel Boost Graph Library (функция
delta_stepping_shortest_paths).
Литература
- ↑ Meyer, U, and P Sanders. “Δ-Stepping: a Parallelizable Shortest Path Algorithm.” Journal of Algorithms 49, no. 1 (October 2003): 114–52. doi:10.1016/S0196-6774(03)00076-2.