From e71fa9d87090fed1e7ad7dfdb0313932259fac56 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Wed, 30 Sep 2026 20:56:36 +0300 Subject: [PATCH] update for circle topology --- main.py | 141 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 101 insertions(+), 40 deletions(-) diff --git a/main.py b/main.py index 91664ad..2c8e282 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,25 @@ import matplotlib.pyplot as plt import networkx as nx +import pandas as pd + +nn_total_levels = 0 def nn(cluster_no, node_name): - return str(cluster_no) + '-' + node_name + if not nn_total_levels: + return str(cluster_no) + '-' + node_name + return str(cluster_no % nn_total_levels) + '-' + node_name + +def join_nodes(g, a, b): + if not (g.degree[a] == 6 or g.degree[b] == 6): + g.add_edge(a, b) + +def start_file(p): + index = ['i', 'N', 'E', 'S', 'D', 'D_avg', 'T', 'C'] + open(p, 'w').write(','.join(index) + '\n') + +def write_file(p, data): + index = ['i', 'N', 'E', 'S', 'D', 'D_avg', 'T', 'C'] + open(p, 'a').write(','.join([str(data[i]) for i in index]) + '\n') def build_cluster(n): g = nx.Graph() @@ -17,50 +34,56 @@ def build_cluster(n): return g -def analyze_network(N_max): - i = 0 - g = build_cluster(i) - stats = [] - +def build_network(n): throw_dist = 4 - while g.number_of_nodes() < N_max: - i += 1 + g = build_cluster(0) + + global nn_total_levels + nn_total_levels = n + + 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')) + for i in range(n): + if n >= 2: + 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: + g.add_edge(nn(i, 'ls'), nn(i-1, 'rs')) + g.add_edge(nn(i, 'rs'), nn(i-1, 'ls')) - #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: + if n >= 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')) + if n > 2 * throw_dist: + a = nn(i, 'lu') + b = nn(i-(2*throw_dist), 'lu') + join_nodes(g, a, b) + if n > 3 * throw_dist: + a = nn(i, 'ld') + b = nn(i-(3*throw_dist), 'ld') + join_nodes(g, a, b) + if n > 4 * throw_dist: + a = nn(i, 'ru') + b = nn(i-(4*throw_dist), 'ru') + join_nodes(g, a, b) + if n > 5 * throw_dist: + a = nn(i, 'rd') + b = nn(i-(5*throw_dist), 'rd') + join_nodes(g, a, b) + if n > 7 * throw_dist: + a = nn(i, 'm') + b = nn(i-(7*throw_dist), 'm') + join_nodes(g, a, b) - stats.append(analyze(g)) - print(stats[-1]) - - return g, stats + return g def analyze(G: nx.Graph) -> dict: N = G.number_of_nodes() @@ -75,19 +98,57 @@ def analyze(G: nx.Graph) -> dict: return { 'N': N, 'E': E, - 'Ступінь': S, - 'Діаметр': D, - 'Середній діаметр': D_average, - 'Топологічний трафік': Q, - 'Вартість': C, + 'S': S, + 'D': D, + 'D_avg': round(D_average, 4), + 'T': round(Q, 4), + 'C': C, } def main(): - g, r = analyze_network(1000) + i = 0 + + start_file('data.csv') + d = None + + while True: + i += 1 + g = build_network(i) + + r = analyze(g) + r.update({"i": i}) + + ''' + if d.__class__ == None.__class__: + d = pd.DataFrame(r, index = ['i', 'N', 'E', 'S', 'D', 'D_avg', 'T', 'C']) + else: + d.add(r) + ''' + + print(r) + write_file('data.csv', r) + + if g.number_of_nodes() > 1000: + break #print(r) + #nx.draw(g, with_labels = True) + #plt.show() + + #d.to_csv('data.csv') + +def test(): + g = build_network(15) + print(analyze(g)) + print([i for i, v in g.degree if v > 6]) + print(g.adj['14-ld']) nx.draw(g, with_labels = True) plt.show() +def test2(): + g = build_network(150) + print(analyze(g)) + print(set([v for i, v in g.degree()])) + if __name__=="__main__": main()