2D网格上有N个点(x,y)。我需要找到从A点到B点的最短路径,但是我只能从一个点移动到另一个点,如果它们之间的距离远远超过距离D,我就不能在两点之间行进。我认为它可能通过使用某种改进的Dijkstra算法来解决,但我不确定如何,因为我以前从未实现它,只是在Wiki上研究它。
答案 0 :(得分:1)
嗯,Dijkstra在图表中找到了最短的路径。因此,只需将网格点视为图形中的节点,其中每个节点S与所有其他节点T之间的边缘使得dist(S,T)<= D.您不必实际构造图形,因为边缘是根据Dijkstra的需要轻松确定。只检查半径为S的S周围的正方形中的所有节点。如果f(Sx-Tx)^ 2(Sy-Ty)^ 2&lt; = D ^ 2,则存在S-T边缘。
答案 1 :(得分:0)
Wiki解释就足够了。
Dijkstra的算法需要3个输入。图形,起始节点和结束节点。 要构建图表,只需执行此操作
For i 1..n in points
For j i+1..n in points
if(dist(points[i],points[j])<=D)
add j to childs of i
add i to childs of j
构建图表后,执行dijkstra。
答案 2 :(得分:0)
这样一个问题的微妙之处在于一个关键的定义 - 你网格中距离的衡量标准是什么?
有许多不同的最短路径问题和解决方案,并且它们在整个数学中被研究。它们各自的特征在于被搜索区域的“拓扑”。考虑一些不同的拓扑结构及其自己的解决方案:
单面纸
假设你的网格代表一张纸上的坐标 - 最简单的路径很容易找到,因为它只是这些点之间的直线。
月亮表面
如果您的网格以纬度和经度表示月球上的位置,则最短路径是沿着月球表面的弧线 - 如果您在月球上的两个点之间“直线”开车,那么您将在由于月亮的曲率,弧线。
道路交叉口
如果要查找道路网格中两个交叉点之间的距离,每条道路上的交通速度不同,并且您只能沿着道路行驶,那么您可以使用Dijkstra算法找到最短路径。
单向道路交叉口
上述略有变化 - 我们只需要考虑一个方向的道路。在这种情况下可能没有任何路径。
<强>摘要强>
为了提供一个好的解决方案,我们需要了解网格的拓扑结构。如果距离是pythagerous定理而不是指示欧几里德几何(如纸张示例中所示),那么解是一条直线。
你是否有可能表示如果比D更接近,你可以在任意两点之间旅行 - 比如在机场之间飞机如何?
编辑:我没有看到你的评论,因为你没有使用@。在您的情况下,您的网格就像飞机可以在其间飞行的机场。使用Dijkstra算法找到最短路径 - 点的直接邻居都是比D更接近的点。找到它们,将它们全部表示为图形,并使用Dijkstra算法。答案 3 :(得分:-2)
我建议使用公式来找出2个点之间的距离,即sqrt((x2-x1)^ 2 +(y2-y1)^ 2)。这个距离总是在2点之间最短。