我需要通过一个无向图找到一条最短路径,该图的节点是实数(正负)加权。这些权重就像您可以通过进入节点获得或失去的资源。
路径的总成本(资源总和)不是很重要,但它必须大于 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 )
你能帮我解决这个问题吗?
编辑:如果在计算最短路径时,您到达资源总和为零的点,则该路径无效,因为如果没有更多汽油,您将无法继续。