Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.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
Algorithm 两个对象间最短路径的算法_Algorithm_D3.js_Shortest Path - Fatal编程技术网

Algorithm 两个对象间最短路径的算法

Algorithm 两个对象间最短路径的算法,algorithm,d3.js,shortest-path,Algorithm,D3.js,Shortest Path,我有一个楼层平面图,上面有很多d3.js多边形对象,代表展位。我想知道最好的方法是在两个对象之间找到一条不与其他对象重叠的路径。这里的用例是,我们有展位,希望向用户展示如何以最高效的方式从a点步行到b点。我们可以假设路径必须只包含90度或45度转弯 我们尝试过使用迪杰克斯特拉,但它的规模似乎离我们越来越远 我们系统的快照示例: 我们的限制是,这需要在浏览器中运行。如果它能与d3.js一起很好地工作,那就太好了。这个问题被称为在有多边形障碍物的两点之间寻找最短路径,并在文献中进行了大量研究。参见

我有一个楼层平面图,上面有很多d3.js多边形对象,代表展位。我想知道最好的方法是在两个对象之间找到一条不与其他对象重叠的路径。这里的用例是,我们有展位,希望向用户展示如何以最高效的方式从a点步行到b点。我们可以假设路径必须只包含90度或45度转弯

我们尝试过使用迪杰克斯特拉,但它的规模似乎离我们越来越远

我们系统的快照示例:


我们的限制是,这需要在浏览器中运行。如果它能与d3.js一起很好地工作,那就太好了。

这个问题被称为在有多边形障碍物的两点之间寻找最短路径,并在文献中进行了大量研究。参见示例。所有的算法都是将问题转化为图论问题,然后运行Dijkstra。要做到这一点:

  • 任何多边形中的每个顶点都是图形中的顶点
  • 起点和终点也是图形中的顶点
  • 在两个顶点之间有一条边,如果它们彼此可见,我们可以使用三角剖分算法来实现这一点
  • 每条边的权重是欧氏空间中其两个端点之间的距离

  • 现在我们可以运行任何最短路径算法了。最难的部分是三角剖分,我认为该库适合您的要求。另一个更简单的方法是通过我在第一行中提到的关键字搜索web,以找到实现。我没有链接到任何实现,因为我认为最好用算法的方式说它对未来的读者有用。

    因为布局是一个矩阵(或嵌套矩阵),这不是Dijkstra问题,它比这个简单。这个问题的技术名称是“Manhatten路由”。我将在下图中向您展示一个最佳路线(蓝线)的示例,而不是给出代码算法。从这一点可以看出,算法是什么:
    注意,这里有一个微妙的差别,那就是你总是希望最大化慢跑的次数,因为即使整体形状是一个矩阵,在每个角落,人实际上都会斜行(想象一个人斜行穿过一个四向交叉口)。因此,简单地向北走,然后向西走是错误的,因为你只能走一个拐角,但在显示的路线上,你可以走五个拐角。

    Dijkstra到底是如何不适合你的?根据描述,我看不出这个问题会给Dijkstra带来什么麻烦。如果您的意思是它太慢,那么必须有一个低效的实现。即使是包含数百个节点的图形,Dijkstra也应该能给你带来不错的性能。人们能爬过隔间吗?真棒的人。这是一个非常简单的方法,谢谢你的帮助。这是一个错误的答案,可能这是获得好配音的最佳方法,但它不是获得最佳方法,不需要有直线路径。反例很容易画,但不容易描述(我想你至少可以想象一个反例)。我在回答中提到的这个问题非常有名,不像你写的那么容易。无论如何,在下划线图上使用Dijkstra并不耗时。