ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ
Вестн. Ом. ун-та. 2011. № 2. С. 159-166.
УДК: 004.424
Р.Ю. Домрачеев, С.С. Ефимов
Омский государственный университет им. Ф. М. Достоевского
ПАРАЛЛЕЛЬНАЯ РЕАЛИЗАЦИЯ ПОИСКА ЯДЕР ГРАФА
Представлены результаты исследования задачи поиска ядер графа. Необходимость в решении данной задачи возникает в целом ряде приложений, однако она относится к числу труднорешаемых. Использование технологии параллельных вычислений позволяет ускорить процесс поиска ядер графа.
Ключевые слова: ядра графа, алгоритмы поиска ядер, параллельные вычисления.
Основные понятия
Множество вершин графа называется независимым (или внутренне устойчивым), если никакие две вершины из этого множества не являются смежными.
Независимое множество называется максимальным, если оно не является собственным подмножеством некоторого другого независимого множества.
Подмножество V' вершин графа О называется доминирующим (или внешне устойчивым), если каждая вершина из VG\V' смежна с некоторой вершиной из V'.
Ядро графа - множество вершин, являющееся одновременно и независимым, и доминирующим.
Независимое множество является максимальным (необязательно наибольшим) тогда и только тогда, когда оно доминирующее. Таким образом, ядра графа - это максимальные независимые множества вершин.
Понятие ядра графа естественным образом переносится на случай ориентированных графов (понятие независимого множества сохраняется, а доминирующим считается множество 8 графа О такое, что любая вершина из VG\S имеет дугу, направленную в множество 5) [1].
Множество 8 вершин орграфа О называется доминирующим, если для любой вершины ю е VG\S существует такая вершина и е что (и, ю) е АО (АО - множество дуг орграфа О).
Таким образом, чтобы найти ядра графа, достаточно найти все максимальные независимые множества графа, а в случае орграфа проверить эти множества на ориентированную доминантность.
Сложность алгоритма поиска ядер графа
Задача поиска ядер графа является труднорешаемой, т. е. для ее решения не существует полиномиального алгоритма [2]. В монографии американских ученых Майкла Гэри и Дэвида Джонсона [3] указана задача «ЯДРО» под кодом «ТГ 57». По условию задан ориентированный граф. Требуется определить, содержит ли этот орграф ядро. Исходя из того, что данная задача приведена как труднорешаемая, с указанием на источник с доказательством (сложность задачи доказал
© Р.Ю. Домрачеев, С.С. Ефимов, 2011
профессор Монреальского университета (Concordia University) Vaclav Chvatal, см.: [4]), можно обосновать, что задача поиска ядер в произвольном неориентированном графе также является труднорешаемой. В условии задачи «ТГ 57» говорится об ориентированном графе, однако ядро ориентированного графа отличается от ядра неориентированного графа свойством доминирующего множества - быть источником только исходящих дуг. Если разбить задачу поиска ядер на составляющие, то получим две подзадачи: 1) поиск ядер неориентированного графа, 2) проверка для каждого ядра на требуемое свойство доминирующего множества.
Предположим, что первая подзадача нетруднорешаемая, а для задачи «ТГ 57» есть алгоритм, отличный от рассматриваемого двухэтапного, например основанный на свойствах ориентированного графа. Тогда, обратив внимание на вторую подзадачу, можно заметить, что ее сложность линейна относительно количества найденных ядер и списка смежности, так как проверка требуемого свойства состоит в последовательном проходе по вершинам найденных множеств, проверке наличия смежности в списке и в исключении не подошедших множеств. В итоге получается, что решение задачи «ТГ 57» удалось разложить на две нетруд-норешаемые задачи, что противоречит доказанному свойству труднорешаемо-сти, и, следовательно, задача поиска ядер в неориентированном графе также является труднорешаемой. Что касается того, что в условии говорится о поиске только одного ядра, то поиск более одного ядра является еще более сложным, так как после нахождения первого ядра работа алгоритма будет продолжена.
Трудоемкость метода поиска с возвратами не гарантирует эффективности -трудоемкость поиска с возвратами имеет тот же порядок, что и другие способы перебора (в худшем случае) [5]. То есть трудоемкость зависит от сложности входных данных, и простое решение имеет место только для небольших графов, например с числом вершин, не превосходящим 20. Однако с увеличением числа вершин этот метод поиска становится громоздким [6].
Для оценки сложности алгоритма можно принять оценку сложности алгоритма Брона - Кэрбоша (метода ветвей и границ для поиска всех клик неориентированного графа). В противоположность максимальному независимому множеству,
в котором не могут встретиться две смежные вершины, в клике все вершины попарно смежны, и максимальное независимое множество графа О соответствует клике графа-дополнения ~О и наоборот. Таким образом, задача о клике и задача о независимом множестве по сути эквивалентны: каждая из них получается из другой, путем построения дополнения графа - такого графа, в котором есть все вершины исходного графа, причем в дополнении графа вершины соединены ребром в том и только в том случае, если они не были соединены в исходном графе [6; 7]. Исходя из связи с алгоритмом Брона - Кэрбоша, можно принять, что сложность алгоритма поиска максимальных независимых множеств графа, согласно выводам Тошйа, Тапака и НагиЫБа, в худшем случае составляет 0(3п/3), где п - количество вершин [7].
Актуальность.
Области использования
Задача поиска ядер графа возникает в различных прикладных областях, что подтверждает ее актуальность.
Теория игр. Многие игры допускают представление в следующей абстрактной форме, называемой игрой на графе. Дан граф Бержа Ь (орграф, в котором из каждой вершины в каждую другую может идти не более одной дуги, а при каждой вершине может быть не более одной петли [2]) с выделенным подмножеством 3 с X «начальных» вершин. Играют двое: А и В. Игрок, начинающий партию, своим ходом выбирает вершину Х1 е 3, затем второй игрок выбирает вершину у е Гх\ (Гх - множество вершин, смежных с х), после чего первый выбирает Х2 е Гу2, и т. д. Победителем считается тот, кому удалось выбрать строго тупиковую вершину и тем самым лишить противника ходов. Так вот, если в какой-то момент игры один из игроков выбрал вершину некоторого ядра N то он овладел беспроигрышной тактикой, т. е. может продолжать партию, на любые ходы противника всегда отвечать так, чтобы самому не оказаться в строгом тупике.
К играм на графе сводятся игры типа Ним, шахматы, шашки [8; 9].
Лингвистика. В данной области, можно, например, исследовать ядро, фактически существующее в графе фонем румынского языка [8].
Экспертный анализ. Здесь имеет место общая проблема оценки М вариантов исследуемой системы (объектов) по N крите-
риям и выбора наиболее предпочтительных из них (желательно выбрать один вариант) с точки зрения всех критериев. Необходимо из совокупности индивидуальных оценок вариантов по заданному набору критериев выработать групповое решение о порядке предпочтения альтернативных вариантов, т. е. должна быть решена проблема группового выбора. Для заданной системы ядро графа представляет собой подмножество несравнимых между собой объектов. В процессе поиска ядер вводится отношение превосходства. Например, в дуге вершина - конец дуги считается превосходящей, а вершина - начало дуги - исключаемой. Если ядер больше одного, то они несравнимы по информации, содержащейся в графе, поэтому необходим дополнительный анализ объектов сравнения [10].
Управление проектами. Пусть имеется N проектов, которые должны быть выполнены, и допустим, что для выполнения проекта Х{ требуется некоторое подмножество Я наличных ресурсов из множества {1, ..., р}. Далее предположим, что каждый проект, задаваемый совокупностью средств, необходимых для его реализации, может быть выполнен за один и тот же промежуток времени. Построим граф О, каждая вершины которого соответствует некоторому проекту, а ребро (х, х) -наличию общих средств обеспечения у проектов Х{ и х, т. е. условию Я п Я] Ф 0. Максимальное независимое множество графа О представляет собой максимальное множество проектов, которое можно выполнить одновременно за один и тот же промежуток времени [6].
Теория информации. Возникающую здесь ситуацию можно упрощенно описать следующим образом. Источник информации посылает сообщения, являющиеся последовательностями сигналов из множества X = {х1, Х2, ..., хт}. При передаче возникают (например, вследствие помех) искажения сигналов. Поэтому на принимающей станции некоторые сигналы могут быть поняты как другие, т. е. перепутаны. Рассмотрим граф О, у которого VО = X и хх] е ЕО, если и только если х и х] могут быть перепутаны. Тогда, чтобы получить безошибочный код, т. е. исключить пере-путывания, следует пользоваться сигналами из независимого подмножества графа О. Стремление получить максимальное количество таких сигналов приводит к задаче отыскания наибольшего независимого множества вершин в графе О [1].
Проектирование радиоэлектронной аппаратуры. Знание числа внешней ус-
тойчивости (мощности наибольшего независимого множества графа) необходимо при проектировании многослойных печатных плат, когда требуется отыскать минимальное число слоев платы с минимальным числом переходов из слоя в слой (каждый такой слой должен обеспечивать максимально возможное покрытие коммутационного пространства) [11].
Таким образом, учитывая, что задача поиска ядер графа является труднорешае-мой [3] и приложения теории графов находят множество применений на практике, можно обосновать целесообразность исследований, направленных на ускорение реализации алгоритмов поиска ядер графа.
Алгоритмы поиска ядер графа
Для нахождения ядер графа можно использовать два основных подхода. Первый из них основан на утверждении о том, что ядра графа также являются его максимальными независимыми множествами. Для этого случая существует алгоритм построения всех максимальных независимых множеств [6].
Второй подход является более традиционным и основан на методе Магу [10]. В основе метода лежит использование свойств булевых уравнений. Для нахождения ядра составляются два булева уравнения: одно - для внешнеустойчивого, другое - для внутреннеустойчивого множества. Затем булевы функции в уравнениях упрощаются до совершенных дизъюнктивных нормальных форм (СДНФ), и эти два уравнения перемножаются. Решением полученного уравнения является СДНФ, дизъюнктами которой являются ядра графа. В настоящей статье этот подход не рассматривается, так как требует использования символьных алгоритмов, являющихся отдельным направлением программирования, требующих применения нетривиальных структур данных и методов их обработки.
В статье рассматривается первый подход из названных выше. Алгоритм, лежащий в основе, является существенно упрощенным перебором, использующим дерево поиска. Данный алгоритм использует способ организации перебора, основанный на идее поиска в глубину и называемый поиском с возвратами [5]. Такой способ известен под названием систематического метода перебора Брона и Кэрбоша [12].
Алгоритм описан в работе [5], в которой он представлен в виде псевдокода. Приведем последовательность шагов алгоритма построения максимальных независимых множеств графа.
Вход: граф G(V, E), заданный списками смежности T[v]. Выход: последовательность максимальных независимых множеств. k:=0 {количество элементов в текущем независимом множестве} S[k]:=0 {S[k] - независимое множество из k вершин}
Q-[k]:= 0 {Q-[k] - множество вершин, уже использованных для расширения S[k]} Q+[k]:=V {Q+[k] - множество вершин, которые можно использовать для расширения S[k] }
M1: {шаг вперед}
select v eQ+[k] {расширяющая вершина}
S+[k+1]:= S+[k] U {v} {расширенное множество}
Q-[k+1]:= Q-[k] \ r[v] {вершина v использована для расширения}
Q+[k+1]:= Q+[k] \ (r[v] U {v})
{все вершины, смежные с v, не могут быть использованы для расширения} k:=k+1
М2: {проверка} for u e Q-[k] do
if Г[и] n Q+[k] = 0 then
goto M3 {можно возвращаться}
end if
end for
if Q+[k] = 0 then
if Q-[k] = 0 then
yield S[k] {множество S[k]}
end if
goto M3 {можно возвращаться} else
goto M1 {можно идти вперед}
end if
М3: {шаг назад}
v:=last(S[k]) {последний добавленный элемент} k:=k-1
S[k]:=S[k+1]-{v}
Q-[k]:= Q-[k] u {v} {вершина v уже добавлялась} Q+[k]:= Q+[k] \ {v} if k=0 & Q+[k] = 0 then stop
else
goto M2 {переход на проверку}
end if
Реализация параллельного алгоритма для системы с распределенной памятью
Для реализации алгоритма посредством библиотеки MPICH (бесплатная реализация стандарта MPI) было рассмотрено несколько вариантов.
Первый из этих вариантов потребовал отказа от списков стандартной библиотеки STL и перехода на новую структуру -массив. Память под массив выделялась по максимуму, т. е. равная мощности множества вершин исходного графа. Был проведен эксперимент, по результатам которого выяснилось, что преимущество во времени работы ОрепМР-реализации по сравнению с последовательной меньше в несколько раз на новой структуре-мас-
сиве, а количества найденных множеств начинали различаться при росте мощности исходного графа. Данную некорректность устранить не удалось. Вследствие этого реализация в направлении сравнения ОрепМР и MPI версий была остановлена. Сравнивать результаты на структурах STL нецелесообразно, так как MPI-реализация очень много времени теряет на конвертацию структур при передаче (MPI рассылает массивы).
Затем были рассмотрены дальнейшие пути реализации MPI-версии для распараллеливания операции определения пересечения двух множеств. В ходе экспериментов было установлено, что распараллеливание с помощью MPI небольших множеств, порядка 100 вершин, не дает
стабильного и заметного выигрыша в работе параллельной программы.
Была сделана попытка проведения повторных экспериментов путем увеличения мощности исходного графа. Однако после анализа результатов эксперимента на сильносвязанном 100-вершин-ном графе, с учетом сложности модификации последовательного алгоритма, этот вариант был также отвергнут. В результате упомянутого эксперимента даже на 100-вершинном сильносвязанном графе программа через время порядка 5 часов, построив около 6 млн ядер, прервала свою работу с исключительной ситуацией (bad allocation) невозможности выделить память при имеющемся объеме ОЗУ, равном 2 Гб. Из этого следует, что путь дальнейшего, на порядки, увеличения мощности исходного графа привел бы к еще большим проблемам в экспериментах.
Решение задачи поиска ядер графа с исходными данными более высоких порядков - это тема для отдельного исследования.
В итоге было найдено новое направление для исследований - это распараллеливание последовательного алгоритма по ветвям дерева поиска. Алгоритм в процессе своей работы, начиная с корня дерева, опускается, наращивая ветви, а потом возвращается в корень. И таких возвратов в корень может быть не более количества вершин в исходном графе. Идея данного варианта - разделить дерево поиска между процессами. Каждый процесс начинает вычисления в некотором состоянии в корне дерева и продолжает расчет до заданного состояния. Конечно, распределение трудоемкости вычислений по состояниям будет неравномерным, зависящим от характера связности исходного графа, но и полезная работа в таком случае будет выполняться параллельно, и задача реализации будет заключаться в обеспечении более равномерного распределения вычислений по множеству корневых состояний.
Результаты эксперимента
Для эксперимента на системе с распределенной памятью (кластер невыделенных рабочих станций) было разработано несколько режимов работы параллельной программы. Установка режимов производилась с помощью аргументов командной строки. Они описаны ниже.
dist distributionMethod
Метод распределения корневых состояний по процессам. Может принимать
значения: equally - состояния делятся последовательно, поровну по количеству процессов; equalstep - состояния выбираются процессами последовательно, поочередно с шагом, равным отношению мощности множества состояний к количеству процессов; pairstep - состояния выбираются процессами последовательно, поочередно по 2 состояния каждому процессу.
exerimentType value
Тип эксперимента. Может принимать значения: chess - эксперимент проводится на шахматном графе расстановки 8 не бьющих друг друга ферзей, параметр value задает в клетках сторону шахматной доски, это значение определяет верхнюю границу эксперимента 6...'value; percent -эксперимент проводится на случайном графе с value-вершинами, графы генерируются последовательно с плотностью от 0 до 100 %, с шагом 5 %; под плотностью графа понимается количество произвольно построенных ребер графа от общего числа возможных ребер в процентах.
Для начала исследований были проведены эксперименты на самом простом варианте «dist equally chess 10».
Вычислительная система, использовавшаяся для экспериментов, - с дву-ядерным процессором Pentium D, с частотой 3 ГГц, с ОЗУ 1 Гб.
Графики изменения времени работы программы для режима «dist equally chess 10» показаны на рис. 1.
Из графика видно, что с повышением сложности задачи до 100 вершин (самая верхняя кривая), после запуска программы на 9 процессах идет увеличение времени работы, т. е. теряется эффект распараллеливания программы на большее девяти число процессов. Учитывая то, что в ходе эксперимента возникали недопустимые по времени задержки при запуске программы на 10 процессах и более, было принято решение ограничить верхнюю границу количества процессов в кластере значением 9. Для исключения предположения о том, что некорректная работа программы на большом количестве процессов является следствием неправильной организации взаимодействия процессов посредством интерфейса MPI, были проведены пробные запуски программы в этом же режиме, но на одном процессоре для 11 и 12 процессов. Программа отработала без ошибок, из чего можно предположить, что ее некорректная работа в рассматриваемом случае связана с коллизиями в сети.
■10
ш ш
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
X-- -X—- -X-- --К-
Л 6 -А- Л А J -Х-8-- - А 8 ft —к—
н—V 1 2 3 4 5 6 7 8 9 -- 10
Количество процессов
Рис. 1. Графики изменения времени работы программы по количеству процессов в режиме «dist equally chess 10»
Для случая девяти процессов были проведены еще два эксперимента в режимах «dist equalstep chess 10» и «dist pairstep chess 10».
Сравнивая результаты, делаем вывод, что на симметричном шахматном графе наиболее предпочтителен режим equally.
Построим для этого режима графики изменения времени работы и коэффициента ускорения. Графики изображены на рис. 2 и 3. Из них видно, что параллельная версия программы в режиме equally дает выигрыш в производительности (коэффициент ускорения больше единицы).
Чтобы глубже изучить свойства данного варианта распараллеливания алгоритма проведем эксперимент на случайных графах, с плотностью в диапазоне от
0 до 100 %. Результаты эксперимента представлены на рис. 4. Вследствие сравнительно большого времени работы программы на некоторых исходных графах, было решено ограничить количество измерений каждого показателя до одного.
Из рисунка видно, что на случайных графах с различной плотностью по времени работы самым медленным оказался режим pairstep, самым быстрым - equalstep, немного медленнее режим equally. Из рисунка также можно выделить поддиапазон плотности графа, в котором вычисления более всего замедляются, причем на всех режимах. Приблизительно этот участок находится в поддиапазоне от 5 до 30 %, т. е. графы с такой плотностью потенциально самые трудоемкие для расчетов.
14,00 13,00 12,00 11,00 10,00 9,00 8,00 7,00 6,00
V3,27 12,45 11,72 \
\ 8,8 8,04 „.Й*»» 9,31 8,63 6,99
2 3 4 5 6 7 8 9 10
Количество процессов-компьютеров
Рис. 2. Графики изменения времени работы для режима equally
6
7
8
9
2,100
1,900
IX s 1,700
ш о 1,500
о ^ 1,300
1-
ш 1,100
■я 0,900
-а
о 0,700
0,500
1,135 v0,905 1,655 / / \ 1,542 -/1.101
1,003 " 1,069
2 3 4 5 6 7 8 9 10
Количество процессов-компьютеров
Рис. 3. Графики изменения коэффициента ускорения для режима equally
1400,00
1200,00
equally equallstep ■ pairstep
Рис. 4. Графики изменения времени работы параллельной программы в разных режимах разделения по множеству корневых состояний на случайных графах (с плотностью в диапазоне от 0 до 100 %)
Выводы
Таким образом, для проведения экспериментов была разработана параллельная версия программы на языке С++, реализующей алгоритм Брона - Кэрбоша с использованием MPI в системах с распределенной памятью, а также создана программа, реализующая распараллеливание вычислений с использованием OpenMP в многоядерных системах с общей памятью.
Исследована эффективность распараллеливания алгоритма Брона - Кэрбоша на многоядерных процессорах. Определено, что при относительно небольшом количестве узлов графа распараллеливание посредством OpenMP для многоядерных систем еще не позволяет получить ускорения больше единицы.
Удалось достичь почти двукратного ускорения по алгоритму Брона - Кэрбоша
при распараллеливании ветвей алгоритма по корневым состояниям с помощью MPI на кластере из 2-9 узлов.
На случайных графах с различной плотностью самым медленным оказался режим pairstep, самым быстрым -equalstep, немного медленнее режим equally. Определен диапазон плотности графа, на котором происходят замедления расчетов на всех режимах (от 5 до 30 %).
Кроме того, в процессе реализации последовательного алгоритма удалось найти и исправить ошибку в алгоритме Брона - Кэрбоша.
В целом удалось повысить эффективность решения труднорешаемой прикладной задачи, а именно задачи поиска ядер графа, имеющей множество перспективных применений в разных отраслях народного хозяйства.
ЛИТЕРАТУРА
[1] Лекции по теории графов / В. А. Емеличев, О. И. Мельников, В. И. Сарванов [и др.] М. : Наука, Гл. ред. физ.-мат. лит., 1990. - 384 с.
[2] Евстигнеев В. А., Касьянов В. Н. Толковый словарь по теории графов в информатике и программировании. - Новосибирск : Наука, Сиб. предприятие РАН, 1999. - 291 с.
[3] Гэри М., Джонсон Д. М. Вычислительные машины и труднорешаемые задачи. - М. : Мир, 1982. - 416 с.
[4] Chvatal V. On the computational complexity of finding a kernel [Электронный ресурс]. URL: http://users.encs.concordia.ca/~chvatal/kernel.html.
[5] Новиков Ф. А. Дискретная математика для программистов. СПб. : Питер, 2001. 304 с.
[6] Кристофидес Н. Теория графов. Алгоритмический подход. М. : Мир, 1978. 432 с.
[7] Алгоритм Брона - Кербоша : материал из Ви-кипедии - свободной энциклопедии [Электронный ресурс]. URL: http://ru.wikipedia.org/ wiki/Апгоритм_Брона-Кербоша.
[8] Зыков А. А. Основы теории графов. Новосибирск : Наука, Гл. ред. физ.-мат. лит., 1969. 381 с.
[9] Тынкевич М. А. Введение в теорию графов [Электронный ресурс]. URL: http://vtit.kuzstu.ru/ books/shelf/160/index.html.
[10] Прокушев Л. А. Дискретная математика (основы теории графов и алгоритмизации задач). СПб.: СпбГУАП, 2000. 82 с.
[11] Деньдобренко Б.Н., Малинка А.С. Автоматизация конструирования РЭА. М. : Высшая школа, 1980. 384 с.
[12] Bron C., Kerbosch J. Algorithm 457 - Finding all cliques of undirected graph // Comm. of ACM. № 16. 1973. P. 575.