【问题标题】:Shortest route between locations algorithm位置算法之间的最短路径
【发布时间】:2015-01-13 15:13:08
【问题描述】:

我需要找到 2 个地点之间的最短路线。详细说明:

我得到一个包含 3 列的 excel 文件:city1、city2、它们之间的距离。条件是如果city1 和city2 之间有一条路线,那么city2 和city1 之间就有一条路线。

该文件有多行,任务是读取它并根据城市 X 和城市 Y 之间的距离确定最短路径。但是,在表格中,路径可能如下所示:

...

X、N、100

X、M、200

U,Y,50

X、U、20

...

我。 e.从 X 到 Y 没有直接路径,问题的答案是 X -> U -> Y = 20 + 50 = 70,这是最短距离。在这种形式中,在要求的出发点和到达点之间可能有许多位置。

UI 询问出发地、目的地并输出它们之间的最短路径。

我希望我能很好地解释它以理解这个想法。我试图在 C# 中解决这个问题,但我更多的是寻找一种通用方法,一种解决这个问题的算法。我意识到它可能与Travelling salesman problem 有点相关,但我无法应用它。

感谢任何方向/帮助/代码示例。

【问题讨论】:

  • 看看A*吧? en.wikipedia.org/wiki/A*_search_algorithm
  • 你想要的是Shortest path problem,而不是旅行推销员问题。
  • 在最短路径问题和旅行商问题之间存在指数差异。这对你来说是幸运的。

标签: c# algorithm


【解决方案1】:

所描述的问题在算法上比Travelling Salesman 问题(NP-hard)更容易。就是Shortest Path问题,可以用Dijkstra's algorithm高效解决。该算法要求距离为非负长度,这似乎是您的上下文的情况,因为边缘权重是非负的。

【讨论】:

  • 不,我的错。 Dijkstra 确实不接受负边缘。有一个example here
  • 是的,Dijkstra 就是您想要的。这是 C# 中的一个实现 - c-sharpcorner.com/Blogs/15009/…
  • @JuanLopes 感谢您的澄清。事实上,如果允许负循环,则优化问题的定义有些不明确,因为可能存在任意小的负长度路径。
  • 克服负长度很简单。你找到最小的一个(绝对值最大的负边),然后从所有边中减去它的长度。因此,如果最小边的长度为 (-100),则将所有边加 100。然后你坐下来运行算法。
猜你喜欢
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多