forked from AlxndrMlk/Barabasi-Albert_Network
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BA_model.py
125 lines (105 loc) · 4 KB
/
BA_model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# coding: utf-8
#
# Barabási–Albert Network Model
# by Aleksander Molak (2017)
# aleksander.molak@gmail.com
#
# ____________________________________________________________________
# SECTION 1 - IMPORTS
import networkx as nx
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import warnings
# If you are using Jupyter Notebook you may find following two lines useful:
# warnings.filterwarnings('ignore')
# % matplotlib inline
# ____________________________________________________________________
# SECTION 2 - VISUALISATION FUNCTION
def k_distrib(graph=G, scale='lin', colour='#40a6d1', alpha=.8, expct_lo=1, expct_hi=10, expct_const=1):
plt.close()
num_nodes = graph.number_of_nodes()
max_degree = 0
# Calculate the maximum degree to know the range of x-axis
for n in graph.nodes():
if graph.degree(n) > max_degree:
max_degree = graph.degree(n)
# X-axis and y-axis values
x = []
y_tmp = []
# loop for all degrees until the maximum to compute the portion of nodes for that degree
for i in range(max_degree+1):
x.append(i)
y_tmp.append(0)
for n in graph.nodes():
if graph.degree(n) == i:
y_tmp[i] += 1
y = [i/num_nodes for i in y_tmp]
# Plot the graph
deg, = plt.plot(x, y,label='Degree distribution',linewidth=0, marker='o',markersize=8, color=colour, alpha=alpha)
# Check for the lin / log parameter and set axes scale
if scale == 'log':
plt.xscale('log')
plt.yscale('log')
plt.title('Degree distribution (log-log scale)')
# add theoretical distribution line k^-3
w = [a for a in range(expct_lo,expct_hi)]
z = []
for i in w:
x = (i**-3) * expct_const # set line's length and fit intercept
z.append(x)
plt.plot(w,z, 'k-', color='#7f7f7f')
else:
plt.title('Degree distribution (linear scale)')
plt.ylabel('P(k)')
plt.xlabel('k')
plt.show()
# ____________________________________________________________________
# SECTION 3 - BA ALGORITHM
print("***\nWelcome to Barabási–Albert (BA) model simulation\nAuthor: Aleksander Molak (2017)\n!איזה כיף\n\n")
# Get parameters
init_nodes = int(input("Please type in the initial number of nodes (m_0): "))
final_nodes = int(input("\nPlease type in the final number of nodes: "))
m_parameter = int(input("\nPlease type in the value of m parameter (m<=m_0): "))
print("\n")
print("Creating initial graph...")
G = nx.complete_graph(init_nodes)
print("Graph created. Number of nodes: {}".format(len(G.nodes())))
print("Adding nodes...")
def rand_prob_node():
nodes_probs = []
for node in G.nodes():
node_degr = G.degree(node)
#print(node_degr)
node_proba = node_degr / (2 * len(G.edges()))
#print("Node proba is: {}".format(node_proba))
nodes_probs.append(node_proba)
#print("Nodes probablities: {}".format(nodes_probs))
random_proba_node = np.random.choice(G.nodes(),p=nodes_probs)
#print("Randomly selected node is: {}".format(random_proba_node))
return random_proba_node
def add_edge():
if len(G.edges()) == 0:
random_proba_node = 0
else:
random_proba_node = rand_prob_node()
new_edge = (random_proba_node, new_node)
if new_edge in G.edges():
print("!ככה לא בונים חומה")
add_edge()
else:
print("!מזל טוב")
G.add_edge(new_node, random_proba_node)
print("Edge added: {} {}".format(new_node + 1, random_proba_node))
count = 0
new_node = init_nodes
for f in range(final_nodes - init_nodes):
print("----------> Step {} <----------".format(count))
G.add_node(init_nodes + count)
print("Node added: {}".format(init_nodes + count + 1))
count += 1
for e in range(0, m_parameter):
add_edge()
new_node += 1
print("\nFinal number of nodes ({}) reached".format(len(G.nodes())))
print("\n\nThanks! !תודה רבה :)\n")