Алгоритм Δ-шагания
Содержание
- 1 Свойства и структура алгоритмов
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Описание схемы реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Описание ресурса параллелизма алгоритма
- 1.9 Описание входных и выходных данных
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритмов
- 2.1 Особенности реализации последовательного алгоритма
- 2.2 Описание локальности данных и вычислений
- 2.3 Возможные способы и особенности реализации параллельного алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Алгоритм дельта-шагания[1] (англ. Δ-Stepping) предназначен для решения задачи поиска кратчайшего пути на графе. Для заданного ориентированного взвешенного графа с неотрицательными весами алгоритм находит кратчайшие расстояния от выделенной вершины-источника до всех остальных вершин графа. Алгоритм изначально проектировался с целью эффективной параллелизации.
1.2 Математическое описание
1.3 Вычислительное ядро алгоритма
1.4 Макроструктура алгоритма
1.5 Описание схемы реализации последовательного алгоритма
Псевдокод последовательного алгоритма:
Входные данные: граф с вершинами 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'}
1.6 Последовательная сложность алгоритма
Средняя последовательная сложность алгоритма на графах со случайными весами [math]O(n + m + dL)[/math], где [math]L[/math] – максимальный суммарный вес кратчайшего пути, [math]d[/math] – максимальная длина кратчайшего пути.
1.7 Информационный граф
1.8 Описание ресурса параллелизма алгоритма
Средняя время работы параллельного алгоритма на графах со случайными весами на [math]O(n)[/math] процессорах составляет [math]O((dL + \ln n) \ln n)[/math] со средней работой [math]O(n + m + dL \ln n)[/math]
1.9 Описание входных и выходных данных
1.10 Свойства алгоритма
Предельные случаи алгоритма Δ-шагания:
- при [math]\Delta \to 0[/math]: алгоритм Дейкстры;
- при [math]\Delta \to \infty[/math]: алгоритм Беллмана-Форда.
2 Программная реализация алгоритмов
2.1 Особенности реализации последовательного алгоритма
2.2 Описание локальности данных и вычислений
2.3 Возможные способы и особенности реализации параллельного алгоритма
2.4 Масштабируемость алгоритма и его реализации
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
- C++, MPI: Parallel Boost Graph Library (функция
delta_stepping_shortest_paths
).
3 Литература
- ↑ 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.