Ianysheva_4
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ассистент |
|
|
|
М. Н. Шелест |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4 |
СПЕЦИАЛЬНЫЕ АЛГОРИТМЫ НА ГРАФАХ |
по курсу: ПОСТРОЕНИЕ И АНАЛИЗ ГРАФОВЫХ МОДЕЛЕЙ |
|
|
РАБОТУ ВЫПОЛНИЛА
СТУДЕНТКА ГР. |
4716 |
|
|
|
С.А. Янышева |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург
2020
Цель работы
Реализовать и проверить на тестовом примере специальный алгоритм на графе.
Вариант задания
Вариант №3. Реализуемый алгоритм - Алгоритм Брона-Кербоша (невзвешенный неориентированный граф).
Граф
Граф, на котором будет происходить тестирование алгоритма представлен на рисунке 1, матрица смежности графа представлена на рисунке 2.
Рисунок 1 – Граф
Рисунок 2 – Матрица смежности
Описание алгоритма
Алгоритм Брона — Кербоша — метод ветвей и границ для поиска всех клик (а также максимальных по включению независимых множеств вершин) неориентированного графа. Разработан голландскими математиками Броном и Кербошем в 1973 году и до сих пор является одним из самых эффективных алгоритмов поиска клик.
Алгоритм использует тот факт, что всякая клика в графе является его максимальным по включению полным подграфом. Начиная с одиночной вершины (образующей полный подграф), алгоритм на каждом шаге пытается увеличить уже построенный полный подграф, добавляя в него вершины из множества кандидатов. Высокая скорость обеспечивается отсечением при переборе вариантов, которые заведомо не приведут к построению клики, для чего используется дополнительное множество, в которое помещаются вершины, которые уже были использованы для увеличения полного подграфа.
Описание разработанной программы
Список основных переменных представлен в таблицы №1.
Таблица 3 – Список основных переменных
Название |
Тип данных |
Описание |
adj_matrix |
defaultdict |
Матрица смежности графа |
N |
list |
Список клик |
Листинг программного кода представлен в приложении А.
Пример работы программы
На рисунке 3 представлена визуализация введенного графа.
Рисунок 7 – Построенный по матрице смежности граф
Рисунок 8 – Матрица
После выполнения программы, выводится список клик, вторая строка.
Выводы
В ходе выполнения лабораторной работы был реализован Алгоритм Брона — Кербоша — метод ветвей и границ для поиска всех клик (а также максимальных по включению независимых множеств вершин) неориентированного графа.
Был получен опыт с объектно-ориентированным программирование, которое является неотъемлемой частью разработки многих современных проектов.
Приложение А – Листинг программного кода
import matplotlib.pyplot as plt import networkx as nx import numpy as np
#Задаем матрицу смежности adj_matrix = [[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1], [0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]]
#Выводим(визуализируем) граф G = nx.from_numpy_matrix(np.matrix(adj_matrix), create_using=nx.DiGraph)
layout = nx.spring_layout(G) nx.draw(G, layout, with_labels=True)
plt.show()
#Находим список связей для каждого ребра N = { i: set(num for num, j in enumerate(row) if j) for i, row in enumerate(adj_matrix) } #Выводим список связей для каждого ребра print(N)
#Учитывая три непересекающихся набора вершин R, P и X, он находит максимальные клики, #которые включают в себя все вершин в R, некоторых вершин в P и ни одной из вершин в X. #При каждом вызове алгоритма P и X являются непересекающимися множествами, объединение которых состоит из тех вершин, #которые образуют клики при добавлении в R. В других словами, P ∪ X - это множество вершин, которые соединяются с каждым элементом R. #Когда P и X оба пусты, нет никаких дополнительных элементов, которые можно добавить к R, #поэтому R - максимальная клика, и алгоритм выдает R.
#Алгоритм Брона-Кербоша def BronKerbosch1(P, R=None, X=None): P = set(P) R = set() if R is None else R X = set() if X is None else X if not P and not X: yield R while P: v = P.pop() yield from BronKerbosch1( P=P.intersection(N[v]), R=R.union([v]), X=X.intersection(N[v])) X.add(v)
P = N.keys() #Вывод print(list(BronKerbosch1(P))) |