当前位置: 首页 > 知识库问答 >
问题:

5x5快速滑动拼图

钱和安
2023-03-14

我正试图找到一种方法,以编程方式在合理的时间和移动量内解决一个24块的滑动拼图。下面是我正在描述的谜题中已解决状态的一个示例:

我已经发现IDA*算法可以很好地完成15个拼图(4x4网格)。IDA*算法能够在非常合理的时间内找到任何4x4滑动拼图的最小移动次数。我对这段代码进行了修改,以测试4x4滑动拼图,并通过使用PyPy进一步显著减少了运行时间。不幸的是,当这段代码被改编为5x5滑动拼图时,它的运行速度非常慢。我运行了一个多小时,最终放弃了看它完成,而在4x4网格上只运行了几秒钟。我理解这是因为需要搜索的节点数量随着网格的增加呈指数增长。然而,我并不想找到5x5滑动拼图的最佳解决方案,只想找到接近最优的解决方案。例如,如果一个给定谜题的最佳解是120步,那么我对任何少于150步并且可以在几分钟内找到的解都会感到满意。

是否有任何特定的算法可以实现这一点?

共有3个答案

暴绪
2023-03-14

两个字符的更改可能会起到作用,即将启发式乘以2(或其他常数)。它不再是可接受的,但找到的解将在最优解的2倍以内。这种技巧称为加权A*/静态加权。

郗福
2023-03-14

艾达*对于4x4拼图来说效果很好,因为那只是16个!(20,922,789,888,000‬) 可能的状态。一个5x5的拼图有25个!(155112100433309885984000000)可能的状态,大于740000万的因素。

您需要切换策略。“最简单”的方法首先沿着最上面的行解决难题,然后重复地沿着左边的列解决难题,直到您有一个3x3的难题,这可以使用现有技术轻松解决。

解决这个难题涉及三个不同的阶段,您可以在这三个阶段之间进行选择:

  1. 求解顶行(将列1-N-2的块移动到位,然后将列N-1的块移动到列N,将列N的块移动到列N,但在下面一行,完成该行)
  2. 求解左列(将第2-N-2行的工件移动到位,然后将第N-1行的工件移动到第N行,将第N行的工件移动到第N行,但向右移动一列,完成该列)
  3. (剩余2行3列):使用*解余数

因此,阶段1和2交替进行,直到可以运行阶段3;解算前5个图块(阶段1)后,解算其他行(阶段2)上最左侧的4个图块,然后解算拼图其余部分的顶行(4个图块,阶段1),然后解算左侧列(3个图块,阶段2),然后解算阶段3。第1阶段和第2阶段基本相同,只是方向不同,第2阶段的第一块瓷砖已经就位。

阶段1和2可以使用查找表轻松解决,无需搜索;您正在移动特定的磁贴,而不关心其他任何事情:

  • 找到所需的磁贴
  • 获取瓷砖旁边的空隙(取决于移动方向哪边最好)
  • 将磁贴移动到适当的位置;有标准的移动可以向任何方向移动磁贴(垂直或水平移动5次,对角线移动6次)。

这并没有给你解决方案的最短路径,但是没有状态搜索,问题是严格约束的,并且已知的最坏情况。解决5x5难题的第一行和第一列最多需要427步,下一行和下一列需要256步。

Ian Parberry在一篇题为(n2)的实时算法的论文中首次描述了该算法− 1) -1995年的拼图。我认为,王桂平和任力提出的一种新型高效的大规模滑动谜题智能算法DSolving仍然描述了一种更高效的查找表方法,但由于该论文尚未免费提供,我还没有对其进行研究。

赵晨
2023-03-14

已经证明,找到n-拼图的最少移动次数是NP完全的,参见Daniel Ratner和Manfred Warmuth,《n2-1-拼图和相关重定位问题》,符号计算杂志(1990)10,111-137。

Graham Kendall回顾的有趣事实,《NP完全谜题调查》,2008年:

  • 8字谜可以用A*算法解决;
  • 15个谜题不能用A*算法解决,但IDA*算法可以;
  • 使用IDA*算法无法在合理的时间内生成24个谜题的最佳解。

因此,停止计算以改变方法论是正确的做法。

在多项式时间中似乎有一种可用的算法可以找到次优解,参见Ian Parberry,用8/3n^3预期移动解决(n^2−1)-难题,算法2015, 8(3), 459-465。它可能是您正在寻找的。

 类似资料:
  • 问题内容: 我正在写容易的太空入侵者,并且在移动船只时遇到问题。基本上我先改变船的位置,然后再改变。如果变化很大,那就更像是跳跃而不是移动。如果更改很小,则动画会更平滑,但会变得更慢。有什么解决办法吗? 我正在使用JPanel并使用。 @edit:我不太了解我的电脑如何流畅地显示普通(新)游戏,而简单的绘图图像的帧率却很低。这就是为什么我认为这是软件问题而不是硬件问题。因此,也许我做了一些会影响帧

  • Swoole的绝大部分功能只能用于cli命令行环境,请首先准备好Linux Shell环境。可使用vim、emacs、phpstorm或其他编辑器编写代码,并在命令行中通过下列指令执行程序。 php /path/to/your_file.php 成功执行Swoole服务器程序后,如果你的代码中没有任何echo语句,屏幕不会有任何输出,但实际上底层已经在监听网络端口,等待客户端发起连接。可使用相应的

  • 本文向大家介绍解决Android快速滑动时图片一闪一闪问题,包括了解决Android快速滑动时图片一闪一闪问题的使用技巧和注意事项,需要的朋友参考一下 快速滑动图片一闪一闪的问题,图片加载等处理在这里不介绍,主要就是介绍下在Adapter中维护一个LinkedHashMap解决上述问题 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 本文向大家介绍快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突,包括了快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了jquery.touchSwipe左右滑动和垂直滚动条冲突问题的解决方法,具体内容如下 正好需要Html5做一个左右可以切换的功能,但是要保留上下滚动条功能。我在移动端使用的jquery.

  • Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展 进行加载。 如果不想使用 Spring 配置,可以通过 API 的方式 进行调用。 服务提供者 完整安装步骤,请参见:示例提供者安装 定义服务接口 DemoService.java 1: package

  • 本文向大家介绍Android仿微信通讯录滑动快速定位功能,包括了Android仿微信通讯录滑动快速定位功能的使用技巧和注意事项,需要的朋友参考一下 先给大家展示下效果图: 实现代码如下: 下面简单说下实现原理。 使用 继承自LinearLayout,添加了26个字母索引TextView,当手指滑动时通知Activity更新界面。 核心是OnTouchListener,手指滑动的时候根据当前Y坐标计