77 lines
1.8 KiB
Python
77 lines
1.8 KiB
Python
import matplotlib.pyplot as plt
|
|||
|
|
import networkx as nx
|
||
|
|
|
||
|
|
def nn(cluster_no, node_name):
|
||
|
|
return str(cluster_no) + '-' + node_name
|
||
|
|
|
||
|
|
def build_cluster(n):
|
||
|
|
g = nx.Graph()
|
||
|
|
nodes = ['ls', 'lu', 'ld', 'm', 'rd', 'ru', 'rs']
|
||
|
|
edges = [('ls', 'lu'), ('ls', 'ld'), ('ld', 'lu'),
|
||
|
|
('rs', 'ru'), ('rs', 'rd'), ('rd', 'ru'),
|
||
|
|
('lu', 'm'), ('ld', 'm'),
|
||
|
|
('ru', 'm'), ('rd', 'm')]
|
||
|
|
|
||
|
|
g.add_nodes_from([nn(n, x) for x in nodes])
|
||
|
|
g.add_edges_from([tuple(nn(n, y) for y in x) for x in edges])
|
||
|
|
|
||
|
|
return g
|
||
|
|
|
||
|
|
def build_network(n):
|
||
|
|
g = build_cluster(0)
|
||
|
|
|
||
|
|
for i in range(1, n):
|
||
|
|
c = build_cluster(i)
|
||
|
|
g = nx.union(g, c)
|
||
|
|
|
||
|
|
if i % 2:
|
||
|
|
g.add_edge(nn(i, 'lu'), nn(i-1, 'lu'))
|
||
|
|
g.add_edge(nn(i, 'rd'), nn(i-1, 'rd'))
|
||
|
|
else:
|
||
|
|
g.add_edge(nn(i, 'ld'), nn(i-1, 'ld'))
|
||
|
|
g.add_edge(nn(i, 'ru'), nn(i-1, 'ru'))
|
||
|
|
|
||
|
|
g.add_edge(nn(i, 'ls'), nn(i-1, 'rs'))
|
||
|
|
g.add_edge(nn(i, 'rs'), nn(i-1, 'ls'))
|
||
|
|
|
||
|
|
return g
|
||
|
|
|
||
|
|
def analyze(G: nx.Graph) -> dict:
|
||
|
|
N = G.number_of_nodes()
|
||
|
|
E = G.number_of_edges()
|
||
|
|
degs = G.degree()
|
||
|
|
s_vals = [s[1] for s in degs]
|
||
|
|
S = max(s_vals)
|
||
|
|
D = nx.diameter(G)
|
||
|
|
D_average = nx.average_shortest_path_length(G)
|
||
|
|
Q = N*D_average/E
|
||
|
|
C = N*D*S
|
||
|
|
return {
|
||
|
|
'N': N,
|
||
|
|
'E': E,
|
||
|
|
'Ступінь': S,
|
||
|
|
'Діаметр': D,
|
||
|
|
'Середній діаметр': D_average,
|
||
|
|
'Топологічний трафік': Q,
|
||
|
|
'Вартість': C,
|
||
|
|
'Graph': G.copy()
|
||
|
|
}
|
||
|
|
|
||
|
|
def main():
|
||
|
|
i = 0
|
||
|
|
|
||
|
|
while True:
|
||
|
|
i += 1
|
||
|
|
g = build_network(i)
|
||
|
|
|
||
|
|
if g.number_of_nodes() > 1000:
|
||
|
|
break
|
||
|
|
|
||
|
|
r = analyze(g)
|
||
|
|
print(r)
|
||
|
|
#nx.draw(g, with_labels = True)
|
||
|
|
#plt.show()
|
||
|
|
|
||
|
|
if __name__=="__main__":
|
||
|
|
main()
|