import networkx as nx import numpy as np import pandas as pd import matplotlib.pyplot as plt import networkx as nx import random df=pd.read_csv("D:\级联失效\edges.csv") G=nx.from_pandas_edgelist(df,'from','to',create_using=nx.Graph()) nx.draw(G,node_size=300,with_labels=True) As=nx.adjacency_matrix(G) A=As.todense() def f(x): F=4*x*(1-x) return F n=len(A) r=2 ohxs=0.4 step=10 d=np.zeros([n,step]) for i in range(n): d[i,0]=np.sum(A[i]) x_intial=np.zeros([n,step]) for i in range(n): x_intial[i,0]=random.random() np.set_printoptions(precision=5) h_a=100 H=np.zeros([n,step]) D=np.zeros([n,step]) for i in range(n): Deg=0 for k in range(n): if k!=i: Deg=Deg+d[k,0] D[i,0]=Deg H[i,0]=d[i,0]/D[i,0]/h_a fail_scale=np.zeros(step) fail_scale[0]=1 node_rand_id=random.randint(0,n) r=2 x_intial[node_rand_id,0]=x_intial[node_rand_id,0]+r print(x_intial) fail_node=np.zeros(n) fail_node[node_rand_id]=1 print(fail_node) np.seterr(divide='ignore',invalid='ignore') for t in range(1,step): fail_node_id=[idx for (idx,val) in enumerate(fail_node) if val ==1] for i in range(n): sum=0 for j in range(n): sum = sum+A[i,j]*f(x_intial[j,t-1])/d[i] if i in fail_node_id: x_intial[i,t-1]=0 A[i,:]=0 A[:,i]=0 else: x_intial[i,t]=H[i,t-1]*abs((1-ohxs)*f(x_intial[i,t-1])+ohxs*sum) d[i,t]=np.sum(A[i]) Deg=0 for k in range(n): if k!=i: Deg=Deg+d[i,t] D[i,t]=Deg H[i,t]=d[i,t]/D[i,t]/h_a new_fail_id=[idx for (idx,val) in enumerate(x_intial[:,t]) if val>=1] fail_scale[t]=fail_scale[t-1]+len(new_fail_id) fail_node[new_fail_id]=1 x_intial[new_fail_id,t]=x_intial[new_fail_id,t]+r print(H[i,t]) print(fail_node) print(x_intial) plt.plot(fail_scale) plt.show()
时间: 2024-03-31 07:32:51 浏览: 27
这是一个使用 Python 编写的网络模型,使用了 networkx 库来构建网络。代码中从 csv 文件中读取了网络的边,然后使用 from_pandas_edgelist 方法将边转化为图。接着定义了一个 f(x) 函数,对应于网络中每个节点的失效概率。代码中还定义了一些变量和参数,如节点个数 n、失效概率增长率 r、节点失效后的修复时间 step 等。接下来的循环中,初始化了网络中每个节点的失效概率,并定义了一些辅助变量。然后对网络进行模拟,计算每个节点的失效概率,并记录失效节点的数量。最后,将失效节点的数量用 matplotlib 绘制成图表。
相关问题
代码解读,import networkx as nx import pandas as pd import matplotlib.pyplot as plt import numpy as np import scipy as sp
这段代码是Python中导入几个常用的数据分析和可视化库。具体解释如下:
- `import networkx as nx`:导入 `networkx` 库,它是一个用于复杂网络分析的Python库,可以方便地创建、操作和可视化各种类型的网络结构。
- `import pandas as pd`:导入 `pandas` 库,并将其命名为 `pd`,它是一个用于数据处理和分析的Python库,可以方便地读取、操作和处理各种格式的数据,如CSV、Excel、SQL等。
- `import matplotlib.pyplot as plt`:导入 `matplotlib` 库,并将其子模块 `pyplot` 命名为 `plt`,它是一个用于绘制各种类型图表的Python库,包括线图、散点图、柱状图等。
- `import numpy as np`:导入 `numpy` 库,并将其命名为 `np`,它是一个用于科学计算的Python库,可以方便地进行数值计算、数组操作和线性代数运算等。
- `import scipy as sp`:导入 `scipy` 库,并将其命名为 `sp`,它是一个用于科学计算和数据分析的Python库,包括线性代数、数值计算、优化、统计分析等。
这些库都是Python数据分析和可视化领域的常用工具,可以帮助我们进行各种类型的数据处理和分析,并将结果可视化。
import pandas as pd import numpy as np import networkx as nx import matplotlib.pyplot as plt df = pd.read_excel(r"C:\Users\li'yi'jie\Desktop\运筹学网络规划数据.xlsx") edges = [] for i in range(len(df)): edge = { "id": df.loc[i, "边的编号"], "tail": df.loc[i, "边的尾节点"], "head": df.loc[i, "边的头节点"], "length": df.loc[i, "长度"], "capacity": df.loc[i, "容量"] } edges.append(edge) plt.figure(figsize=(15,15)) G = nx.DiGraph() for edge in edges: G.add_edge(edge["tail"], edge["head"], weight=edge["length"]) pos = nx.spring_layout(G) nx.draw(G, pos, with_labels=True) labels = nx.get_edge_attributes(G, "weight") nx.draw_networkx_edge_labels(G, pos, edge_labels=labels) #nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, label_pos=0.3) plt.show() all_pairs = dict(nx.all_pairs_dijkstra_path_length(G)) rows = [] for start_node, dist_dict in all_pairs.items(): for end_node, dist in dist_dict.items(): rows.append({'起始节点': start_node, '终止节点': end_node, '最短路径长度': dist}) df_result = pd.DataFrame(rows) df_result.to_excel('all_pairs.xlsx', index=False)请问在写入excel的时候,能否把经过的边的编号一起写入呢?麻烦给下修改后的代码,谢谢你!
可以在循环遍历所有最短路径时,记录下经过的边的编号,然后将其一起写入Excel文件中。以下是修改后的代码:
```python
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
df = pd.read_excel(r"C:\Users\li'yi'jie\Desktop\运筹学网络规划数据.xlsx")
edges = []
for i in range(len(df)):
edge = {
"id": df.loc[i, "边的编号"],
"tail": df.loc[i, "边的尾节点"],
"head": df.loc[i, "边的头节点"],
"length": df.loc[i, "长度"],
"capacity": df.loc[i, "容量"]
}
edges.append(edge)
plt.figure(figsize=(15,15))
G = nx.DiGraph()
for edge in edges:
G.add_edge(edge["tail"], edge["head"], weight=edge["length"])
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)
labels = nx.get_edge_attributes(G, "weight")
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
#nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, label_pos=0.3)
plt.show()
all_pairs = dict(nx.all_pairs_dijkstra(G))
rows = []
for start_node, dist_dict in all_pairs.items():
for end_node, path in dist_dict.items():
path_nodes = path
path_edges = []
for i in range(len(path_nodes)-1):
tail = path_nodes[i]
head = path_nodes[i+1]
for edge in edges:
if edge["tail"] == tail and edge["head"] == head:
path_edges.append(edge["id"])
break
path_edges_str = ",".join(path_edges)
rows.append({'起始节点': start_node, '终止节点': end_node, '最短路径长度': dist_dict[end_node], '经过的边': path_edges_str})
df_result = pd.DataFrame(rows)
df_result.to_excel('all_pairs.xlsx', index=False)
```
修改后的代码中,我们使用 `nx.all_pairs_dijkstra` 函数来计算所有最短路径,并且在计算过程中记录下每个最短路径经过的边的编号。然后将其一起写入Excel文件中。