如何解决使用 networkx 将加权有向图简化为 DAG
假设有一个加权有向图,可能有环
import neteorkx as nx
G = nx.DiGraph()
G.add_weighted_edges_from(
[
("a","b",10),("b","c",("c","d",("d","e",5),"a",3),]
)
缩小该图以消除所有循环并相应调整权重的正确方法是什么?
例如在这个例子中,由于去除了 D -(3)-> A
边,我们将路径中的所有权重降低了 3,给出了 A -(7)-> B -(7)-> C -(7)-> D -(5)-> E
networkx 是否为此提供了标准化算法,还是我需要自己实现?
解决方法
由于我还没有找到任何立竿见影的解决方案,我转而为此编写自己的自定义代码,现在看起来还不错。
它目前看起来像这样:
try:
while cycle := nx.find_cycle(G,orientation="original"):
edges = [(u,v) for u,v,_ in list(cycle)]
u,v = edges.pop()
weight = G[u][v]["weight"]
G.remove_edge(u,v)
for u,v in edges:
G[u][v]["weight"] -= weight
except nx.exception.NetworkXNoCycle:
pass
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。