update for circle topology

This commit is contained in:
2026-09-30 20:56:36 +03:00
parent ac6d9e48b2
commit e71fa9d870
+101 -40
View File
@@ -1,8 +1,25 @@
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import networkx as nx import networkx as nx
import pandas as pd
nn_total_levels = 0
def nn(cluster_no, node_name): 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): def build_cluster(n):
g = nx.Graph() g = nx.Graph()
@@ -17,50 +34,56 @@ def build_cluster(n):
return g return g
def analyze_network(N_max): def build_network(n):
i = 0
g = build_cluster(i)
stats = []
throw_dist = 4 throw_dist = 4
while g.number_of_nodes() < N_max: g = build_cluster(0)
i += 1
global nn_total_levels
nn_total_levels = n
for i in range(1, n):
c = build_cluster(i) c = build_cluster(i)
g = nx.union(g, c) g = nx.union(g, c)
if i % 2: for i in range(n):
g.add_edge(nn(i, 'lu'), nn(i-1, 'lu')) if n >= 2:
g.add_edge(nn(i, 'rd'), nn(i-1, 'rd')) if i % 2:
else: g.add_edge(nn(i, 'lu'), nn(i-1, 'lu'))
g.add_edge(nn(i, 'ld'), nn(i-1, 'ld')) g.add_edge(nn(i, 'rd'), nn(i-1, 'rd'))
g.add_edge(nn(i, 'ru'), nn(i-1, 'ru')) 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: if n >= 1 * throw_dist:
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, 'rs'), nn(i-(1*throw_dist), 'ls'))
g.add_edge(nn(i, 'ls'), nn(i-(1*throw_dist), 'rs')) g.add_edge(nn(i, 'ls'), nn(i-(1*throw_dist), 'rs'))
if i >= 2 * throw_dist: if n > 2 * throw_dist:
g.add_edge(nn(i, 'lu'), nn(i-(2*throw_dist), 'lu')) a = nn(i, 'lu')
if i >= 3 * throw_dist: b = nn(i-(2*throw_dist), 'lu')
g.add_edge(nn(i, 'ld'), nn(i-(3*throw_dist), 'ld')) join_nodes(g, a, b)
if i >= 4 * throw_dist: if n > 3 * throw_dist:
g.add_edge(nn(i, 'ru'), nn(i-(4*throw_dist), 'ru')) a = nn(i, 'ld')
if i >= 5 * throw_dist: b = nn(i-(3*throw_dist), 'ld')
g.add_edge(nn(i, 'rd'), nn(i-(5*throw_dist), 'rd')) join_nodes(g, a, b)
if i >= 7 * throw_dist: if n > 4 * throw_dist:
g.add_edge(nn(i, 'm'), nn(i-(7*throw_dist), 'm')) 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)) return g
print(stats[-1])
return g, stats
def analyze(G: nx.Graph) -> dict: def analyze(G: nx.Graph) -> dict:
N = G.number_of_nodes() N = G.number_of_nodes()
@@ -75,19 +98,57 @@ def analyze(G: nx.Graph) -> dict:
return { return {
'N': N, 'N': N,
'E': E, 'E': E,
'Ступінь': S, 'S': S,
'Діаметр': D, 'D': D,
'Середній діаметр': D_average, 'D_avg': round(D_average, 4),
'Топологічний трафік': Q, 'T': round(Q, 4),
'Вартість': C, 'C': C,
} }
def main(): 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) #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) nx.draw(g, with_labels = True)
plt.show() plt.show()
def test2():
g = build_network(150)
print(analyze(g))
print(set([v for i, v in g.degree()]))
if __name__=="__main__": if __name__=="__main__":
main() main()