Алгоритм Беллмана-Форда: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Daryin (обсуждение | вклад) |
Daryin (обсуждение | вклад) |
||
Строка 47: | Строка 47: | ||
=== Информационный граф === | === Информационный граф === | ||
=== Описание ресурса параллелизма алгоритма === | === Описание ресурса параллелизма алгоритма === | ||
+ | |||
+ | При использовании атомарных операций для вычисления минимума релаксация рёбер может производится параллельно. В этом случае потребуется <math>O(n)</math> шагов при использовании <math>O(m)</math> процессоров. | ||
[[Алгоритм Δ-шагания]] может рассматриваться как параллельная версия алгоритма Беллмана-Форда. | [[Алгоритм Δ-шагания]] может рассматриваться как параллельная версия алгоритма Беллмана-Форда. |
Версия 17:16, 25 июня 2015
Содержание
- 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][2][3] предназначен для решения задачи поиска кратчайшего пути на графе. Для заданного ориентированного взвешенного графа алгоритм находит кратчайшие расстояния от выделенной вершины-источника до всех остальных вершин графа. Алгоритм Беллмана-Форда масштабируется хуже других алгоритмов решения указанной задачи (сложность O(mn) против O(m + n\ln n) у алгоритма Дейкстры), однако его отличительной особенностью является применимость к графам с произвольными, в том числе отрицательными, весами.
1.2 Математическое описание
Пусть задан граф G = (V, E) с весами рёбер f(e) и выделенной вершиной-источником u. Обозначим через d(v) кратчайшее расстояние от источника u до вершины v.
Алгоритм Беллмана-Форда ищет функцию d(v) как единственное решение уравнения
- d(v) = \min \{ d(w) + f(e) \mid e = (w, v) \in E \}, \quad \forall v \ne u,
с начальным условием d(u) = 0.
1.3 Вычислительное ядро алгоритма
Основной операцией алгоритма является релаксация ребра: если e = (w, v) \in E и d(v) \gt d(w) + f(e), то производится присваивание d(v) \leftarrow d(w) + f(e).
1.4 Макроструктура алгоритма
Алгоритм последовательно уточняет значения функции d(v).
- В самом начале производится присваивание d(u) = 0, d(v) = \infty, \forall v \ne u.
- Далее происходит n-1 итерация, в ходе каждой из которых производится релаксация всех рёбер графа.
1.5 Описание схемы реализации последовательного алгоритма
Последовательный алгоритм реализуется следующим псевдокодом:
Входные данные: граф с вершинами V, рёбрами E с весами f(e); вершина-источник u. Выходные данные: расстояния d(v) до каждой вершины v ∈ V от вершины u. for each v ∈ V do d(v) := ∞ d(u) = 0 for i from 1 to |V| - 1: for each e = (w, v) ∈ E: if d(v) > d(w) + f(e): d(v) := d(w) + f(e)
1.6 Последовательная сложность алгоритма
Алгоритм выполняет n-1 итерацию, на каждой из которых происходит релаксация m рёбер. Таким образом, общий объём работы составляет O(mn) операций.
Константа в оценке сложности может быть уменьшена за счёт использования следующих двух стандартных приёмов.
- Если на очередной итерации не произошло ни одной успешной релаксации, то алгоритм завершает работу.
- На очередной итерации рассматриваются не все рёбра, а только выходящие из вершин, для которых на прошлой итерации была выполнена успешная релаксация (на первой итерации – только рёбра, выходящие из источника).
1.7 Информационный граф
1.8 Описание ресурса параллелизма алгоритма
При использовании атомарных операций для вычисления минимума релаксация рёбер может производится параллельно. В этом случае потребуется O(n) шагов при использовании O(m) процессоров.
Алгоритм Δ-шагания может рассматриваться как параллельная версия алгоритма Беллмана-Форда.
1.9 Описание входных и выходных данных
1.10 Свойства алгоритма
Алгоритм может распознавать наличие отрицательных циклов в графе. Ребро e = (v, w) лежит на таком цикле, если вычисленные алгоритмом кратчайшие расстояния d(v) удовлетворяют условию
- d(v) + f(e) \lt d(w),
где f(e) – вес ребра e. Условие может быть проверено для всех рёбер графа за время O(m).
2 Программная реализация алгоритмов
2.1 Особенности реализации последовательного алгоритма
2.2 Описание локальности данных и вычислений
2.3 Возможные способы и особенности реализации параллельного алгоритма
2.4 Масштабируемость алгоритма и его реализации
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
- C++: Boost Graph Library (функция
bellman_ford_shortest
). - Python: NetworkX (функция
bellman_ford
). - Java: JGraphT (класс
BellmanFordShortestPath
).