Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Parallel BGL Dijkstra's Single-Source Shortest Paths

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Parallel BGL Dijkstra's Single-Source Shortest Paths

// named parameter version
template <typename Graph, typename P, typename T, typename R>
void
dijkstra_shortest_paths(Graph& g,
  typename graph_traits<Graph>::vertex_descriptor s,
  const bgl_named_params<P, T, R>& params);
// non-named parameter version
template <typename Graph, typename DijkstraVisitor,
          typename PredecessorMap, typename DistanceMap,
          typename WeightMap, typename VertexIndexMap, typename CompareFunction, typename CombineFunction,
          typename DistInf, typename DistZero>
void dijkstra_shortest_paths
  (const Graph& g,
   typename graph_traits<Graph>::vertex_descriptor s,
   PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
   VertexIndexMap index_map,
   CompareFunction compare, CombineFunction combine, DistInf inf, DistZero zero,
   DijkstraVisitor vis);

dijkstra_shortest_paths() Функциярешает проблему кратчайших путей на взвешенном, ненаправленном или направленном распределенном графе. Существует две реализации распределенного алгоритма Dijkstra, которые предлагают различные компромиссы производительности. Оба доступны черезdijkstra_shortest_paths().(для совместимости с последовательными программами BGL). Распределенные алгоритмы Dijkstra очень похожи на их последовательные аналоги. Здесь выделены только различия; пожалуйста, обратитесь кпоследовательной реализации Dijkstraдля получения дополнительной информации. Наиболее эффективной реализацией для большинства случаев является алгоритмDelta-Stepping.Однако можно использовать и более консервативные методы.Алгоритм Краузера и др.или симметричныйАлгоритм Эйгера Дейкстра.

Where Defined

<boost/graph/dijkstra_shortest_paths.hpp>

Parameters

Все параметрыпоследовательной реализации Dijkstraподдерживаются и имеют по существу одинаковое значение. Распределенные реализации Dijkstra вводят новый параметр, который позволяет выбратьалгоритм Eager Dijkstraи контролировать объем выполняемой работы. Здесь документируются только различия и новые параметры.

IN: Graph& g
The graph type must be a model of Distributed Graph.
IN: vertex_descriptor s
The start vertex must be the same in every process.
OUT: predecessor_map(PredecessorMap p_map)

The predecessor map must be a Distributed Property Map or dummy_property_map, although only the local portions of the map will be written.

Default: dummy_property_map

UTIL/OUT: distance_map(DistanceMap d_map)
The distance map must be either a Distributed Property Map or dummy_property_map. It will be given the vertex_distance role.
IN: visitor(DijkstraVisitor vis)
The visitor must be a distributed Dijkstra visitor. The suble differences between sequential and distributed Dijkstra visitors are discussed in the section Visitor Event Points.
UTIL/OUT: color_map(ColorMap color)
The color map must be a Distributed Property Map with the same process group as the graph g whose colors must monotonically darken (white -> gray -> black). The default value is a distributed iterator_property_map created from a std::vector of default_color_type.

В:lookahead (distance_typelook)

При подаче этого параметра реализация будет использовать алгоритмEager Dijkstraс заданным значением lookahead. Lookahead позволяет распределённому алгоритму Дейкстры спекулятивно обрабатывать вершины, кратчайшее расстояние от источника которых, возможно, ещё не было найдено. Когда найденное расстояние является самым коротким расстоянием, параллелизм улучшается, и алгоритм может закончиться быстрее. Однако, если расстояние не является самым коротким расстоянием, вершину нужно будет переработать позже, что приведет к большей работе.

Типрасстояние_типявляется типом значенияДистанционная картакарта свойств. Это неотрицательное значение, определяющее, насколько далеко алгоритм Дейкстры может обрабатывать значения.

Дефолт:никакой ценности (не используется лукахед; использует). Алгоритм Crauser et al..

Visitor Event Points

КонцепцияDijkstra Visitorопределяет 7 точек событий, которые будут вызваны последовательной реализациейDijkstra. Распределенная Дейкстра сохраняет эти точки событий, но последовательность событий и процесс, в котором происходит каждое событие, будут меняться в зависимости от распределения графа, смотрящего и краевого веса.

initialize_vertex(s, g)
This will be invoked by every process for each local vertex.
discover_vertex(u, g)
This will be invoked each type a process discovers a new vertex u. Due to incomplete information in distributed property maps, this event may be triggered many times for the same vertex u.
examine_vertex(u, g)
This will be invoked by the process owning the vertex u. This event may be invoked multiple times for the same vertex when the graph contains negative edges or lookahead is employed.
examine_edge(e, g)
This will be invoked by the process owning the source vertex of e. As with examine_vertex, this event may be invoked multiple times for the same edge.
edge_relaxed(e, g)
Similar to examine_edge, this will be invoked by the process owning the source vertex and may be invoked multiple times (even without lookahead or negative edges).
edge_not_relaxed(e, g)
Similar to edge_relaxed. Some edge_not_relaxed events that would be triggered by sequential Dijkstra's will become edge_relaxed events in distributed Dijkstra's algorithm.
finish_vertex(e, g)
See documentation for examine_vertex. Note that a "finished" vertex is not necessarily finished if lookahead is permitted or negative edges exist in the graph.

