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 analyze_network(N_max): i = 0 g = build_cluster(i) stats = [] throw_dist = 4 while g.number_of_nodes() < N_max: i += 1 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')) #if not i % 2: #elif i % 5 != 1: g.add_edge(nn(i, 'ls'), nn(i-1, 'rs')) g.add_edge(nn(i, 'rs'), nn(i-1, 'ls')) if i >= 1 * throw_dist: g.add_edge(nn(i, 'rs'), nn(i-(1*throw_dist), 'ls')) g.add_edge(nn(i, 'ls'), nn(i-(1*throw_dist), 'rs')) if i >= 2 * throw_dist: g.add_edge(nn(i, 'lu'), nn(i-(2*throw_dist), 'lu')) if i >= 3 * throw_dist: g.add_edge(nn(i, 'ld'), nn(i-(3*throw_dist), 'ld')) if i >= 4 * throw_dist: g.add_edge(nn(i, 'ru'), nn(i-(4*throw_dist), 'ru')) if i >= 5 * throw_dist: g.add_edge(nn(i, 'rd'), nn(i-(5*throw_dist), 'rd')) if i >= 7 * throw_dist: g.add_edge(nn(i, 'm'), nn(i-(7*throw_dist), 'm')) stats.append(analyze(g)) print(stats[-1]) return g, stats 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, } def main(): g, r = analyze_network(1000) #print(r) nx.draw(g, with_labels = True) plt.show() if __name__=="__main__": main()