两个节点之间最便宜和最短的路径
Posted
技术标签:
【中文标题】两个节点之间最便宜和最短的路径【英文标题】:Cheapest and shortest path between two nodes 【发布时间】:2017-04-18 13:40:11 【问题描述】:我需要在带循环的加权图中找到。我正在 Prolog 中实现它。
由于我必须找到 cheapest(最便宜)和 shortest(最短)路径,我想我应该使用以下方法计算所有现有的可能路径具有回溯的深度优先搜索,因为它的内存消耗低且相对较快(我使用辅助列表来跟踪访问过的节点以处理循环问题),然后从收集的路径列表中选择最便宜和最短路径。
我排除了使用启发式算法(例如 A*)的可能性,因为虽然速度更快,但它们依赖于估计函数,并且在估计可能错误的某些特定情况下,它们可能会给出错误的答案。我不想要好的解决方案,我想要最好的解决方案。
所以我的问题是:我对这个问题给出的方法是否有意义,更具体地说,是为了确保我在两个具有循环的节点之间的图形问题中获得最多/最少的东西(例如最便宜)的路径,确实计算所有现有解决方案然后通过与其他解决方案进行比较来选择正确的解决方案是有意义的,还是我以错误的方式解决这个问题?
【问题讨论】:
Seeing as A* 是基于 Dijkstra 的算法,但是使用启发式算法来加速它(你不想要),为什么不直接使用 Dijkstra 的算法呢? @JosephYoung 老实说,我没有考虑过使用 Dijkstra。但这可能是更好的选择。不过,您认为收集所有解决方案然后从中挑选您想要的解决方案是不是很糟糕? 这里最便宜和最短是什么意思?边有权重吗?如果是,它们可以是负数吗? @kraskevich 节点代表城市。城市之间有距离和旅行价格。一些城市只能通过某些交通工具到达,这意味着前往这些城市的费用比前往其他城市要贵。 这两个实际上是独立的问题吗?最短路径和最便宜路径可以完全不同吗? 【参考方案1】:这里不需要使用自定义算法。您可以只使用标准的最短路径查找算法(如果所有权重都是非负的,则使用 Dijkstra 算法,否则使用 Ford-Bellman 或 Floyd 算法)。边的权重应该分别是第一个和第二个问题的成本和距离。
【讨论】:
这是否意味着我必须对 Dijkstra 算法进行两个实现并同时运行它们?一个找到最便宜的路径,另一个找到最短的路径? 不,这意味着路径的成本将是一对(成本,距离)。因此,当比较两条路径 a 和 b 时。你选择成本较小的那个,如果它们的成本相同,你就选择距离较短的那个。 但最短最便宜的可能是两条不同的路,你说的只能给我一条。 @JoãoPaiva 是的,我的意思是有必要构建两个图并运行 Dijkstra 的算法两次。 @JoãoPaiva 是的。唯一的限制是所有权重都必须是非负的。以上是关于两个节点之间最便宜和最短的路径的主要内容,如果未能解决你的问题,请参考以下文章