【问题标题】:Get path in graph with weighted vertices and edges获取带有加权顶点和边的图中的路径
【发布时间】:2016-03-30 14:58:51
【问题描述】:

如果我有以下带有加权顶点和边的无向图:

我正在尝试提出一种 ruby​​ 算法,以在定义的限制(边总和)内找到具有最高值(顶点总和)的最佳最短路径。

起点也是终点。

例如找到一条最大值为 20 且总值最高的路径。

这个问题似乎是一个 np 难题,很难找到最佳解决方案。

有没有修改过的dijkstra算法?我尝试使用贪心算法,但它没有给我一个最佳解决方案。并且通过在所有可能的路径上使用蛮力将起作用,但如果节点数量增加,则需要很长时间。

想知道是否有任何算法组合可以用来改进我的解决方案?

谢谢。

【问题讨论】:

  • 我不明白,首先你说:'我正在尝试提出一种 ruby​​ 算法,以在定义的限制(边的总和)内找到具有最高值(总和)的最佳最短路径顶点数)”,但随后您说:“找到一条总价值最高的最多 20 个的路径”。在第二个语句中似乎你不关心路径是最短的。那么,您是否想要符合限制(边总和)的最高值(最大顶点总和)的路径?我上面所说的“最佳最短路径”的含义是什么?

标签: ruby graph graph-algorithm shortest-path weighted


【解决方案1】:

您可以找到an example of Djikstra's algorithm here。我要做的是添加一个变量来计算最短路径中的顶点数,并在确定最短路径甚至 后评估最短路径是否有太多顶点或太长。

【讨论】:

    【解决方案2】:

    这个问题实际上是 NP 难的,你可以通过减少 Hamiltonian path problem 来证明这个问题。基本上给定哈密顿路径问题的输入(我们可以继续使用无向图),如果按照以下步骤操作,您可以为您描述的问题创建输入:

    • 建立一个新的图表

      创建一个与接收哈密顿路径问题相同但赋予每个顶点和边权重 1 的新图。

    • 为您的问题创建输入

      将刚刚在上一步中创建的图表传递给您的问题,并且限制等于无穷大。

    现在请注意,您的问题给出的结果是一条在顶点数上尽可能长的路径,因为极限限制是边权重总和的上限。这意味着您可以添加尽可能多的顶点,但仍会抱怨限制限制。

    路径中有多少顶点决定了它的总值(路径中的顶点数),因为所有顶点的权重都是 1。所以得到的路径是图中最长的可能。有了这个洞察力,我们可以验证这条路径是否是哈密顿路径,只需检查路径的长度。如果路径的长度为 N,其中 N 是图中的节点数,则存在哈密顿路径,否则不存在。

    要解决此问题,您可以使用类似于Bellman-Ford 的方法并进行一些修改。首先创建一个矩阵 A[i, j],在其中存储所有以 j 结尾且长度(边数)为 i 的最高总值路径。这是关键,你不能只存储这条路径中的一个,因为在下一步中你需要检查所有这些以放松,这里是实现变成非多项式的地方。步骤 i 中的放松技术遍历 A[i-1, u] 中的所有存储路径,并尝试改进 A[i, v] 中的值,保存实际执行它的新路径(您必须检查 >=当尝试改进 A[i, v] 以获得所有路径时),当然这种放松考虑到限制限制。如果您使用全局最大值和全局路径并在每个松弛过程中对其进行更新,则会以整个图形的最高值路径结束。

    【讨论】:

      猜你喜欢
      • 2016-01-21
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2020-01-20
      • 2019-05-05
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多