import random
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import networkx as nx
from ComplexNetworkSim import NetworkSimulation, AnimationCreator, PlotCreator
def attack(graph, centrality_metric):
graph = graph.copy()
steps = 0
ranks = centrality_metric(graph)
nodes = sorted(graph.nodes(), key=lambda n: ranks[n])
while nx.is_connected(graph):
graph.remove_node(nodes.pop())
steps += 1
else:
return steps
def random_attack(graph):
graph = graph.copy()
steps = 0
while nx.is_connected(graph):
node = random.choice(graph.nodes())
graph.remove_node(node)
steps += 1
else:
return steps
NETWORK_SIZE = 1000
print 'Creating powerlaw cluster with %d Nodes.' % NETWORK_SIZE
K = 4
P = 0.1
HK = nx.powerlaw_cluster_graph(NETWORK_SIZE, K, 0.1)
print 'Starting attacks...'
print 'Network with Scale-free Model broke after %s steps with random attack.' % (random_attack(HK))
print 'Network with Scale-free Model broke after %s steps with Targeted Attacks.' % (attack(HK, nx.betweenness_centrality))
如何将节点的删除模拟为随机和有针对性的攻击?我可以计算直到网络中断的总步数,但我想绘制它。
答案 0 :(得分:0)
在主代码所在的目录中创建一个'sim'文件夹。添加此功能'save_graph' 并更新'攻击'功能。为了更好的可视化,我尝试了NETWORK_SIZE = 500。 结果在附加的gif动画中 http://www.pictureshack.us/images/6613_myimage.gif
def save_graph(graph,pos,file_name):
#initialze Figure
plt.figure(num=None, figsize=(20, 20), dpi=80)
plt.axis('off')
fig = plt.figure(1)
nx.draw_networkx_nodes(graph,pos)
nx.draw_networkx_edges(graph,pos)
nx.draw_networkx_labels(graph,pos)
cut = 1.00
xmax = cut * max(xx for xx, yy in pos.values())
ymax = cut * max(yy for xx, yy in pos.values())
plt.xlim(0, xmax)
plt.ylim(0, ymax)
plt.savefig(file_name,bbox_inches="tight")
pylab.close()
del fig
def attack(graph, centrality_metric):
graph = graph.copy()
steps = 0
ranks = centrality_metric(graph)
nodes = sorted(graph.nodes(), key=lambda n: ranks[n])
#Generate spring layout
pos = nx.spring_layout(graph)
while nx.is_connected(graph):
graph.remove_node(nodes.pop())
file_name = './sim/'+str(steps)+'.png'
save_graph(graph,pos,file_name)
steps += 1
else:
return steps