from sage.graphs.trees import TreeIterator
drevo = []
for G in TreeIterator(6):
if G.is_connected():
if len(G.cycle_basis('vertex')) == 0:
drevo.append(G)
G.show()
def AZIvrednost(graf, alpha): #Izračun AZI vrednost za nek graf, len(graf[u]) nam da dolžino seznama sosedovza vozlišče u, torej je to stopnja vozlišča u
vsota = 0
for u in graf:
for v in graf[u]:
vsota = vsota + ((len(graf[u]) *len(graf[v]))/(len(graf[u]) + len(graf[v]) - 2))^alpha
return vsota/2
alpha = -3
AZI_vred = {}
for G in drevo:
a = AZIvrednost(G, alpha)
AZI_vred[a] = (G)
print(max(AZI_vred))
AZI_vred[max(AZI_vred)]
64/25
print(min(AZI_vred))
AZI_vred[min(AZI_vred)]
5/8
alpha = -2
AZI_vred = {}
for G in drevo:
a = AZIvrednost(G, alpha)
AZI_vred[a] = (G)
print(max(AZI_vred))
AZI_vred[max(AZI_vred)]
16/5
print(min(AZI_vred))
AZI_vred[min(AZI_vred)]
5/4
alpha = -1
AZI_vred = {}
for G in drevo:
a = AZIvrednost(G, alpha)
AZI_vred[a] = (G)
print(max(AZI_vred))
AZI_vred[max(AZI_vred)]
4
print(min(AZI_vred))
AZI_vred[min(AZI_vred)]
5/2
alpha = 0
AZI_vred = {}
for G in drevo:
a = AZIvrednost(G, alpha)
AZI_vred[a] = (G)
print(max(AZI_vred))
AZI_vred[max(AZI_vred)]
5
print(min(AZI_vred))
AZI_vred[min(AZI_vred)]
5
alpha = 8
AZI_vred = {}
for G in drevo:
a = AZIvrednost(G, alpha)
AZI_vred[a] = (G)
print(max(AZI_vred))
AZI_vred[max(AZI_vred)]
1280
print(min(AZI_vred))
AZI_vred[min(AZI_vred)]
1953125/65536
alpha = 2
AZI_vred = {}
for G in drevo:
a = AZIvrednost(G, alpha)
AZI_vred[a] = (G)
print(max(AZI_vred))
AZI_vred[max(AZI_vred)]
20
print(min(AZI_vred))
AZI_vred[min(AZI_vred)]
125/16
alpha = 3
AZI_vred = {}
for G in drevo:
a = AZIvrednost(G, alpha)
AZI_vred[a] = (G)
print(max(AZI_vred))
AZI_vred[max(AZI_vred)]
40
print(min(AZI_vred))
AZI_vred[min(AZI_vred)]
625/64
Če primerjamo različne alfa lahko opazimo najprej, da pri alfa = 0 ima graf maksimalno in minimalno AZI vrednost pri istem grafu. Zanimivo je to, da pri alfa z negativnimi vrednostmi ima zvezda maksimalno AZI vrednost, kar je obratno od alfa s pozitivnimi vrednostmi. Opazimo tudi to, da naprimer en graf, ki ima maksimalno AZI vrednost npr pri alfa = -1, isti graf ima minimalno AZI vrednost pri alfa = 1 in tisti graf ki ima pri alfa = -1 minimalno AZI vrednost ima pri alfa = 1 maksimalno AZI vrednost.
def generiranje_dreves(n):
A = graphs.RandomTree(n)
return A
test = Graph({0: [1, 2, 3, 4]})
test.show()
choice(range(6))
1
from random import choice
def AZI_max(graf, n=100, tol=10^-9, i=0, alpha=3):
najboljsa = trenutna = AZIvrednost(graf, alpha)
najboljsi_graf = graf
for j in range(n):
T = n/(j+1)
e = graf.random_edge(labels=False)
i += 1
K = Graph(graf)
if i > n:
return(AZIvrednost(K, alpha))
K.delete_edge(e)
if K.is_connected():
e = K.complement().random_edge()
else:
A, B = K.connected_components()
e = (choice(A), choice(B))
K.add_edge(e)
a = AZIvrednost(K, alpha)
if a > najboljsa:
najboljsi_graf = K
najboljsa = a
if a > trenutna or exp((trenutna - a) / T) > random():
graf = K
trenutna = a
najboljsi_graf.show()
return (najboljsi_graf, najboljsa)
B = generiranje_dreves(100)
AZI_max(B,10000, alpha = -10)
(Graph on 100 vertices, 46052604311303188647463921/18280792200314880000000000)
from random import choice
def AZI_min(graf, n=100, tol=10^-9, i=0, alpha=3):
najboljsa = trenutna = AZIvrednost(graf, alpha)
najboljsi_graf = graf
for j in range(n):
T = n/(j+1)
e = graf.random_edge(labels=False)
i += 1
K = Graph(graf)
if i > n:
return(AZIvrednost(K, alpha))
K.delete_edge(e)
if K.is_connected():
e = K.complement().random_edge()
else:
A, B = K.connected_components()
e = (choice(A), choice(B))
K.add_edge(e)
a = AZIvrednost(K, alpha)
if a < najboljsa:
najboljsi_graf = K
najboljsa = a
if a < trenutna or exp((trenutna - a) / T) > random():
graf = K
trenutna = a
najboljsi_graf.show()
return (najboljsi_graf, najboljsa)
B = generiranje_dreves(100)
AZI_min(B,10000, alpha = 10)
(Graph on 100 vertices, 2615117517349564772614520758236679811/114752696193360080142336000000000)