Участник:Lizord/Алгоритм Джонса Плассмана: различия между версиями
Lizord (обсуждение | вклад) |
Lizord (обсуждение | вклад) |
||
| Строка 41: | Строка 41: | ||
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно. | Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно. | ||
=== Макроструктура алгоритма === | === Макроструктура алгоритма === | ||
Псевдокод алгоритма: | |||
<source> | |||
Входные данные: | |||
граф с вершинами V, рёбрами E. | |||
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V | |||
color := [] | |||
w := [] | |||
for each v ∈ V: | |||
color[v] := 0 | |||
w[v] := PRIORITY(v) | |||
while v с color[v] == 0: | |||
S := ∅ | |||
for each v с color[v] == 0 in parallel: | |||
isMax := true | |||
for each u ∈ N(v): | |||
if color[u] == 0 и ( w[u] > w[v] или (w[u] == w[v] и u.id > v.id) ): | |||
isMax := false | |||
break | |||
if isMax: | |||
S.append(v) | |||
for each v ∈ S in parallel: | |||
used := { color[u] : u ∈ N(v) и color[u] ≠ 0 } | |||
c := 1 | |||
while c ∈ used: | |||
c := c + 1 | |||
color[v] := c | |||
</source> | |||
=== Схема реализации последовательного алгоритма === | === Схема реализации последовательного алгоритма === | ||
=== Последовательная сложность алгоритма === | === Последовательная сложность алгоритма === | ||
Версия от 11:38, 18 ноября 2025
| Файл:Warning sign font awesome.svg | Данная страница в настоящее время активно редактируется участником Lizord (обсуждение). Пожалуйста, не вносите в неё никаких изменений до тех пор, пока не исчезнет это объявление. В противном случае могут возникнуть конфликты редактирования. |
Основные авторы описания: Демаков М. А.
| Алгоритм Джонса-Плассмана | |
| Последовательный алгоритм | |
| Последовательная сложность | [math]\displaystyle{ O(V + E) }[/math] |
| Объём входных данных | [math]\displaystyle{ 8|E| }[/math] |
| Объём выходных данных | [math]\displaystyle{ V }[/math] |
| Параллельный алгоритм | |
| Высота ярусно-параллельной формы | [math]\displaystyle{ O(\frac{log(V)}{log log(V)}) }[/math] |
| Ширина ярусно-параллельной формы | [math]\displaystyle{ O(log(V)) }[/math] |
Свойства и структура алгоритмов
Общее описание алгоритма
Алгоритм Джонса-Плассмана - параллельная версия жадного алгоритма для раскраски графа, предложен американскими исследователями Марком Джонсом и Паулем Плассманом в 1991 году. Алгоритм основан на выделении из графа максимального независимого подмножества вершин и параллельной его раскраске. Способ выделения такого подмножества вершин был предложен Луби, он заключается в назначении вершинам уникальных меток, и последующего выбора ранее не выбранных вершин с максимальной меткой среди своих соседей. [1]
Математическое описание алгоритма
Исходные данные: граф [math]\displaystyle{ G = G(V, E) }[/math], где [math]\displaystyle{ V }[/math] - множество вершин, а [math]\displaystyle{ E }[/math] - множество ребёр.
Вычисляемые данные: вектор цветов [math]\displaystyle{ c = \{c_i\} }[/math] размерности [math]\displaystyle{ |V| }[/math]
Для раскраски графа, необходимо проделать следующие шаги:
- Обозначим множество нераскрашенных вершин как [math]\displaystyle{ V' = V }[/math].
- На каждой итерации будем выделять максимальное независимое подмножество вершин [math]\displaystyle{ I \subset V' }[/math], которое раскрашивается параллельно.
- Для каждой вершины [math]\displaystyle{ v_i \in V' }[/math] назначается уникальная случайная метка [math]\displaystyle{ p(v_i) }[/math]
- [math]\displaystyle{ v_i \in I \Leftrightarrow p(v_i) \gt p(w), \forall w \in adj(v_i) }[/math]
- После этого полагаем [math]\displaystyle{ V' = V'\;\backslash\;I }[/math]. Алгоритм работает, пока [math]\displaystyle{ V' \neq \emptyset }[/math].
Для раскраски вершины [math]\displaystyle{ v_i \in I }[/math] необходимо назначить ей цвет [math]\displaystyle{ c_i }[/math] такой, что [math]\displaystyle{ c_i \notin N_c(v_i) }[/math], где [math]\displaystyle{ N_c(v_i) }[/math] - цвета вершин, соседних для [math]\displaystyle{ v_i }[/math]. Это можно сделать последовательным перебором, это займёт в худшем случае Δ итераций (Δ - наибольшая из степеней графа).
Функции приоритета
Существуют различные способы определять функцию приоритета [math]\displaystyle{ p(v_i) }[/math], которая используется для выбора независимых вершин для раскраски. Помимо классического варианта с назначением случайных меток, вершины могут также выбираться следующими способами:
- First Fit: вершины рассматриваются в некотором заранее выбранном порядке. Например, в порядке появления в графе.
- Saturation-Degree-Ordering: выбирается вершина с максимальной насыщенной степенью, то есть с максимальным числом различно раскрашенных смежных вершин.
- Incidence-Degree-Ordering: выбирается вершина с максимальным числом раскрашенных смежных вершин.
- Largest-Degree-First: вершины раскрашиваются в порядке уменьшения степеней
- Smallest-Degree-Last: из графа удаляются все вершины с минимальной степенью, затем рекурсивно раскрашивается оставшийся граф. Удаленные вершины раскрашиваются в последнюю очередь.
- и др.
Вычислительное ядро алгоритма
Вычислительным ядром алгоритма является выделение из множества нераскрашенных вершин графа максимального независимого подмножества, которое впоследствии раскрашивается параллельно.
Макроструктура алгоритма
Псевдокод алгоритма:
Входные данные:
граф с вершинами V, рёбрами E.
Выходные данные: цветовые метки с(v) для каждой вершины v ∈ V
color := []
w := []
for each v ∈ V:
color[v] := 0
w[v] := PRIORITY(v)
while v с color[v] == 0:
S := ∅
for each v с color[v] == 0 in parallel:
isMax := true
for each u ∈ N(v):
if color[u] == 0 и ( w[u] > w[v] или (w[u] == w[v] и u.id > v.id) ):
isMax := false
break
if isMax:
S.append(v)
for each v ∈ S in parallel:
used := { color[u] : u ∈ N(v) и color[u] ≠ 0 }
c := 1
while c ∈ used:
c := c + 1
color[v] := cСхема реализации последовательного алгоритма
Последовательная сложность алгоритма
Информационный граф
Ресурс параллелизма алгоритма
Входные и выходные данные алгоритма
Входные данные: Граф [math]\displaystyle{ G = G(V, E) }[/math]
Объём входных данных: [math]\displaystyle{ 8|E| }[/math] если граф представлен списком связности, либо [math]\displaystyle{ |V|^2 }[/math], если матрицей смежности
Выходные данные: Вектор [math]\displaystyle{ c = \{c_i\} }[/math], содержащий итоговые цвета вершин.
Объём выходных данных: [math]\displaystyle{ |V| }[/math]
Свойства алгоритма
Жадные алгоритмы дают раскраски хорошего качества с точки зрения количества цветов (получаемые раскраски имеют не более, чем Δ + 1 цвет), однако эти раскраски не будут являться сбалансированными (количество цветов в цветовых классах будет распределено неравномерно)
Программная реализация алгоритма
Особенности реализации последовательного алгоритма
Возможные способы и особенности параллельной реализации алгоритма
Результаты прогонов
Выводы для классов архитектур
Литература
- ↑ M.T.Jones, P.E.Plassmann. A parallel graph coloring heuristic. SIAM Journal on Scientific Computing, vol. 14, no. 3, pp. 654–669, 1993
Maciej Besta, Armon Carigiet et. al. High-Performance Parallel Graph Coloring with Strong Guarantees on Work, Depth, and Quality. // ACM/IEEE Supercomputing Conference, 2020