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()