Алгоритм Δ-шагания: различия между версиями
| [непроверенная версия] | [досмотренная версия] |
Daryin (обсуждение | вклад) Общее описание алгоритма |
ASA (обсуждение | вклад) Нет описания правки |
||
| (не показано 14 промежуточных версий 3 участников) | |||
| Строка 1: | Строка 1: | ||
== Свойства и структура | {{level-a}} | ||
== Свойства и структура алгоритма == | |||
=== Общее описание алгоритма === | === Общее описание алгоритма === | ||
Алгоритм дельта-шагания<ref>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.</ref> предназначен для решения [[Поиск кратчайшего пути от одной вершины (SSSP)|задачи поиска кратчайшего пути на графе]]. Для заданного ориентированного взвешенного графа с неотрицательными весами алгоритм находит кратчайшие расстояния от выделенной вершины-источника до всех остальных вершин графа. Алгоритм изначально проектировался с целью эффективной параллелизации. | '''Алгоритм дельта-шагания'''<ref>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.</ref> (англ. Δ-Stepping) предназначен для решения [[Поиск кратчайшего пути от одной вершины (SSSP)|задачи поиска кратчайшего пути на графе]]. Для заданного ориентированного взвешенного графа с неотрицательными весами алгоритм находит кратчайшие расстояния от выделенной вершины-источника до всех остальных вершин графа. Алгоритм изначально проектировался с целью эффективной параллелизации. | ||
=== Математическое описание === | === Математическое описание алгоритма === | ||
=== Вычислительное ядро алгоритма === | === Вычислительное ядро алгоритма === | ||
=== Макроструктура алгоритма === | === Макроструктура алгоритма === | ||
=== | === Схема реализации последовательного алгоритма === | ||
Псевдокод последовательного алгоритма: | |||
'''Входные данные''': | |||
граф с вершинами ''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<nowiki>'</nowiki>'', ''E<nowiki>'</nowiki>''): | |||
'''return''' { (''w'', ''d''(''w'') + ''W''(''v'', ''w'')) | ''v'' ∈ ''V<nowiki>'</nowiki>'' and (''v'', ''w'') ∈ ''E<nowiki>'</nowiki>''} | |||
=== Последовательная сложность алгоритма === | === Последовательная сложность алгоритма === | ||
| Строка 13: | Строка 51: | ||
=== Информационный граф === | === Информационный граф === | ||
=== | === Ресурс параллелизма алгоритма === | ||
Средняя время работы параллельного алгоритма на графах со случайными весами на <math>O(n)</math> процессорах составляет <math>O((dL + \ln n) \ln n)</math> со средней работой <math>O(n + m + dL \ln n)</math> | Средняя время работы параллельного алгоритма на графах со случайными весами на <math>O(n)</math> процессорах составляет <math>O((dL + \ln n) \ln n)</math> со средней работой <math>O(n + m + dL \ln n)</math> | ||
=== | === Входные и выходные данные алгоритма === | ||
'''Входные данные''': взвешенный граф <math>(V, E, W)</math> (<math>n</math> вершин <math>v_i</math> и <math>m</math> рёбер <math>e_j = (v^{(1)}_{j}, v^{(2)}_{j})</math> с весами <math>f_j</math>), вершина-источник <math>u</math>. | |||
'''Объём входных данных''': <math>O(m + n)</math>. | |||
'''Выходные данные''' (возможные варианты): | |||
# для каждой вершины <math>v</math> исходного графа – последнее ребро <math>e^*_v = (w, v)</math>, лежащее на кратчайшем пути от вершины <math>u</math> к <math>v</math>, или соответствующая вершина <math>w</math>; | |||
# для каждой вершины <math>v</math> исходного графа – суммарный вес <math>f^*(v)</math> кратчайшего пути от от вершины <math>u</math> к <math>v</math>. | |||
'''Объём выходных данных''': <math>O(n)</math>. | |||
=== Свойства алгоритма=== | === Свойства алгоритма=== | ||
== Программная реализация | |||
Предельные случаи алгоритма Δ-шагания: | |||
* при <math>\Delta \to 0</math>: [[алгоритм Дейкстры]]; | |||
* при <math>\Delta \to \infty</math>: [[алгоритм Беллмана-Форда]]. | |||
== Программная реализация алгоритма == | |||
=== Особенности реализации последовательного алгоритма === | === Особенности реализации последовательного алгоритма === | ||
=== Возможные способы и особенности параллельной реализации алгоритма === | |||
=== Возможные способы и особенности реализации | === Результаты прогонов === | ||
=== | |||
=== Выводы для классов архитектур === | === Выводы для классов архитектур === | ||
== Литература == | == Литература == | ||
<references /> | <references /> | ||
[[Категория:Начатые статьи]] | |||
[[en:Δ-stepping algorithm]] | |||
Текущая версия от 07:22, 5 июля 2022
Свойства и структура алгоритма
Общее описание алгоритма
Алгоритм дельта-шагания[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]
Входные и выходные данные алгоритма
Входные данные: взвешенный граф [math]\displaystyle{ (V, E, W) }[/math] ([math]\displaystyle{ n }[/math] вершин [math]\displaystyle{ v_i }[/math] и [math]\displaystyle{ m }[/math] рёбер [math]\displaystyle{ e_j = (v^{(1)}_{j}, v^{(2)}_{j}) }[/math] с весами [math]\displaystyle{ f_j }[/math]), вершина-источник [math]\displaystyle{ u }[/math].
Объём входных данных: [math]\displaystyle{ O(m + n) }[/math].
Выходные данные (возможные варианты):
- для каждой вершины [math]\displaystyle{ v }[/math] исходного графа – последнее ребро [math]\displaystyle{ e^*_v = (w, v) }[/math], лежащее на кратчайшем пути от вершины [math]\displaystyle{ u }[/math] к [math]\displaystyle{ v }[/math], или соответствующая вершина [math]\displaystyle{ w }[/math];
- для каждой вершины [math]\displaystyle{ v }[/math] исходного графа – суммарный вес [math]\displaystyle{ f^*(v) }[/math] кратчайшего пути от от вершины [math]\displaystyle{ u }[/math] к [math]\displaystyle{ v }[/math].
Объём выходных данных: [math]\displaystyle{ O(n) }[/math].
Свойства алгоритма
Предельные случаи алгоритма Δ-шагания:
- при [math]\displaystyle{ \Delta \to 0 }[/math]: алгоритм Дейкстры;
- при [math]\displaystyle{ \Delta \to \infty }[/math]: алгоритм Беллмана-Форда.
Программная реализация алгоритма
Особенности реализации последовательного алгоритма
Возможные способы и особенности параллельной реализации алгоритма
Результаты прогонов
Выводы для классов архитектур
Литература
- ↑ 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.