// named parameter version
template <class Graph, class P, class T, class R>
void breadth_first_search(Graph& G,
typename graph_traits<Graph>::vertex_descriptor s,
const bgl_named_params<P, T, R>& params);
// non-named parameter version
template <class Graph, class Buffer, class BFSVisitor,
class ColorMap>
void breadth_first_search(const Graph& g,
typename graph_traits<Graph>::vertex_descriptor s,
Buffer& Q, BFSVisitor vis, ColorMap color);
breadth_first_search()функция выполняет распределённое по ширине первое прохождение направленного или ненаправленного графа. Распределенная BFS синтаксически эквивалентна своемупоследовательному аналогу, который обеспечивает дополнительный фон и обсуждение. Здесь выделены различия в семантике, и мы отсылаем читателя к документациипоследовательного поиска по ширинедля остальных деталей.
Распределенный алгоритм поиска первой широты реализует синхронизированныйуровеньпоиск по ширине, что означает, что все вершины на данном уровне дерева BFS будут обработаны (потенциально параллельно) до того, как будут обработаны любые вершины с последовательного уровня на дереве. Распределенные посетители первого поиска должны учитывать это поведение, тема, обсуждаемая далее вТочках событий посетителей.
The start vertex must be the same in every process.
IN: visitor(BFSVisitorvis)
The visitor must be a distributed BFS visitor. The suble differences
between sequential and distributed BFS visitors are discussed in the
section Visitor Event Points.
UTIL/OUT: color_map(ColorMapcolor)
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.
UTIL: buffer(Buffer&Q)
The queue must be a distributed queue that passes vertices to their
owning process. If already-visited vertices should not be visited
again (as is typical for BFS), the queue must filter duplicates
itself. The queue controls synchronization within the algorithm: its
empty() method must not return true until all local queues
are empty.
Default: A distributed_queue of a filtered_queue over a
standard boost::queue. This queue filters out duplicate
vertices and distributes vertices appropriately.
Этот алгоритм выполняетO(V + E)работу вd + 1BSP-супершагах, гдеd— диаметр исследуемого подключенного компонента. На всех ступеняхО(Е)будут передаваться сообщения постоянного размера.
КонцепцияBFS Visitorопределяет 9 точек событий, которые будут вызваныпоследовательным поиском по ширине. Распределенная BFS сохраняет эти девять точек событий, но последовательность событий и процесс, в котором происходит каждое событие, будут меняться в зависимости от распределения графика.
initialize_vertex(s,g)
This will be invoked by every process for each local vertex.
discover_vertex(u,g)
This will be invoked each time 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. If the
distributed queue prevents duplicates, it will be invoked only
once for a particular vertex u.
examine_edge(e,g)
This will be invoked by the process owning the source vertex of
e. If the distributed queue prevents duplicates, it will be
invoked only once for a particular edge e.
tree_edge(e,g)
Similar to examine_edge, this will be invoked by the process
owning the source vertex and may be invoked only once. Unlike the
sequential BFS, this event may be triggered even when the target has
already been discovered (but by a different process). Thus, some
non_tree_edge events in a sequential BFS may become
tree_edge in a distributed BFS.
non_tree_edge(e,g)
Some non_tree_edge events in a sequential BFS may become
tree_edge events in a distributed BFS. See the description of
tree_edge for additional details.
gray_target(e,g)
As with tree_edge not knowing when another process has already
discovered a vertex, gray_target events may occur in a
distributed BFS when black_target events may occur in a
sequential BFS, due to a lack of information on a given
processor. The source of edge e will be local to the process
executing this event.
Три наиболее важные вещи, которые следует помнить при обновлении существующего посетителя BFS для распределенного BFS или написании нового распределенного посетителя BFS:
Убедитесь, что все состояния либо полностью локальны, либо находятся в распределенной структуре данных (скорее всего, карта свойств!), используя ту же группу процессов, что и график.
Убедитесь, что посетитель не требует точных последовательностей событий, которые не могут быть гарантированы распределенной BFS, например, требуя, чтобы событияtree_edgeиnon_tree_edgeбыли совершенно разными.
Убедитесь, что посетитель может оперировать неполной информацией. Это часто включает в себя использование соответствующей операции сокращения враспределённой карте свойстви проверку того, что записанные результаты являются лучшими.
Чтобы проиллюстрировать различия между последовательными и распределенными посетителями BFS, мы рассмотрим посетителя BFS, который размещает расстояние от вершины источника до любой другой вершины на карте свойств. Последовательный посетитель очень прост:
Карта расстояний должна быть распределена, потому что расстояние до каждой вершины должно храниться в процессе владения вершиной. Это фактически является требованием к пользователю предоставить такую распределенную карту свойств, хотя во многих случаях карта свойств будет автоматически распределена и никаких синтаксических изменений не потребуется.
Этот посетительдействительнотребует точной последовательности событий, которые могут изменяться с помощью распределенной BFS. Посторонние событияtree_edge, которые могут произойти, могут привести к попыткам поместить расстояния в карту расстояния несколько раз для одной вершины. Поэтому мы должны рассмотреть пулю No 3.
Поскольку для каждой вершины могут быть записаны значения нескольких расстояний, мы всегда должны выбирать наилучшее значение, которое мы можем найти для обновления карты расстояний. Распределенная карта свойстврасстояниядолжна разрешать расстояния до наименьшего расстояния, которое она видела. Например, процесс 0 может найти вершинууна уровне 3, но процесс 1 находит ее на уровне 5: расстояние должно оставаться на уровне 3. Для этого мы заявляем, что роль карты свойствзаключается в виде карты расстояния, которая вводит соответствующую операцию сокращения:
set_property_map_role(vertex_distance, distance);
Полученный распределенный посетитель BFS (который также применяется без изменений в последовательном BFS) очень похож на нашего первоначального последовательного посетителя BFS. Обратите внимание на однолинейную разницу в конструкторе:
Производительность Breadth-First Search иллюстрируется следующими диаграммами. Масштабирование и производительность являются разумными для всех графиков, которые мы пробовали.
Copyright (C) 2004 Попечители Университета Индианы.
Авторы: Дуглас Грегор и Эндрю Лумсдейн
Статья Parallel BGL Breadth-First Search раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.