Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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_Search_A Star - Fatal编程技术网

Algorithm 星型搜索:大量节点和一个;“慢”;检查节点之间的链接。。。有什么建议吗?

Algorithm 星型搜索:大量节点和一个;“慢”;检查节点之间的链接。。。有什么建议吗?,algorithm,search,a-star,Algorithm,Search,A Star,我面临一个优化问题: 我有一个包含很多节点(10^5)的图,表示平面上的点 我需要在图上找到最短路径,以便从“开始节点”开始到达“结束节点” 可以连接或不连接任何一对节点。检查它们是否连接是一项非常昂贵的操作。如果它们是连接的,则与链接关联的权重是两个节点之间的欧几里德距离 目前,我只检查从“当前节点”到每个其他节点的所有链接,以便填写*的“打开列表”。我选择了A*,因为它似乎是寻路中最好的算法,而且对于节点J(H=到目标的距离)我有一个快速、可接受且简单的启发式H,但我不确定它是否适合我的问题

我面临一个优化问题:

我有一个包含很多节点(10^5)的图,表示平面上的点

我需要在图上找到最短路径,以便从“开始节点”开始到达“结束节点”

可以连接或不连接任何一对节点。检查它们是否连接是一项非常昂贵的操作。如果它们是连接的,则与链接关联的权重是两个节点之间的欧几里德距离

目前,我只检查从“当前节点”到每个其他节点的所有链接,以便填写*的“打开列表”。我选择了A*,因为它似乎是寻路中最好的算法,而且对于节点J(H=到目标的距离)我有一个快速、可接受且简单的启发式H,但我不确定它是否适合我的问题

在前面构建图形是不可管理的,需要检查N^2个链接,速度太慢。目前(almst),只有在没有解决方案,没有从开始到结束的路径时,才会构建整个图


我想要一个更好的解决方案的提示。。。谢谢大家!

除非你能处理一个不能保证最优解的贪婪算法,否则这种a*方法可能和你将要得到的一样好。如果没有允许修剪某些顶点的额外信息,路径不存在,则任何算法都无法避免检查每个顶点。也许可以优化CheckLink操作?链接信息是否可以以更快的格式缓存,或者每次运行时“类似图像”的数据是否会更改?

这实际上是两个问题合一。我不熟悉Bresenham算法,因此我只能建议您查看中给出的优化以及那里的链接

至于A*:正如我前面所说,几乎整个图形都是不可避免的。您可以尝试使用诸如递归最佳优先搜索或IDA*(第二版第4章)之类的变体,以节省一些内存,如果您的内存较慢,还可以节省一些时间

根据您的图形结构,实现双向搜索也可能是值得的。最简单的bidir算法将在一个线程中从A到B运行*搜索,在另一个线程中从B到A运行*搜索,直到其中一个找到解决方案或发现它被卡住为止。然后可以终止另一个线程。(这样做的一个问题是,如果有解决方案,您将浪费大量时间,因此只有当您有一个空闲的备用处理器内核时,它才有用。)


更复杂的算法还将检查两个线程是否在图中找到相同的点,然后杀死线程并合并它们的结果。这可以通过交错两个搜索中的步骤来实现;并行版本可能相当复杂。

CheckLink是如何实现的?在找不到解决方案的情况下,构建一个近乎完整的图是意料之中的。类似图像的网格上的Bresenham算法我忘记了从两端开始。这是个好建议。如果CheckLink不需要锁定,那么并行化也会很有帮助。