如何在复杂网络和Python中模拟随机和有针对性的攻击

时间:2013-06-27 08:20:57

标签: python networkx complex-networks

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

如何将节点的删除模拟为随机和有针对性的攻击?我可以计算直到网络中断的总步数,但我想绘制它。

1 个答案:

答案 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