Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ianysheva_4

.docx
Скачиваний:
5
Добавлен:
16.04.2021
Размер:
75.44 Кб
Скачать

ГУАП

КАФЕДРА № 41

ОТЧЕТ

ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

ассистент

М. Н. Шелест

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4

СПЕЦИАЛЬНЫЕ АЛГОРИТМЫ НА ГРАФАХ

по курсу: ПОСТРОЕНИЕ И АНАЛИЗ ГРАФОВЫХ МОДЕЛЕЙ

РАБОТУ ВЫПОЛНИЛА

СТУДЕНТКА ГР.

4716

С.А. Янышева

подпись, дата

инициалы, фамилия

Санкт-Петербург

2020

  1. Цель работы

Реализовать и проверить на тестовом примере специальный алгоритм на графе.

  1. Вариант задания

Вариант №3. Реализуемый алгоритм - Алгоритм Брона-Кербоша (невзвешенный неориентированный граф).

  1. Граф

Граф, на котором будет происходить тестирование алгоритма представлен на рисунке 1, матрица смежности графа представлена на рисунке 2.

Рисунок 1 – Граф

Рисунок 2 – Матрица смежности

  1. Описание алгоритма

Алгоритм Брона — Кербоша — метод ветвей и границ для поиска всех клик (а также максимальных по включению независимых множеств вершин) неориентированного графа. Разработан голландскими математиками Броном и Кербошем в 1973 году и до сих пор является одним из самых эффективных алгоритмов поиска клик.

Алгоритм использует тот факт, что всякая клика в графе является его максимальным по включению полным подграфом. Начиная с одиночной вершины (образующей полный подграф), алгоритм на каждом шаге пытается увеличить уже построенный полный подграф, добавляя в него вершины из множества кандидатов. Высокая скорость обеспечивается отсечением при переборе вариантов, которые заведомо не приведут к построению клики, для чего используется дополнительное множество, в которое помещаются вершины, которые уже были использованы для увеличения полного подграфа.

  1. Описание разработанной программы

Список основных переменных представлен в таблицы №1.

Таблица 3 – Список основных переменных

Название

Тип данных

Описание

adj_matrix

defaultdict

Матрица смежности графа

N

list

Список клик

Листинг программного кода представлен в приложении А.

  1. Пример работы программы

На рисунке 3 представлена визуализация введенного графа.

Рисунок 7 – Построенный по матрице смежности граф

Рисунок 8 – Матрица

После выполнения программы, выводится список клик, вторая строка.

  1. Выводы

В ходе выполнения лабораторной работы был реализован Алгоритм Брона — Кербоша — метод ветвей и границ для поиска всех клик (а также максимальных по включению независимых множеств вершин) неориентированного графа.

Был получен опыт с объектно-ориентированным программирование, которое является неотъемлемой частью разработки многих современных проектов.

Приложение А – Листинг программного кода

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)))

Соседние файлы в предмете Построение и анализ графовых моделей