gpt4 book ai didi

algorithm - 基于 Dijkstra 的缓存算法优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:47:32 25 4
gpt4 key购买 nike

我需要找到连接两个平面点的最佳路径。我得到了一个确定最大前进速度的函数,它取决于位置和时间。

我的解决方案基于 Dijkstra 算法。起初我用二维格子覆盖平面,只考虑离散点。点按照指定的顺序连接到它们的邻居,以获得足够的方向分辨率。然后我通过(某种)Dijkstra 算法找到最佳路径。接下来我提高找到的路径的分辨率/质量。我增加了晶格密度和相邻连接顺序,同时将搜索限制在距离已找到路径足够近的点。这可能会重复,直到达到所需的分辨率。

这通常效果很好,但我还是想提高整体算法性能。基于价格函数的“平滑度”,我实现了几个技巧,例如可变晶格密度和相邻连接顺序。然而,我相信有可能改进 Dijkstra 算法本身(适用于我的特定图形),我还没有完全意识到这一点。

首先让我们就术语达成一致。我将所有格点分为 3 类:

  • - 算法尚未达到的点。
  • 温暖 - 已达到但尚未完全处理(即有改进潜力)的点
  • 稳定 - 完全处理的点。

Dijkstra 算法在每一步都选择“最便宜的” 格点,然后尝试提高其邻居的价格。由于我的图表的性质,我得到了一种由稳定点组成的云,周围环绕着一层薄薄的点。在每个步骤中,都会处理云周边的一个点,然后将其添加到稳定云中,并且周边(可能)展开。

问题是算法随后处理的点通常在空间上(因此在拓扑上)不相关。典型的 边界由数十万个点组成。在每一步中,要处理的下一个点都是伪随机的(空间上的),因此两个相关点几乎不可能一个接一个地处理。

这确实造成了 CPU 缓存利用率的问题。在每一步,CPU 都会处理伪随机内存位置。由于存在大量的点 - 所有相关数据可能无法容纳 CPU 缓存(大约为数十至数百 MB)。

嗯,这确实是Dijkstra算法的涵义。整个想法明确是选择最便宜的点,而不考虑其他属性。

但是从直觉上很明显,大云周边一侧的点对另一侧的点没有任何意义(在我们的特定情况下),并且交换他们的点没有问题加工订单。

因此,我想到了“调整” 点处理顺序的方法,但总体上不影响算法。我想了几个想法,比如把飞机分成 block ,然后独立地部分解决它们,直到满足一些标准,这意味着他们的解决方案可能会受到干扰。或者忽略干扰,并可能允许“重新求解”(即从稳定转换回温暖)。

然而目前我还没有找到严谨的方法。

有什么想法可以做到这一点吗?也许这是一个已知问题,现有研究和(希望)解决方案?

提前致谢。很抱歉问了这么长的问题。

最佳答案

您所描述的是 A* search algorithm 背后的动机,这是对 Dijkstra 算法的一种修改,它可以通过将搜索引导到一个可能会选择越来越接近目的地的点的方向来显着提高运行时间。 A* 永远不会比朴素的 Dijkstra 实现做更多的工作,并且通常倾向于扩展聚集在最靠近目标节点的暖节点边界上的节点。

在内部,A* 的工作原理是使用启发式函数增强 Dijkstra 算法,该函数估计到目标节点的剩余距离。这意味着,如果您可以粗略估计给定节点距目的地的距离,您最终可以忽略不需要处理的节点,而选择可能更好的节点。

A* 并非设计为缓存优化算法,但我相信速度的提高是由于

  1. 扩展更少的节点(在缓存中更少),以及
  2. 扩展更接近目标的节点(最近处理的节点因此更有可能在缓存中)

会给你带来巨大的性能提升和更好的缓存性能。

希望这对您有所帮助!

关于algorithm - 基于 Dijkstra 的缓存算法优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com