ГРАФ_Лаба_3
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Доц., канд. техн. наук |
|
|
|
Е.А. Бакин |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №3 |
Случайные графы и их свойства. |
по курсу: Построение и анализ графовых моделей |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4616 |
|
|
|
А.В.Павлов |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2019
Цель работы
Рассмотреть различные подходы к генерации случайных графов в ЭВМ. Провести анализ свойств созданных графов.
Вариант 7
Дана квадратная решетка размером N на N. Закрашивание клетки такой решетки эквивалентно тому, что в граф добавляется вершина. Между двумя вершинами графа ставится ребро тогда, когда клетки решетки, соответствующие этим вершинам прилегают друг к другу по горизонтали или вертикали (N = 10).
Делать обход каждой клетки решетки и принимать решение о закрашивании (p – вероятность закрашивания).
Построить график зависимости вероятности существования пути между первым и последним столбцами решетки от вероятности закрашивания клетки (объем выборки для вычисления вероятности существования пути выбрать самостоятельно, если задано несколько значений параметра М, должно быть по одному графику для каждого значения).
Описание разработанной программы
Псевдокод
Импорт библиотек
Пустые списки random,adj_mat,label
N=10
Цикл от I до N
Добавляй к списку random список случайных величин сгенерированных с помощью функции scipy.
X=1
Цикл о I до N
Цикл от j до N
Если элемент random[i][j] =1
Добавляй к label x
X=x+1
Если элемент j+1<1
Если элемент random[i][j] =1 и Если элемент random[i][j+1] =1
Добавляй к adj_mat значение x-1,x
Если элемент i+1<1
Если элемент random[i][j] =1 и Если элемент random[i+1][j] =1
G=0
G=g+1
Если элемент j+1 не имеет остатка
Добавляй к adj_mat значение g-1,g
Если элемент j+1>N
Добавляй к adj_mat значение g,g-1
Печатай значение random ,label
Создай элемент для от рисовки графа G
Параметры для от рисовки графа
Цикл I до размера label
Добавляй каждый элемент в vershin
Цикл о 0 до 10
Запускай функцию
Добавляй teor
Рисуй график
Листинг программы
import scipy.stats as st
from collections import deque, namedtuple
import igraph
import os
import numpy as np
import time
from sys import getsizeof
import matplotlib.pyplot as plt
prob=[]
def matrix(p):
try:
N=10
random=[]
adj_mat=[]
label=[]
for i in range(N):
random.append(st.bernoulli.rvs(p, size=N))
#random= [([0, 0, 0]), ([0, 1, 1]), ([0, 1, 1])]
x =1
for i in range(N):
for j in range(N):
if random[i][j] == 1:
label.append(x)
x=x+1
if j+1<N:
if random[i][j]==1 and random[i][j+1]==1:
adj_mat.append((x-1, x + 1-1))
if i+1<N:
if (random[i][j] == 1 and random[i + 1][j] == 1):
if j==0:
g = 0
for z in range(N):
if random[i][z] == 1:
g=g+1
if (j+1) % N ==0 :
g = 0
for z in range(N):
if random[i+1][z] == 1:
g=g+1
if j!=0 and (j+1) % N !=0 and i+1!=N:
g = 0
for z in range(j,N):
if random[i][z] == 1:
g=g+1
for z in range(j):
if random[i+1][z] == 1:
g=g+1
#print(g)
adj_mat.append((x-1, x + g-1))
print(random)
print(adj_mat)
print(label)
G = igraph.Graph(directed = False)
list=[]
if adj_mat:
if max(np.delete(adj_mat,()))==max(label):
vershin=len(label)+1
else:
vershin = len(label)
#list = [label[i] for i in range(len(label))]
print(list)
#x =np.trim_zeros(random)
G.add_vertices(vershin)
G.add_edges([i for i in adj_mat])
G.vs['label'] = [i-1 for i in label]
#G.es['weight'] = [i[1] for i in t_matrix]
#G.es['label'] = [i[1] for i in t_matrix]
layout = G.layout('kk')
igraph.plot(G, 'graph.png', bbox=(1000, 1000), layout=layout, vertex_size=40,
vertex_label_size=10)
os.startfile(r'graph.png')
x=1
first=[]
second=[]
for i in range(N):
for j in range(N):
if random[i][j]==1:
if j==0:
first.append(x)
if j==N-1:
second.append(x)
x=x+1
print("perviq and vtoroi")
test=[]
if first and second :
print(first, second)
for f in range(len(first)):
for s in range(len(second)):
test.append(G.vertex_connectivity(source=first[f], target=second[s], checks=True, neighbors="ignore"))
else:
prob.append(0)
else:
prob.append(0)
x = np.delete(adj_mat, ())
#x = x.astype(np.int)
print(x)
#spektr=[]
spektr =(np.unique(x,return_counts=True))
plt.bar(spektr[0],spektr[1])
plt.show()
print(spektr)
except igraph._igraph.InternalError :
prob.append(0)
matrix(0.5)
Результат работы
Рисунок 1- Граф полученный программой
Рисунок 2 – График зависимости вероятности пути от вероятности закрашивания
Рисунок 3 – График спектра
Выводы:
В ходе лабораторной работы, мы научились генерировать графы с помощью заданного алгоритма. Полученный в ходе выполнения граф, может описывать различные примеры из жизни, например, иерархию людей в различных сферах. Граф делиться на подграфы, который состоит из различных количеств вершин, максимальное количество связей у вершин – 3.
Доп вопрос
Сделать разные цветом ребра у каждого кластера
Добавляем код к существующей программе, для нахождений связи
if adj_mat:
clasters = []
#print("\nclasters1:\n",clasters)
for v1,v2 in adj_mat:
#print(v1,v2,end="->( ")
for count,claster in enumerate(clasters):
#print("|",claster,"|",end="")
if v1 in claster:
clasters[count] |= set([v2])
break
elif v2 in claster:
clasters[count] |= set([v1])
break
else:
clasters.append(set([v1,v2]))
print("\nclasters:\n",clasters)
klasters = []
podobnoe = []
for i in range(len(clasters)):
if i not in podobnoe:
klasters.append(clasters[i])
for j in range(i+1,len(clasters)):
if i != j and clasters[i]&clasters[j]:
print("\n",klasters[-1])
print(clasters[j])
klasters[-1] |= clasters[j]
podobnoe.append(j)
print("\nklasters:\n",klasters)
color = []
for val in label:
for i,claster in enumerate(klasters):
if val in claster:
color.append(i+1)
break
else:
color.append(0)
print("\ncolor: ",len(color),"\n",color)
color = [ "#{}{}{}".format(str(hex((80*k+40)%201+55))[2:],str(hex((45*k+120)%231+25))[2:],str(hex((17*k)%239+16))[2:]) for k in color]
print("\ncolor: ",len(color),"\n",color)
Результат работы