我正在挣扎于使用NetworkX的图形算法,并且我不断地得到以下错误消息。我知道这个问题以前已经回答过了(python and networkX keyerror),但是似乎有一个不同的问题。我的图形结构如下所示,我创建了七个DiGraphs,但它们都有相同的结构,包含三个节点和三个依赖项:
## Network structure of Graph
for i in range(1):
G_x = nx.DiGraph()
G_x.add_node('x1', server = 5)
G_x.add_node('x2', service = 3)
G_x.add_node('x3', infrastructure = 2)
G_x.add_edge('x1','x2', dependency = 0.6)
G_x.add_edge('x1','x3', dependency = 0.6)
G_x.add_edge('x2','x3', dependency = 0.3)
G_a = nx.DiGraph()
G_a.add_node('a1', server = 8)
G_a.add_node('a2', service = 4)
G_a.add_node('a3', infrastructure = 3)
G_a.add_edge('a1','a2', dependency = 0.6)
G_a.add_edge('a1','a3', dependency = 0.6)
G_a.add_edge('a2','a3', dependency = 0.3)
G_b = nx.DiGraph()
G_b.add_node('b1', server = 12)
G_b.add_node('b2', service = 5)
G_b.add_node('b3', infrastructure = 3)
G_b.add_edge('b1','b2', dependency = 0.6)
G_b.add_edge('b1','b3', dependency = 0.6)
G_b.add_edge('b2','b3', dependency = 0.3)
G_c = nx.DiGraph()
G_c.add_node('c1', server = 5)
G_c.add_node('c2', service = 3)
G_c.add_node('c3', infrastructure = 2)
G_c.add_edge('c1','c2', dependency = 0.6)
G_c.add_edge('c1','c3', dependency = 0.6)
G_c.add_edge('c2','c3', dependency = 0.3)
G_d = nx.DiGraph()
G_d.add_node('d1', server = 9)
G_d.add_node('d2', service = 4)
G_d.add_node('d3', infrastructure = 2)
G_d.add_edge('d1','d2', dependency = 0.6)
G_d.add_edge('d1','d3', dependency = 0.6)
G_d.add_edge('d2','d3', dependency = 0.3)
G_e = nx.DiGraph()
G_e.add_node('e1', server = 14)
G_e.add_node('e2', service = 9)
G_e.add_node('e3', infrastructure = 2)
G_e.add_edge('e1','e2', dependency = 0.6)
G_e.add_edge('e1','e3', dependency = 0.6)
G_e.add_edge('e2','e3', dependency = 0.3)
G_y = nx.DiGraph()
G_y.add_node('y1', server = 3)
G_y.add_node('y2', service = 1.5)
G_y.add_node('y3', infrastructure = 0.5)
G_y.add_edge('y1','y2', dependency = 0.6)
G_y.add_edge('y1','y3', dependency = 0.6)
G_y.add_edge('y2','y3', dependency = 0.3)现在,我想遍历我的所有图,对一个随机节点进行示例,并在发生“失败”时更新它的值。此外,如果出现“扩散”,节点的邻居也会受到影响:
# Select random node based on probability == 0.05/5.0%
sum_partial_fail = 0
affected_nodes_list = []
affected_node_values_list = []
for graph in [G_x, G_a, G_b, G_c, G_d, G_e, G_y]:
random_node = random.sample(graph.nodes, 1)[0]
print("Random_node: ", random_node)
percentage_chance_of_failure = random.uniform(0, 1)
print("Percentage chance of failure: ", percentage_chance_of_failure)
attr = list(graph.nodes.data()[random_node].keys())[0]
if percentage_chance_of_failure <= 0.3:
old_node_value = graph.nodes[random_node][attr]
print("Old node value: ", old_node_value)
new_node_value = graph.nodes[random_node][attr] - 1
print("New node value: ", new_node_value)
if new_node_value < 0:
nx.set_node_attributes(graph, {(random_node): {attr: 0}})
for j in graph.neighbors(random_node):
percentage_chance_of_spread = random.uniform(0, 1)
print("Percentage chance of spread: ", percentage_chance_of_spread)
if percentage_chance_of_spread >= 0.5:
#error new_value = (1 - (graph[random_node][j]['dependency'] * (new_node_value / old_node_value)))\
* (graph.nodes[j][attr])
nx.set_node_attributes(graph, {(j): {attr: new_value}})
print("Random node attribute chance >0.5: ", random_node[attr])除为percentage_chance_of_spread为>= 0.5外,一切正常工作。Python没有返回我的“新值”,但给出了以下错误消息:“
##Returned values
Random_node: b1
Percentage chance of failure: 0.02705497047686123
Old node value: 12
New node value: 11
Percentage chance of spread: 0.6987620126722746
##Returned error message
Traceback (most recent call last):
File "C:/Users/XXX", line 139, in <module>
* graph.nodes[j][attr]
KeyError: 'service'我真的不知道这里有什么问题,也许有人能帮我解决这个问题?非常感谢!
发布于 2020-02-27 15:22:15
在您的代码中,并不是每个节点都有属性'service'。但有些人会。
如果random_node具有该属性,那么在某个时候,您将得到attr='service'。然后循环for j in graph.neighbors(random_node):。
在这种情况下,如果是percentage...>0.5,您将尝试获得graph.nodes[j][attr],但attr是'service'。我不认为有任何理由期望节点j具有该属性,仅仅因为random_node具有该属性。
https://stackoverflow.com/questions/60428946
复制相似问题