繁体   English   中英

未加权的有向图路径查找(最快?)

[英]Unweighted, directed graph path finding (fastest?)

我正在开发一个PHP类,该类可以在未加权和有向图系统(尤其是EVE Online)中从两点计算路线。 我从来没有开发过图形解决方案,所以我真的不知道什么是最快的计算图形路径的方法,所以即使我只发现了以数学为中心的讨论或过于具体的解决方案,我还是四处看看。

我的第一个想法是找到从节点A到节点B的所有路径,并比较它们的长度。 后来我注意到这是不必要的,因为我不需要进行比较,而是找到第一个最短的路径。

然后,我创建了一个递归系统,该递归系统实现了“加深深度优先搜索”算法(我在此处提出),但是当两个节点之间的距离增加时,使用它仍然太繁重。 我在几秒钟内成功地完成了16步或更短的路径跟踪。 当搜索更远的节点时,它不会在90秒内完成。

您能帮我找到一个更快的解决方案吗? 我曾考虑过创建一个包含各个节点之间的所有距离和路径的表,但是我们谈论的是数千个节点,它将永久性地构建(并维护)它。

http://hastebin.com/tilusubeli.coffee

类“跳转”。

  • 该构造以字符串或整数的形式接受源(从)和目标(到)节点。 在前一种情况下,它将解析其ID(整数)并使用它(方法getSystemID,您可以忽略它)。 “ jumpsTable”初始化程序将以以下形式创建一个数组:

$this->jumpsTable[node_id] = array(next_node_id_1, next_node_id_2, ...)

jumpsTable是图形的数据表示形式。

  • 公用方法“分析”将仅调用IDDFS

算法:

  • IDDFS调用深度为0的DLS,并一直持续到(最大深度),直到DLS返回有效路径为止。 这样,它将不会在两条相同长度的路线之间进行选择,但会选择第一条路线。

  • DLS是一种递归方法,它查找其“子节点”:如果子节点中的一个是目标节点,则返回路径,否则它以深度值递减的方式将每个子节点称为“起始节点”。 如果DLS的任何调用返回路径,请退出循环。 如果没有DLS返回路径,则返回null。

如果进行深度优先搜索,则不能保证找到的第一条路径是最短的。 相反,您应该执行广度优先搜索 ,因为您的图形未加权(否则,标准算法将为A * )。

但是,由于递归方法不适合广度优先搜索,因此您需要对实现进行彻底的修改。 请注意,这是一种非常经典的算法,对于您来说,找到现有的PHP实现(如实现)并将其适应您自己的数据结构应该更加容易。

PS:解决问题的另一种方法是使用深度优先搜索并进行迭代加深 ,这基本上是使用深度限制应用深度优先搜索,然后以增加的限制重复应用(直到找到目标节点) )。

PPS:如果时间是主要问题,请确保检查您对同一节点的处理没有多次。

PPPS:您可能对此问题感兴趣: 给定一个有向图,找出两个节点之间是否存在路由

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM