我对这个问题有疑问:
让 c1,c2,...,cn n 不同的货币。 1美元货币 ci 可以以货币 cj 购买 w_ij> 0 美元。鉴于所有汇率 wij ,我们希望找到以货币 c1 开头的货币 cn 的最佳方式。
基本上我们要做的是找到一个从最大权重到 ci 到 cj 的路径,对吧?我正在考虑使用拓扑排序之类的东西,但问题是 ci 和 cj 之间有两条路径,一条来自 ci cj 的值为 w_ij ,另一个来自 cj 到 ci ,其值为 1 / w_ij < / em>的。我该如何解决这个问题?
答案 0 :(得分:0)
考虑边权为 -log w_ij 的有向图。此图中从 c_i 到 c_j 的最短路径对应于从 c_i 开始购买 c_j 的最佳方式。
如果图表有一个负周期,那么就没有最短(非简单)的路径,也没有最好的购买货币的方法:总有一种更好的方式可以对应于在周期内走动几次。
Bellman-Ford算法在多项式时间内工作。如果存在负循环,它可以报告负循环,如果没有这样的循环,则找到最短路径。
答案 1 :(得分:-1)
为了计算节点的最大路径,我们计算每个其他节点,从当前节点到另一个节点的权重乘以另一个节点的最大路径值(递归计算),以及然后我们选择最大的此类产品。
def maxPath(weights):
def _maxPath(i):
if path_nodes.get(i):
return 0
elif i==n-1:
return 1
path_nodes[i]=1
max_path=0
for j in range(0, n):
cur_path=weights[i][j]*_maxPath(j)
if cur_path>max_path:
max_path=cur_path
del path_nodes[i]
return max_path
n=len(weights)
path_nodes = {}
return _maxPath(0)
def main():
weights=[[1,2,3],[0.5,1,4],[0.33, 0.25, 1]]
print(weights)
print(maxPath(weights))