
- •Напишем подпрограмму для построения списка ребер по заданной матрицы смежности.
- •Визуализируем заданный граф. Убедимся в том, что он совпадает с исходным графом.
- •Напишем подпрограмму, позволяющую представить граф в виде массива записей, основываясь на заданной матрице смежности. Каждой вершине графа соответствует запись.
- •Для каждого из представлений (матрица смежности, список ребер, массив записей) напишем подпрограммы поиска и вывода на экран:
- •Для каждого из представлений (матрица смежности, список ребер, массив записей) вывести на экран размер содержащего их объекта в байтах.
- •Приложение а. Код программы
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ
Ст. преподаватель |
|
|
|
Н. Н. Григорьева |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Контрольная работа
Представление графов в ЭВМ
по курсу: Построение и анализ графовых моделей
СТУДЕНТКА ГР. № |
Z0411 |
|
19.01.25 |
|
М. В. Карелина |
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2025
Цель работы: изучение представления графов в ЭВМ при помощи матрицы смежности, множества пар вершин и массива структур. Визуализация графов.
Индивидуальный вариант:
Вариант задания №7 представлен на рисунке 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]]
Напишем подпрограмму для построения списка ребер по заданной матрицы смежности.
Код подпрограммы и вспомогательной подпрограммы для проверки введенной матрицы смежности в соответствии с листингами 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 - Результат работы подпрограммы построения списка рёбер графа
Визуализируем заданный граф. Убедимся в том, что он совпадает с исходным графом.
Код подпрограммы в соответствии с листингом 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 - Результат работы подпрограммы
построения графа