Files
dpks-lab1/main.py
T

94 lines
2.5 KiB
Python

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