Алгоритм Δ-шагания: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Общее описание алгоритма
 
Строка 8: Строка 8:
=== Макроструктура алгоритма ===
=== Макроструктура алгоритма ===
=== Описание схемы реализации последовательного алгоритма ===
=== Описание схемы реализации последовательного алгоритма ===
Псевдокод последовательного алгоритма:
'''Входные данные''':
  граф с вершинами ''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>''}
=== Последовательная сложность алгоритма ===
=== Последовательная сложность алгоритма ===



Версия от 14:44, 2 июня 2015

Свойства и структура алгоритмов

Общее описание алгоритма

Алгоритм дельта-шагания[1] предназначен для решения задачи поиска кратчайшего пути на графе. Для заданного ориентированного взвешенного графа с неотрицательными весами алгоритм находит кратчайшие расстояния от выделенной вершины-источника до всех остальных вершин графа. Алгоритм изначально проектировался с целью эффективной параллелизации.

Математическое описание

Вычислительное ядро алгоритма

Макроструктура алгоритма

Описание схемы реализации последовательного алгоритма

Псевдокод последовательного алгоритма:

Входные данные:
  граф с вершинами 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]

Описание входных и выходных данных

Свойства алгоритма

Программная реализация алгоритмов

Особенности реализации последовательного алгоритма

Описание локальности данных и вычислений

Возможные способы и особенности реализации параллельного алгоритма

Масштабируемость алгоритма и его реализации

Динамические характеристики и эффективность реализации алгоритма

Выводы для классов архитектур

Существующие реализации алгоритма

Литература

  1. ↑ 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.