Crauser et al.'s algorithm

namespace graph {
  template<typename DistributedGraph, typename DijkstraVisitor,
           typename PredecessorMap, typename DistanceMap, typename WeightMap,
           typename IndexMap, typename ColorMap, typename Compare,
           typename Combine, typename DistInf, typename DistZero>
  void
  crauser_et_al_shortest_paths
    (const DistributedGraph& g,
     typename graph_traits<DistributedGraph>::vertex_descriptor s,
     PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
     IndexMap index_map, ColorMap color_map,
     Compare compare, Combine combine, DistInf inf, DistZero zero,
     DijkstraVisitor vis);
  template<typename DistributedGraph, typename DijkstraVisitor,
           typename PredecessorMap, typename DistanceMap, typename WeightMap>
  void
  crauser_et_al_shortest_paths
    (const DistributedGraph& g,
     typename graph_traits<DistributedGraph>::vertex_descriptor s,
     PredecessorMap predecessor, DistanceMap distance, WeightMap weight);
  template<typename DistributedGraph, typename DijkstraVisitor,
           typename PredecessorMap, typename DistanceMap>
  void
  crauser_et_al_shortest_paths
    (const DistributedGraph& g,
     typename graph_traits<DistributedGraph>::vertex_descriptor s,
     PredecessorMap predecessor, DistanceMap distance);
}

Формулировка алгоритма Дейкстры Краузером, Мелхорном, Мейером и Сандерсом[CMMS98a]улучшает масштабируемость параллельного алгоритма Дейкстры, увеличивая количество вершин, которые могут быть обработаны на данном супершаге. Этот алгоритм хорошо адаптируется к различным типам графов и представляет собой простой алгоритм для использования, не требующий дополнительного ввода пользователя для достижения разумной производительности. Недостатком этого алгоритма является то, что реализация требуется для управления тремя приоритетными очередями, что создает большой объем работы на каждом узле.

Этот алгоритм используется по умолчанию в распределенныхdijkstra_shortest_paths().

Where Defined

<boost/graph/distributed/crauser_et_al_shortest_paths.hpp>

Complexity

Этот алгоритм выполняетO(V log V)работу вd + 1супершагов BSP, гдеdв лучшем случаеO(V), но, как правило, намного меньше. На направленных графах Эрдоса-Реньи с краевыми весами в [0, 1] ожидаемое число супершаговdсоставляетO(n^(1/3)]с высокой вероятностью.

Performance

Следующие диаграммы иллюстрируют производительность параллельной реализации BGL алгоритма Crauser et al. на графиках с краевыми весами, равномерно выбранными из диапазона. [0, 1].

chart_php_cluster_Odin_generator_ER_SF_SW_dataset_TimeSparse_columns_4.png chart_php_cluster_Odin_generator_ER_SF_SW_dataset_TimeSparse_columns_4_speedup_1.png chart_php_cluster_Odin_generator_ER_SF_SW_dataset_TimeDense_columns_4.png chart_php_cluster_Odin_generator_ER_SF_SW_dataset_TimeDense_columns_4_speedup_1.png

Eager Dijkstra's algorithm

namespace graph {
  template<typename DistributedGraph, typename DijkstraVisitor,
           typename PredecessorMap, typename DistanceMap, typename WeightMap,
           typename IndexMap, typename ColorMap, typename Compare,
           typename Combine, typename DistInf, typename DistZero>
  void
  eager_dijkstra_shortest_paths
    (const DistributedGraph& g,
     typename graph_traits<DistributedGraph>::vertex_descriptor s,
     PredecessorMap predecessor, DistanceMap distance,
     typename property_traits<DistanceMap>::value_type lookahead,
     WeightMap weight, IndexMap index_map, ColorMap color_map,
     Compare compare, Combine combine, DistInf inf, DistZero zero,
     DijkstraVisitor vis);
  template<typename DistributedGraph, typename DijkstraVisitor,
           typename PredecessorMap, typename DistanceMap, typename WeightMap>
  void
  eager_dijkstra_shortest_paths
    (const DistributedGraph& g,
     typename graph_traits<DistributedGraph>::vertex_descriptor s,
     PredecessorMap predecessor, DistanceMap distance,
     typename property_traits<DistanceMap>::value_type lookahead,
     WeightMap weight);
  template<typename DistributedGraph, typename DijkstraVisitor,
           typename PredecessorMap, typename DistanceMap>
  void
  eager_dijkstra_shortest_paths
    (const DistributedGraph& g,
     typename graph_traits<DistributedGraph>::vertex_descriptor s,
     PredecessorMap predecessor, DistanceMap distance,
     typename property_traits<DistanceMap>::value_type lookahead);
}

