有没有适用于Python的可用的路径规划库?

14

我正在用Python开发一个实时等角RPG游戏,并希望将其作为移动设备的平台。 我遇到困难的主要领域是路径规划。 我尝试了一些算法,包括A *和一些调整来更好地适应我的地图。

我对我的算法结果感到满意-它们在给人以智能幻觉的同时是确定性的,并且在两个角色互相定位的情况下始终具有一致性,以便它们会在中间碰撞。

问题在于,虽然在我有足够处理能力的PC上结果看起来不错,但在我的手机上却完全不同,并且往往需要一两秒钟的延迟来计算算法。因此,我正在考虑编写一个库,其中最耗费性能的代码用C编写,但如果有现成的解决方案或更好的方法,我愿意倾听。

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


我的使用情况:

我的地图是由关卡构建而成的,每个关卡都由墙壁(可见或不可见)包围,并且必须通过门(可见或不可见)连接。

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

  • 在一个房间内,我将每个方块作为节点进行搜索,边缘作为相等成本的边缘,并以朝向目标地点的深度优先方式搜索。

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

我在启动时生成一个独立的进程,使用第一算法生成第二算法所需的图表,这解决了我的许多问题,因为房间往往相对较小,因此即时路径查找的惩罚保持较低,然后针对较长距离:

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

你如何使用Python针对移动设备进行开发?我知道Android有一个Python运行时,但我认为它仍然存在一些问题,而且我不知道是否有任何方法在iOS上运行Python。只是好奇。 - Mitch Lindgren
我主要针对的平台是Maemo/Meego,该平台本身支持它,但是您也可以生成自包含的可分发软件包。 - theheadofabroom
4个回答

5
首先,我知道一个非常高效和通用的库来处理A*搜索算法,它是lib2dp。您可以轻松地将Python生成的图形插入到此库中并快速获得答案。
其次,A*本质上是用于找到最优路径的算法,具体取决于以下因素:
  • 您拥有完美且全面的环境信息。
  • 您的环境被视为“静态”的。
如果您违反了这些规则,您可能需要考虑一种名为“D*”的替代算法。
当然,这会带来巨大的性能成本。因此,您需要找到最佳的权衡方案来为您的程序服务。

4

2
如果您已经拥有了一个您满意的 Python 版本,那么为什么不通过 py2cmod 将其运行一遍呢?这样就可以将您当前算法的大部分转换成 C 语言版本。
另一个选择是 psyco,不过它有很高的开销。

它在优化算法和数据结构方面有多好?Python的新式类等可能存在很多开销,而我在C语言中不需要这些,可能还有一些可以通过指针算术高效完成的部分。我不相信Psyco支持所有版本的Python,这意味着目前对我来说不可用。我将不得不查看结果。 - theheadofabroom
我自己也不太确定,但是Python与C的集成很好。我的想法是尽可能透明地完成这个过程。就像使用C和汇编语言一样。不是重写整个程序,而是将其转换为基础版本,然后从那里开始。我怀疑你不会找到一个不需要用另一种语言重写或重构以使用不同库的解决方案,这几乎是相同的事情。 - Spencer Rathbun
是的,我想你说得对。如果没有人能推荐一个像样的预制库,那我可能会尝试一下这个。我只是希望找到一个已经比较成熟的东西,这样我就不需要花太多时间调试等问题上,可以把更多的精力放在项目的其他方面。 - theheadofabroom
这总是更可取的,但并非总是可用。无论你想到什么,都应该考虑为Python社区中的其他人记录它。如果其他人也有同样的问题,我不会感到惊讶。也就是说,需要将一组函数转换为C语言以提高速度的工作Python程序。 - Spencer Rathbun

1
你可能会想要查看libtcodlibtcodpy Python包装器。个人而言,我不太喜欢这个包装器不是很“Pythonic”,因为它是一个不必要的单块脚本,使用了过多的函数名称前缀(至少我上次使用时是这样)。我曾经重构过这个包装器,并为Python 3修复了它,但那是一年前的事情,所以现在可能已经发生了变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接