Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个坐标之间的最短路径,通过坐标集-Javascript_Javascript_Algorithm_Shortest Path_Path Finding_A Star - Fatal编程技术网

两个坐标之间的最短路径,通过坐标集-Javascript

两个坐标之间的最短路径,通过坐标集-Javascript,javascript,algorithm,shortest-path,path-finding,a-star,Javascript,Algorithm,Shortest Path,Path Finding,A Star,我需要编写一个JavaScript算法来找到两个坐标之间的最短路径。我已经研究了使用一些路由查找算法,比如a*算法 然而,我的应用程序的不同之处在于,我知道该路径可以采用的所有坐标 例如,在下图中,绿色正方形是起始位置,红色正方形是结束位置。由每个黑方块表示的共字将存储在数组(或其他数据结构)中 所以我需要从绿色广场到红色广场的最短路径,但它只能通过一个黑色广场到达那里。我还会使用A*算法来实现这一点吗 是的,您可以使用*。您将计算从每个黑色坐标到红色正方形的距离(移动次数)。然后得到一个图结构

我需要编写一个JavaScript算法来找到两个坐标之间的最短路径。我已经研究了使用一些路由查找算法,比如a*算法

然而,我的应用程序的不同之处在于,我知道该路径可以采用的所有坐标

例如,在下图中,绿色正方形是起始位置,红色正方形是结束位置。由每个黑方块表示的共字将存储在数组(或其他数据结构)中

所以我需要从绿色广场到红色广场的最短路径,但它只能通过一个黑色广场到达那里。我还会使用A*算法来实现这一点吗


是的,您可以使用*。您将计算从每个黑色坐标到红色正方形的距离(移动次数)。然后得到一个图结构,从哪个正方形到哪个正方形可以移动,图中的每个节点都有存储到红方块的距离。然后将A*应用于该图,得到最短路径

编辑


对于一个*你需要一个启发式,告诉你哪个节点更接近端点。计算黑场和红场之间的“空中距离”可以为每个场提供这种启发式。然后你做一个*,基本上是带有启发式的Dijkstra算法。在您的示例中,绿色和红色字段之间的空气距离如果左上角为(x=0,y=0),红色为(14,7),绿色为(0,1),则空气距离为ABS(14-0)+ABS(7-1)=20。因此,从坐标计算起来非常容易。

你可以对角移动吗?是的,允许对角移动。对不起,我应该指定的@为什么你不能用*?从我的研究看来,我只能发现A*在寻找路径时使用了所有的坐标。我能只用这组黑色坐标吗@Ash您可以使用A*,但如果路径受到相当大的限制,则您对剩余距离的估计必须更加保守。如果估计变得过于保守,那么所需的开销可能会使A*的表现比Dijkstra差。谢谢你的快速回答!这对对角线运动是否同样有效?是的,从一个节点到其他节点的连接最多可能增加4个。因为有对角线移动时,一个节点最多可以有8个可能的邻居,而没有对角线移动时,一个节点最多可以有4个。计算距离的方法不同,因为对角线更短。“计算距离的方法也不同”更准确地说,是
max(| x1-x2 |,| y1-y2 |)
(其中
|…|
为abs)。这个解决方案似乎类似于,先做Dijkstra,然后做A*。一旦你数完黑色方块(如果你一直在用指针指向下一个方块),你已经有了你的解决方案,那么为什么要A*?我应该在我的答案中更清楚一些。我对它进行了编辑。我认为这是他问题中的一个简单例子。但如果有一个更复杂的世界,a*可以派上用场。