繁体   English   中英

对于通过实加权无向图的单对最短路径,最简单的算法/解决方案是什么?

[英]What's the simplest algorithm/solution for a single pair shortest path through a real-weighted undirected graph?

我需要通过无向图找到最短路径,其节点是实数(正和负)加权。 这些权重就像您可以通过输入节点获得或松散的资源。

路径的总成本(资源总和)不是很重要,但必须大于0,并且长度必须尽可能短。

例如,考虑如下图:

A-start node; D-end node

A(+10)--B( 0 )--C(-5 )
     \     |    /
       \   |  /
D(-5 )--E(-5 )--F(+10)

最短的路径是AEFED

Dijkstra的算法本身并不起作用,因为它无法处理负值。 所以,我想了几个解决方案:

首先使用Dijkstra算法计算从每个节点到出口节点的最短路径的长度,而不考虑权重。 这可以像A *中的某种启发式值一样使用。 我不确定这个解决方案是否可行,而且成本也很高。 我也想过实现Floyd-Warshall的算法,但我不确定如何。

另一个解决方案是使用Dijkstra算法计算最短路径而不考虑权重,如果在计算路径的资源总和后它小于零,则通过每个节点找到可以快速增加资源总和的相邻节点,并将其添加到路径(如果需要,可以多次)。 如果有一个节点足以增加资源总和,但距计算的最短路径更远,则此解决方案将不起作用。

例如:

A- start node; E- end node
A(+10)--B(-5 )--C(+40)
      \
        D(-5 )--E(-5 )

你能帮我解决这个问题吗?

编辑:如果在计算最短路径时,您到达资源总和等于零的点,该路径无效,因为如果没有更多的汽油则无法继续。

编辑:我没有读好这个问题; 问题比常规的单源最短路径问题更先进。 我现在要离开这篇文章,只是为了给你另一个你可能觉得有用的算法。

即使在存在具有负权重的边缘的情况下, Bellman-Ford算法也解决了单源最短路径问题。 但是,它不处理负循环 (图中的圆形路径,其权重和为负)。 如果你的图形包含负周期,那么你可能遇到了麻烦,因为我相信这会使问题NP完全(因为它对应于最长的简单路径问题 )。

这似乎不是一个优雅的解决方案,但考虑到创建循环路径的能力,我没有看到它的方法。 但我会迭代地解决它。 使用第二个示例 - 从A处的点开始,给它A的值。 移动一个'转弯' - 现在我有两个点,一个在B,值为5,另一个在D也值为5.再次移动 - 现在我有4个要跟踪的点。 C:45,A:15,A:15,E:0。可能E上的那个可以振荡并变得有效,所以我们不能把它扔掉。 移动和累积等。第一次到达具有正值的结束节点时,您已完成(尽管在同一回合可能有其他等效路径)

显然有问题的是跟踪点的数量会很快上升,我认为你的实际图形比例子复杂得多。

我会像Mikeb建议的那样做:在可能状态的图表上进行广度优先搜索,即(位置,燃料左) - 对。

使用示例图表:

由示例图生成的状态图

  • 八角形:燃料耗尽
  • 框:由于空间原因省略了子节点

搜索此图表, 如果存在此类路径,则保证广度优先为您提供实际到达目标的最短路径。 如果没有,您将不得不放弃一段时间(搜索x个节点之后,或者当您到达的分数大于所有负分数的绝对值的节点时),因为图形可以包含无限循环。

如果你想找到最便宜的路径(燃料方式),你必须确保在找到目标时不立即中止,因为你可能会发现多条相同长度的路径,但费用不同。

尝试将最小权重的绝对值(在本例中为5)添加到所有权重。 这将避免负面的ciclic路径

当前的最短路径算法需要计算到每个节点的最短路径,因为它在一些节点上组合解决方案,这将有助于调整其他节点中的最短路径。 无法仅为一个节点制作它。

祝好运

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM