首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyError in NetworkX

KeyError in NetworkX
EN

Stack Overflow用户
提问于 2020-02-27 08:20:56
回答 1查看 1.1K关注 0票数 0

我正在挣扎于使用NetworkX的图形算法,并且我不断地得到以下错误消息。我知道这个问题以前已经回答过了(python and networkX keyerror),但是似乎有一个不同的问题。我的图形结构如下所示,我创建了七个DiGraphs,但它们都有相同的结构,包含三个节点和三个依赖项:

代码语言:javascript
复制
## 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)

现在,我想遍历我的所有图,对一个随机节点进行示例,并在发生“失败”时更新它的值。此外,如果出现“扩散”,节点的邻居也会受到影响:

代码语言:javascript
复制
# 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没有返回我的“新值”,但给出了以下错误消息:“

代码语言:javascript
复制
##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'

我真的不知道这里有什么问题,也许有人能帮我解决这个问题?非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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具有该属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60428946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档