Algorithm 有向图中的最大权路径

Algorithm 有向图中的最大权路径,algorithm,graph,computation-theory,breadth-first-search,Algorithm,Graph,Computation Theory,Breadth First Search,关于这个问题,我有一个问题: 设c1,c2,…,cn是n种不同的货币。1美元的货币ci可以购买0美元以上的货币cj。考虑到所有的汇率wij,我们想找出购买货币cn的最佳方式,首先从一些货币c1开始 最优汇率总是存在吗? 假设最优汇率存在,设计一个多项式时间算法来寻找最优汇率。 基本上我们要做的就是找到一条从ci到cj的路径,权重最大,对吗?我在考虑使用拓扑排序之类的方法,但问题是ci和cj之间有两条路径,一条是从ci到值为w_ij的cj,另一条是从cj到值为1/w_ij的ci。如何解决这个问题?

关于这个问题,我有一个问题:

设c1,c2,…,cn是n种不同的货币。1美元的货币ci可以购买0美元以上的货币cj。考虑到所有的汇率wij,我们想找出购买货币cn的最佳方式,首先从一些货币c1开始

最优汇率总是存在吗? 假设最优汇率存在,设计一个多项式时间算法来寻找最优汇率。
基本上我们要做的就是找到一条从ci到cj的路径,权重最大,对吗?我在考虑使用拓扑排序之类的方法,但问题是ci和cj之间有两条路径,一条是从ci到值为w_ij的cj,另一条是从cj到值为1/w_ij的ci。如何解决这个问题?

要计算一个节点的最大路径,我们为每个其他节点计算从当前节点到另一个节点的权重乘以另一个节点的最大路径值的乘积,然后选择最大的乘积

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))

为了计算一个节点的最大路径,我们为每个其他节点计算从当前节点到另一个节点的权重乘以递归计算的另一个节点的最大路径值的乘积,然后选择最大的此类乘积

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))

考虑一个带边权的有向图-logw_ij。图中从c_i到c_j的最短路径对应于从c_i开始购买c_j的最佳方式

如果图表有一个负循环,那么就没有最短的非简单路径,也没有购买货币的最佳方式:总有一种更好的方式对应于在循环中多走几次


Bellman-Ford算法在多项式时间内工作。如果存在负循环,它可以报告负循环;如果没有负循环,它可以找到最短路径

考虑一个具有边权重的有向图-log w_ij。图中从c_i到c_j的最短路径对应于从c_i开始购买c_j的最佳方式

如果图表有一个负循环,那么就没有最短的非简单路径,也没有购买货币的最佳方式:总有一种更好的方式对应于在循环中多走几次


Bellman-Ford算法在多项式时间内工作。如果存在负循环,它可以报告负循环;如果没有负循环,它可以找到最短路径

这是NP难的,不完全是。。。您需要的是找到从c1到cn的路径,其最大乘积为weights@gen-y-s乘积和和和可以用对数/指数相互转换。请参阅下面的解决方案,如果您同意,请投票。对不起,对于最长的简单路径,这是NP难的。如果允许它是非简单的,那么问题就容易了。这是NP难的,看。不完全是。。。您需要的是找到从c1到cn的路径,其最大乘积为weights@gen-y-s乘积和和和可以用对数/指数相互转换。请参阅下面的解决方案,如果您同意,请投票。对不起,对于最长的简单路径,这是NP难的。如果允许它是非简单的,那么问题就容易了;我不认为你可以使用贝尔曼福特,因为在否定了Weights之后,你不能保证有&39;具有负和的t循环。实际上,如果存在负循环,则意味着其中存在利润,您可以旋转它以获得最佳汇率,假设存在从原始节点到任意循环节点的路径a和从循环中任意节点到目标节点的路径b。我不&39;我不认为你可以使用贝尔曼福特,因为在否定了Weights之后,你不能保证有&39;t循环具有负和。实际上,如果存在负循环,则意味着其中存在利润,您可以旋转它以获得最佳汇率,假设存在从原始节点到任意循环节点的路径a和从循环中任意节点到目标节点的路径b。