s spodnjo funkcijo generiramo vse eno ciklične grafe na n vozliščih. Funkcija deluje počasi že za 8 vozlišč. grafov je takrat že več 89 tako, da celostno analizo za večje število vozlič sploh ni smiselno računati.
eno_ciklicni =[]
for G in graphs(5, size=5):
if G.is_connected():
if len(G.cycle_basis('vertex')) == 1:
eno_ciklicni.append(G)
#G.show()
len(eno_ciklicni)
5
def AZIvrednost(graf, alpha=3): #Izračun AZI vrednost za nek graf
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
AZI_vred = {}
for G in eno_ciklicni:
a = AZIvrednost(G, 3)
AZI_vred[a] = (G)
poračunamo ekstremalne vrednosti AZI za vse enciklične grafe in jo izpišemo skupaj z pripadajočim grafom
print(max(AZI_vred))
AZI_vred[max(AZI_vred)]
40
print(min(AZI_vred))
AZI_vred[min(AZI_vred)]
776/27
Za velika števila bomo poizkušali rezultat dobiti z iskanjem maksimuma po metodi spreminjanja do sedaj najbolše metode, dela do n=40
def generiranje_grafa(n):
A = graphs.RandomTree(n)
A.add_edge(A.complement().random_edge(labels=False))
return A
graf = B = generiranje_grafa(10)
B.show()
from random import choice
def minima(graf, n=100, alpha=3):
i=0
najboljsa = trenutna = AZIvrednost(graf, 3)
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, 3))
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, 3)
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)
from random import choice
def maxima(graf, n=100, alpha=3):
i = 0
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)
graf = B = generiranje_grafa(50)
maxima(B, 100000)
(Graph on 50 vertices, 5920376509/12348000)
minima(B, 100000)
(Graph on 50 vertices, 989986522/7414875)