algorithm - 星搜索 : a lot of nodes and a "slow" CheckLink between nodes. .. 有什么建议吗?

标签 algorithm search a-star

我面临优化问题:

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

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

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

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

预先构建图表是难以管理的,需要检查 N^2 个链接,它太慢了。目前(几乎)只有在没有解决方案,没有从头到尾的路径时才构建整个图。

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

最佳答案

这真的是两个问题合二为一。我不熟悉 Bresenham 算法,所以我只能建议您查看 Wikipedia 中给出的优化。以及那里的链接。

至于 A*:正如我之前所说,构建几乎整个图几乎是不可避免的。您可以尝试递归最佳优先搜索或 IDA*(Russell & Norvig,第 2 版第 4 章)等变体,以节省一些内存,如果您的内存较慢,也许还可以节省一些时间。

根据您的图形结构,实现双向搜索可能也是值得的。最简单的 bidir 算法会在一个线程中运行 A* 搜索,从 A 到 B,然后在另一个线程中从 B 到 A,直到它们中的任何一个找到解决方案发现它被卡住了。然后可以杀死另一个线程。 (这样做的一个问题是,如果有解决方案,您已经浪费了很多时间,因此它只有在您有一个空闲的处理器核心时才有用。)

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

关于algorithm - 星搜索 : a lot of nodes and a "slow" CheckLink between nodes. .. 有什么建议吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5368610/

相关文章:

algorithm - 通过删除边将树分成相等的部分

python - 找出字符连续的最长子串,这里的字符串可能是乱码

string - 从列表列表中对字符串进行分组的算法

文本中多词匹配的算法

html - 崇高文本 2 : How to search for every instance of an applied class?

algorithm - AN* 算法中的曼哈顿、欧几里得和切比雪夫

python - 如何从数组中删除特定元素而不删除其以后出现的元素

python - 这个 python 代码试图做什么

java - 表示 map 并在其上运行 A*

java - Java中A星(A*)算法的实现