На каждом супершаге параллельный алгоритм Дейкстра обычно обрабатывает только узлы, расстояния которых эквивалентны глобальному минимальному расстоянию, поскольку эти расстояния гарантированно верны. Эта вариация алгоритма позволяет алгоритму обрабатывать все вершины, расстояния которых находятся в пределах некоторого постоянного значения минимального расстояния. Значение называется значением и предоставляется пользователем в качестве пятого параметра функции. Небольшие значения параметра lookahead, скорее всего, приведут к ограниченным возможностям параллелизации, тогда как большие значения обнаружат больше параллелизма, но могут ввести (небесное) зацикливание и привести к дополнительной работе. Оптимальное значение параметра lookahead зависит от входного графика; см.[CMMS98b]и[MS98].

Этот алгоритм будет использоватьсяdijkstra_shortest_paths(), когда ему будет присвоено значение lookahead.

Where Defined

<boost/graph/distributed/eager_dijkstra_shortest_paths.hpp>

Complexity

Этот алгоритм выполняетO(V log V)работу вd + 1BSP-супершагах, гдеdявляется максимумомO(V), но может быть меньше в зависимости от величины наклона. Алгоритм может выполнять больше работы, когда обеспечивается большой внешний вид, потому что вершины будут переработаны.

Performance

Производительность алгоритма нетерпеливой Дейкстры сильно варьируется в зависимости от значения смотрящего. Следующие диаграммы иллюстрируют производительность параллельного BGL на графиках с краевыми весами, равномерно выбранными из диапазона[0, 1]и постоянным внешним видом 0,1.

chart_php_cluster_Odin_generator_ER_SF_SW_dataset_TimeSparse_columns_5.png chart_php_cluster_Odin_generator_ER_SF_SW_dataset_TimeSparse_columns_5_speedup_1.png chart_php_cluster_Odin_generator_ER_SF_SW_dataset_TimeDense_columns_5.png chart_php_cluster_Odin_generator_ER_SF_SW_dataset_TimeDense_columns_5_speedup_1.png

Delta-Stepping algorithm

namespace boost { namespace graph { namespace distributed {
  template <typename Graph, typename PredecessorMap,
            typename DistanceMap, typename WeightMap>
  void delta_stepping_shortest_paths
    (const Graph& g,
     typename graph_traits<Graph>::vertex_descriptor s,
     PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
     typename property_traits<WeightMap>::value_type delta)
  template <typename Graph, typename PredecessorMap,
            typename DistanceMap, typename WeightMap>
  void delta_stepping_shortest_paths
    (const Graph& g,
     typename graph_traits<Graph>::vertex_descriptor s,
     PredecessorMap predecessor, DistanceMap distance, WeightMap weight)
  }
} } }

Алгоритм дельта-шага[MS98]является еще одним вариантом параллельного алгоритма Дейкстра. Как и нетерпеливый алгоритм Dijkstra, он использует значение lookaheaddelta, которое позволяет процессорам обрабатывать вершины, прежде чем мы гарантированно найдем их минимальные расстояния, что позволяет больше параллелизма, чем консервативная стратегия. Delta-stepping также вводит многоуровневую структуру данных ковша, которая обеспечивает более расслабленные ограничения упорядочивания, чем приоритетные очереди, используемые другими вариантами Dijkstra, уменьшая сложность вставок, релаксации и удаления из центральной структуры данных. Алгоритм дельта-шага является наиболее эффективным из вариантов Dijkstra.

Значение lookaheadдельтаопределяет, насколько большим будет каждое из "buckets" в пределах дельта-ступенчатой очереди, где оно содержит края в пределах предварительных расстояний междудельта''i''delta''*(i+1).''дельтадолжна иметь положительное значение. При опущениидельтаустанавливается на максимальный вес края, деленный на максимальную степень.

Where Defined

<boost/graph/distributed/delta_stepping_shortest_paths.hpp>

Example

См. отдельный примерДейкстра.

Bibliography

[CMMS98a]Андреас Краузер, Курт Мелхорн, Ульрих Майер и Питер Сандерс. Параллелизация алгоритма кратчайшего пути Дейкстры. ВMathematical Foundations of Computer Science (MFCS), том 1450 Lecture Notes in Computer Science, стр. 722-731, 1998. Спрингер.
[CMMS98b]Андреас Краузер, Курт Мелхорн, Ульрих Майер и Питер Сандерс. Параллелирование алгоритма кратчайшего пути Дейкстры. Технический доклад, MPI-Informatik, 1998.
[MS98]1,2Ульрих Мейер и Питер Сандерс. Дельта-шаг: Алгоритм параллельного кратчайшего пути.6-е ЕКА, LNCS. Springer, 1998.

Copyright (C) 2004, 2005, 2006, 2007, 2008 Попечители Университета Индианы.

Авторы: Дуглас Грегор и Эндрю Лумсдейн

Статья Parallel BGL Dijkstra's Single-Source Shortest Paths раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 11:19:21/0.0089421272277832/0