【问题标题】:Are there any usable path-finding libraries for python? [closed]是否有任何可用的 Python 寻路库? [关闭]
【发布时间】:2011-10-17 09:30:20
【问题描述】:

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

我对我的算法的结果感到满意——它们给人一种智能的错觉,同时具有确定性,并且在任一方向上都保持一致,这样两个针对彼此位置的角色就会在中间发生碰撞。

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

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


我的用例:

我的地图是从关卡构建的,这些关卡被墙壁(可见或不可见)包围,并且必须通过门(可见或不可见)连接。

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

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

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

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

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

【问题讨论】:

  • 您如何使用 Python 定位移动设备?我知道有一个适用于 Android 的 Python 运行时,但我认为它的边缘仍然很粗糙,而且我不知道在 iOS 上运行 Python 的任何方法。只是好奇。
  • 我一直瞄准的主要平台是 Maemo/Meego,它本机支持它,但是您可以生成自包含的可分发包。

标签: python c performance path-finding


【解决方案1】:

如果您可以将您的游戏环境简化为图表,那么http://networkx.lanl.gov/ 为此类事情提供了许多出色的内置算法。

【讨论】:

    【解决方案2】:

    如果您已经有了满意的 python 版本,那么为什么不通过py2cmod 运行它呢?这应该可以让您大部分时间获得当前算法的 c 版本。

    另一种选择是psyco,尽管它的开销很大。

    【讨论】:

    • 在优化算法和数据结构方面有多好? python的新样式类等可能有很多开销,而我在c中不需要这些开销,并且可能有相当多的位可以通过指针运算有效地完成。我不相信 psyco 支持所有版本的 python,这意味着它目前不适合我。我得看看结果。
    • 我自己也不确定,但是 python 与 c 有很好的集成。我的想法是尽可能透明地做到这一点。就像 c 和汇编一样。与其重写整个东西,不如把它转换成一个基本版本,然后从那里开始。我怀疑您会找到不需要用不同语言重写或重构以使用不同库的解决方案,这几乎是同一件事。
    • 是的,我想你是对的。如果没有人可以提供一个像样的预制库,我不妨试一试。我只是更喜欢已经有些成熟的东西,因为这样我就不必花太多时间调试等,而可以专注于项目的其余部分。
    • 这总是可取的,但并不总是可用的。无论你想出什么,你都应该考虑为 Python 社区的其他人记录它。如果其他人有同样的问题,我不会感到惊讶。也就是说,一个工作 python 程序需要将一组函数转换为 c 以提高速度。
    【解决方案3】:

    您可能想查看libtcodlibtcodpy Python 包装器。不过,就我个人而言,我不太喜欢包装器不是很 Pythonic,它是一个不必要的单一脚本,过度使用了函数名前缀(至少,我上次使用它时)。我有一次重构了包装器,并为 Python 3 修复了它,但那是一年前的事了,所以从那时起事情可能已经发生了变化。

    【讨论】:

      【解决方案4】:

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

      其次,A* 本质上是很好地根据以下条件找到最优路径:

      • 您拥有关于周围环境的完美而全面的信息。
      • 您的周围环境被视为“静态”。

      如果您违反了这些规则之一,您可能需要考虑一种称为“D*”的替代算法。

      当然,这在性能方面会付出巨大的代价。因此,您需要为自己的计划找到最佳权衡。

      【讨论】:

        猜你喜欢
        • 2020-11-23
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 2011-02-15
        相关资源
        最近更新 更多