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

ГРАФ_Лаба_3

.docx
Скачиваний:
26
Добавлен:
18.12.2019
Размер:
310.02 Кб
Скачать

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

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

«САНКТ-ПЕТЕРБУРГСКИЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

КАФЕДРА № 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)

Результат работы

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