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

python networkX 网络单纯形

如何解决python networkX 网络单纯形

我正在尝试使用 networkX 库解决交通问题。 由于我的需求和供应值是浮动的,networkX 包似乎无法解决我的问题? 请参阅第 377 页上的文档。 https://networkx.org/documentation/stable/_downloads/networkx_reference.pdf

有什么解决办法吗? 我的问题是由于四舍五入错误造成的,因为我的浮点数非常小。

是否还有其他支持浮点数的库来解决 Python 中的最小成本流问题?

import networkx as nx

#inputdata
producerDict = {'p1': 3.88,'p2': 4.3225,'p3': 24.41575}
consumerDict = {'c1':46.63775,'c2': 85.44925,'c3': 71.92425,'c4': 
84.1755}

totalDemand = sum(consumerDict.values())
totalSupply = sum(producerDict.values())

#graph
G = nx.DiGraph()
G.add_edge("C1","P1",weight=3)
G.add_edge("C1","P2",weight=1)
G.add_edge("C1","P3",weight=4)

G.add_edge("C2",weight=2)
G.add_edge("C2",weight=4)
G.add_edge("C2",weight=5)

G.add_edge("C3",weight=6)
G.add_edge("C3",weight=2)
G.add_edge("C3",weight=2)

G.add_edge("C4",weight=1)
G.add_edge("C4",weight=6)
G.add_edge("C5",weight=3)

#balancing the problem as demand > supply
newConsumerDict = {}
for consumer,demand in consumerDict.items():
    newDemand = (demand / totalDemand) * totalSupply
    newConsumerDict[consumer] = newDemand


# this sum has to be equal to total supply which 
# is not the case due to rounding errors
print(sum(newConsumerDict.values()))

flowCost,flowDict = nx.network_simplex(G)

干杯

解决方法

您链接到的文档说:

如果边权重或需求是浮点数(溢出和 舍入错误可能会导致问题)。作为一种解决方法,您可以通过乘以相关的整数来使用整数 边缘属性由一个方便的常数因子(例如 100)。

我对此的解释是,可能存在舍入误差是一个问题的情况。我希望该算法很可能会正常工作,除非您有很多权重仅在 10^{-10} 大小上有所不同。但出于实际目的,我希望如果您将权重乘以 100(或 100000)然后取整数部分就可以了。

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