是否有任何可用的python路径查找库?

时间:2011-08-01 11:43:45

标签: python c performance path-finding

我正在使用python中的实时等距RPG,并希望将移动设备作为平台。我遇到困难的主要领域是我的寻路。我尝试了一些算法,包括A *和一些调整,以更好地适应我正在使用的地图。

我对我的算法结果感到满意 - 它们在确定性的同时给出了一些智能的假象,并且在任一方向上都是一致的,这样两个以两个角色为目标位置的角色就会在中间碰撞。

我的问题是虽然PC上的结果看起来很好,我可以要求所有的处理能力,但在我的手机上却是另一个故事,并且在计算算法时经常会出现第二次或更多延迟。出于这个原因,我正在考虑使用用C编写的性能最密集的代码为此编写一个库,但是如果有一个现有的解决方案,或者更好的方式我可以做到这一点,我会全力以赴。

我偶然发现了python-pathfinding,但这似乎比我为自己的用例构建的要慢。


我的用例:

我的地图是由水平建造的,这些水平被墙壁(可见或不可见)包围,并且必须通过门(可见或不可见)链接。

我目前的方法是使用两种不同的算法:

  • 在一个房间内,我将单个图块搜索为节点,每个边界作为等成本边缘,在目标位置的方向上使用深度优先

  • 在每个门都是节点的房间之间。使用第一算法计算通过房间(从门到门)的最短可能路径,并将其存储在哈希表中作为这些节点之间的边缘成本。然后计算可以遍历从一个节点到另一个节点的边集,并将其存储在哈希表中,并且不允许在同一路径中多次包含相同的边。

我在启动时产生了一个单独的进程,它使用第一个算法生成第二个算法的图形,这解决了我的许多问题,房间往往相对较小,因此即时路径的惩罚 - 发现保持低于其他情况,然后是更长的距离:

  • 第一个算法用于计算从当前位置到当前房间每个门的距离。
  • 第一个算法用于计算目标房间内每扇门到目标位置的距离。
  • 第二个算法的输出用于获取房间之间的路径集
  • 这些费用加到了第一扇门和最后一扇门的费用
  • 解决方案集按成本排序,使得相同成本的路径顺序始终保持一致
  • 选择解决方案集中的第一项。

4 个答案:

答案 0 :(得分:5)

首先,我知道一个非常有效和通用的库来处理A *搜索算法。它是lib2dp。您可以轻松地将python生成的图形插入此库并快速回答。

其次,A *基本上很适合找到最佳路径:

  • 您可以获得有关周围环境的完整信息。
  • 您的周围环境被视为“静止”。

如果您违反其中一条规则,您可能需要考虑一种名为“D*”的替代算法。

当然,这在性能方面有巨大的成本。因此,您可以为您的计划找到最佳权衡。

答案 1 :(得分:4)

如果你可以将你的游戏环境缩小为图形,那么http://networkx.lanl.gov/有很多很好的内置算法用于此类事情。

答案 2 :(得分:2)

如果您已经拥有了python版本,那么为什么不通过py2cmod运行它?这应该可以让你获得当前算法的c版本。

另一种选择是psyco,但它的开销很高。

答案 3 :(得分:1)

您可能需要查看libtcodlibtcodpy Python包装器。但就个人而言,我不太喜欢包装器不是非常Pythonic,是一个不必要的单片脚本,过度使用函数名称前缀(至少,我最后一次使用它)。我在某一点上重构了包装并为Python 3修复了它,但那是一年前的事情,所以事情可能已经改变了。