微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法计算NetworkX中节点属性的总和

如何解决有没有办法计算NetworkX中节点属性的总和

我有以下网络:

df = pd.DataFrame([
    {'Material': 'FG','Component': 'COMP1'},{'Material': 'FG','Component': 'COMP2'},{'Material': 'COMP1','Component': 'RAW1'},'Component': 'RAW2'},{'Material': 'COMP2','Component': 'RAW3'},{'Material': 'COMP3','Component': 'RAW4'}
])
G = nx.from_pandas_edgelist(df,source='Material',target='Component',create_using=nx.DiGraph)

enter image description here

为每个节点分配一个属性

G.nodes['FG']['t'] = 2
G.nodes['COMP1']['t'] = 3
G.nodes['COMP2']['t'] = 5
G.nodes['COMP3']['t'] = 1
G.nodes['RAW1']['t'] = 6
G.nodes['RAW2']['t'] = 4
G.nodes['RAW3']['t'] = 1
G.nodes['RAW4']['t'] = 8

我想从选定节点的后代计算属性 't' 的最大总和。换句话说,写一个函数

max_att_sum(G,node,att)

例如上面的返回值,即:

[in]  max_att_sum(G,'COMP1','t)
[out] 9

9,因为'RAW1' (6) + 'COMP1' (3) > 'RAW2' (4) + 'COMP1' (3)

有人知道如何解决这个问题吗?

解决方法

我已经找到了解决方案。但是,如果您知道更有效的解决方案,我将不胜感激。

步骤 1. 为每条边添加权重:

for e in nx.edges(G):
    if nx.descendants(G,e[1]):
        G[e[0]][e[1]]['weight'] = G.nodes[e[0]]['t']
    else:
        G[e[0]][e[1]]['weight'] = G.nodes[e[0]]['t'] + G.nodes[e[1]]['t']

步骤 2. 计算最长路径的函数:

def max_att_sum(G,node,attr):
    if nx.descendants(G,node):
        return nx.dag_longest_path_length(G.subgraph(nx.descendants(G,node) | set([node])))
    else:
        return G.nodes[node][attr]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。