def failure_graph(graph_object,percentage_of_nodes_of_failure): total_nodes=graph_object.number_of_nodes() number_of_nodes_to_delete=int((percentage_of_nodes_of_failure*total_nodes)/100) nodes=list(graph_object.nodes) deleted_nodes=0 plot_x=[] plot_y_pl=[] plot_y_lc=[] plot_y_aic=[] invl=(total_nodes*(percentage_of_nodes_of_failure/100))//20 for i in range(number_of_nodes_to_delete): node_to_delete=random.choice(nodes) nodes.remove(node_to_delete) graph_object.remove_node(node_to_delete) deleted_nodes+=1 if(deleted_nodes%invl==0): plot_x.append(deleted_nodes/total_nodes) #average path length apl=[] compo=0 for C in (G.subgraph(c).copy() for c in nx.connected_components(graph_object)): compo+=1 apl.append(nx.average_shortest_path_length(C)) plot_y_pl.append(max(apl)) #relative size of largest Cluster largest_cc = max(nx.connected_components(graph_object), key=len) plot_y_lc.append(len(largest_cc)/graph_object.number_of_nodes()) #average size of isolated Clusters clusters=list(nx.connected_components(G)) icl=[] for clu in clusters: icl.append(len(clu)) plot_y_aic.append(np.mean(icl)) return plot_x,plot_y_pl,plot_y_lc,plot_y_aic