【问题标题】:Korf's Rubik's Cube Solving Algorithm Implemented in Python?Korf 的魔方求解算法用 Python 实现?
【发布时间】:2021-05-01 14:26:11
【问题描述】:

我一直在尝试在 python 中找到 Korf 魔方求解算法的实现,因为我正在制作一个比较算法效率的项目。不幸的是,到目前为止我还没有找到任何实现,有人有任何 Python 中 Korf 算法的示例吗?

【问题讨论】:

  • 我用 C++ 实现了 Korf's。不想引起争议,python 太慢了,尽管 cython 是一种选择。使用 Korf 解立方体需要数十亿次的曲折和同样多的立方体状态比较。对于一些粗略的数字,我的程序每分钟应用大约 4.02 亿次扭曲和比较。我用他们的 python 版本帮助了另一个人,他们得到了大约 1550 万。
  • 您可能会发现我在 Medium 上的文章很有帮助:medium.com/@benjamin.botto/…
  • 对于一个快速的 Python 求解器,它可以在几分钟内平均求解随机立方体,参见 github.com/hkociemba/RubiksCube-OptimalSolver

标签: python solver rubiks-cube


【解决方案1】:

Korf 算法并不是魔方最佳求解器的最佳方法。实现一种利用立方体对称性的算法要好得多,这会导致修剪表的尺寸更小。 Michael Reid's optimal solver algorithm 最适合。它在三个不同方向上使用两阶段算法的第一阶段(可以利用 16 个立方体对称性)来利用所有 48 个立方体对称性。 IDA* 的修剪深度平均远高于 Korf 方法。

我怀疑 Python 是否足够快。我可以尝试一下,因为我实现了我的two-phase algorithm in Python,并且调整这段代码应该不会太难。

【讨论】:

  • Python 的慢速在一定程度上被当今速度更快、内存更多的计算机所抵消(Korf 的论文已有 24 年的历史),“足够快”当然与一个人的耐心有关 :-)
  • 遗憾的是,由于这个 GlobalInterpreterLock,似乎无法通过使用 Python 中现代 CPU 的许多内核和使用多个线程来加速计算。
  • 你仍然可以使用不同的进程,不是吗?
  • 当然可以。但是由于进程不共享数据,因此必须多次加载修剪表。 Korf 的表总共有 80 MB 的大小,因此如果您有 8 GB 的 RAM,运行多个实例就没有问题。我现在设法实现了 Michael Reid 建议的基于阶段 1 的方法,该方法在 Python 中使用了 35 MB 的大型修剪表。对于随机立方体,完整的深度 16 搜索平均大约需要 20 分钟。 Python 程序仅生成大约 160.000 个节点/秒,这非常慢(Cube Explorer 生成节点的速度快了 50 倍以上)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2014-09-15
  • 2022-11-17
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多