【问题标题】:Fast path cache generation for a connected node graph连接节点图的快速路径缓存生成
【发布时间】:2010-06-02 09:50:14
【问题描述】:

我正在尝试在我正在为连接节点图开发的游戏中获得更快的寻路机制。节点分为“网络”和“路由器”两种类型。


在这张图片中,蓝色圆圈代表路由器,灰色矩形代表网络。

每个网络都有一个它所连接的路由器的列表,反之亦然。路由器不能直接连接到其他路由器,网络也不能直接连接到其他网络。


网络列出了他们连接到的路由器



路由器也是如此

我需要一种算法,该算法将针对每个可能的源和目标网络(不包括源和目标是同一网络的路径)绘制出一条路径,以跨越的网络数量来衡量。我现在有一个,但是它非常慢,大约需要两秒钟来绘制路径,这对于所有连接的玩家来说都非常明显。

当前的算法是深度优先的蛮力搜索(它在大约一个小时内被拼凑在一起,只是为了让路径缓存正常工作),它按照遍历的顺序返回一个网络数组,这就解释了为什么会这样减缓。有没有更高效的算法?

附带说明,虽然这些示例图有四个网络,但实际图中有 55 个网络和大约 20 个路由器在使用中。不可能的路径也可能出现,并且在任何时候网络/路由器图形拓扑都可能发生变化,需要重建路径缓存。

哪种方法/算法可能会为此类图表提供最佳结果?

【问题讨论】:

  • 如果需要,我可以在提出问题时提供用于构建缓存的代码

标签: theory path-finding


【解决方案1】:

Dijkstra 的最短路径算法是经典的,但只针对静态图设计。

您可以尝试在网上搜索动态最短过去算法。

这是一篇似乎相关的论文:http://www.utdallas.edu/~edsha/papers/bin/Globecom04_SPT.pdf (并且可能会给你其他线索)。

本文描述了一个路由器网络,其中每个路由器都维护自己的最短路径表。也许你可以做类似的事情。

我建议您也总体上查看路由算法,因为采用最短路径总是可能导致拥塞等(我在想 16 队 Halo!)。您可能还想加入负载平衡等。

希望对你有帮助。

【讨论】:

  • 在网络环境中,流量级别/等是不相关的,因为它只是一个简单的高级模拟。游戏是用一种编译成字节码然后解释的语言编码的,因此功能需要相对轻量级(并且将路径从一个网络移动到另一个网络的代码与它在不删除功能的情况下获得的效率差不多)。只要我能快速构建任何有效路径或快速确定不存在这样的路径(或两者的某种妥协),我就很高兴。
  • @Sukasa:那么,您可能会发现将图表拆分为双连通组件很有用。
  • @Moron 您能否提供更多信息?关于它们的维基百科文章让我有点不确定
  • @Sukasa:双连接(或 2 连接)组件是一个图,其中每对顶点之间至少有两条不相交的路径。因此,如果您将图表拆分为 2 个连接的组件,然后找到“边缘”网络/路由器,它可能会加快速度。例如要从组件 A 到 C,您可能必须经过组件 B,如果您知道边缘连接器,那么您可能很快就能找到路径。在您(可能)需要进行一些重新映射之前,至少需要删除 2 次边缘。这只是一个我认为您可能会觉得有用的想法。
  • @Sukasa:另外,您可能会发现 en.wikipedia.org/wiki/Biconnected_component 的 Other Algorithms 部分很有用,其中讨论了动态双连接组件算法(由 Westbrook 和 Tarjan 编写)。
【解决方案2】:

您可能希望查看经典网络领域。这不是确切的答案,但应该为您提供“优于蛮力”算法的起点。

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2016-11-04
    • 2019-06-19
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多