update for circle topology
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user