Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПиАГ.docx
Скачиваний:
0
Добавлен:
16.05.2025
Размер:
1.09 Mб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

Кафедра 41

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

Ст. преподаватель

Н. Н. Григорьева

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

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

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

Контрольная работа

Представление графов в ЭВМ

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

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

Z0411

19.01.25

М. В. Карелина

номер группы

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

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

Номер студенческого билета: 2020/3477

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

2025

Цель работы: изучение представления графов в ЭВМ при помощи матрицы смежности, множества пар вершин и массива структур. Визуализация графов.

Индивидуальный вариант:

Вариант задания №7 представлен на рисунке 1.

Рисунок 1 - Вариант графа для практической работы

  1. Матрица смежности представлена в таблице 1.

Таблица 1 - Матрица смежности

Rector

Vice-Rector1

Vice-Rector2

Vice-Rector3

Vice-Rector4

Dean1

Dean2

Dean3

Dean4

Rector

0

1

2

3

4

0

0

0

0

Vice-Rector1

0

0

2

0

0

5

0

0

0

Vice-Rector2

0

0

0

4

0

1

2

0

0

Vice-Rector3

0

0

0

0

1

0

0

2

0

Vice-Rector4

0

0

0

0

0

0

0

0

4

Dean1

0

0

0

0

0

0

3

0

0

Dean2

0

0

0

0

0

0

0

0

0

Dean3

0

0

0

0

0

0

4

0

0

Dean4

0

0

0

0

0

0

0

0

0

Введем в ЭВМ матрицу смежности в явном виде. Код в соответствии с листингом 1. Листинг всей программы приведен в Приложении A. Код программы.

Листинг 1 – Матрица смежности в явном виде

peaks = ['Rector', 'Vice-Rector1', 'Vice-Rector2', 'Vice-Rector3', 'Vice-Rector4', 'Dean1','Dean2','Dean3','Dean4'] adjacency_matrix = [[0, 1, 2, 3, 4, 0, 0, 0, 0], [0, 0, 2, 0, 0, 5, 0, 0, 0], [0, 0, 0, 4, 0, 1, 2, 0, 0], [0, 0, 0, 0, 1, 0, 0, 2, 0], [0, 0, 0, 0, 0, 0, 0, 0, 4], [0, 0, 0, 0, 0, 0, 3, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 4, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]

  1. Напишем подпрограмму для построения списка ребер по заданной матрицы смежности.

Код подпрограммы и вспомогательной подпрограммы для проверки введенной матрицы смежности в соответствии с листингами 2 – 3, списки использованных в подпрограммах переменных в соответствии с таблицей 2. Результат работы кода представлен на рисунке 2.

Таблица 2 - Список переменных подпрограммы из Листинга 2 и 3

Название

Значение

adj_mat

Список значений матрицы смежности

peaks

Список названий вершин

test

Результат проверки матрицы смежности

list_edges

Список ребер графа

row

Итератор по строкам матрицы смежности

col

Итератор по значениям строки матрицы смежности

Листинг 2 – Подпрограмма построения списка рёбер

# Построение списка рёбер по матрице смежности def get_list_edges_by_adjacency_matrix(adj_mat, peaks=[], view=True): test = adjacency_matrix_check(adj_mat) if test != True: return test # Проверка матрицы смежности if not peaks: peaks = [str(i) for i in range(len(adj_mat))] # Создание списка рёбер графа list_edges = [] for row in range(len(adj_mat)): for col in range(len(adj_mat[row])): if adj_mat[row][col] != 0: if view: list_edges.append((((row, peaks[row]), (col, peaks[col])), adj_mat[row][col])) else: list_edges.append(str(peaks[row]) + ' -> ' + str(peaks[col]) + ': ' + str( adj_mat[row][col])) # Другое представление рёбер return list_edges

Листинг 3 – Подпрограмма проверка корректности ввода матрицы смежности

# Проверка ввода матрицы смежности def adjacency_matrix_check(adj_mat): if len(adj_mat) ** 2 != sum([len(row) for row in adj_mat]): return 'Ошибка: !Кол-во строк и столбцов матрицы смежности не равно!' return True

Рисунок 2 - Результат работы подпрограммы построения списка рёбер графа

  1. Визуализируем заданный граф. Убедимся в том, что он совпадает с исходным графом.

Код подпрограммы в соответствии с листингом 4, список использованных переменных в соответствии с таблицей 3. Результат работы в соответствии с рисунком 3.

Таблица 3 - Список переменных подпрограммы из Листинга 4

Название

Значение

adj_mat

Список значений матрицы смежности

peaks

Список названий вершин

g

Объект igraph содержащий граф

Листинг 4 – Подпрограмма построения графа

# Рисует график по МАТРИЦЕ СМЕЖНОСТИ def view_graph(adj_mat, peaks, curved_value=False): g = ig.Graph(directed=True) # создание ориентированного графа g.add_vertices(len(peaks)) # добавление вершин графа # добавление идентификаторов и меток к вершинам for i in range(len(g.vs)): g.vs[i]["id"] = i g.vs[i]["label"] = peaks[i] # получаем список рёбер и их веса list_edges = get_list_edges_by_adjacency_matrix(adj_mat, peaks) # задаем рёбра g.add_edges([(edge[0][0][0], edge[0][1][0]) for edge in list_edges]) # задаем веса рёбер weights = [edge[1] for edge in list_edges] g.es['label'] = weights g.es['edge_width'] = weights g.es["curved"] = curved_value # построение графика ig.plot(g, target='my_graph.png', bbox=(350, 350), margin=30, vertex_label_size=10, vertex_size=55, vertex_color='white') return 1

Рисунок 3 - Результат работы подпрограммы построения графа