当守门员使用广度优先搜索算法自动移动时,我已经实现了功能性。现在我想让它自动移动盒子(如果饲养员可以将盒子从源移动到目的地而不移动另一个盒子)。我该怎么办?我试过修改BFS,但还没有成功。
更新:我不需要解决这个难题。相反,当用户可以用鼠标移动盒子时,我想开发方便的用户界面。为此我需要一些算法,这将允许计算移动序列。但它只是关于移动单个盒子,如果不是为了这样做就不应该移动其他盒子。
答案 0 :(得分:4)
像以前一样使用广度优先搜索(或者如果您愿意,使用A *),但搜索适当的状态集。
当您搜索守护者的路径时,状态对应于网格中的方块。但是当你为守门员移动一个区块寻找一种方法时,状态对应于网格中的方块的对(一个用于守护者,一个用于块)。
这是最小的非平凡的例子。假设我们有一个推箱子级别,方块标记如下:
网格包含守护者和一个区块。状态空间由守护者和块占据的成对方块组成。有56个这样的状态,在下图中绘制为小圆圈。
线条显示此状态空间内可能的过渡。细线对应于保持器的移动(并且是双向的)。粗线对应于推动块(因此仅沿一个方向)。您需要搜索此状态空间。
例如,如果块从7开始并且守护器在8,那么守护者可以通过跟随状态空间中的红色路径将块推到8:
请注意,沿此路径,区块将经过7-6-5-6-7-8的位置。你只能通过考虑块的位置来找到这条路径,因为块通过位置6和7两次。
答案 1 :(得分:3)
可以使用计算复杂性理论来研究推箱子。 已经证明解决推箱子难题的问题 NP-hard。3这对人工智能也很有意义 研究人员,因为解决推箱子可以比较设计一个 在仓库中移动箱子的机器人。进一步的工作表明 解决推箱子问题也是PSPACE完成的。[4]
推箱子很难,不仅仅是因为它的分支因素(即 与国际象棋相当),但它的搜索树深度也很大;一些 水平需要超过1000“推”。熟练的人类玩家依赖 主要是关于启发式的;他们通常能够快速丢弃无用的 或冗余的游戏线,并识别模式和子目标, 大幅减少搜索量。
一些推箱子的谜题可以通过使用一个自动解决 单一代理搜索算法,如IDA *,由几个增强 利用领域特定知识的技术。[5] 这就是 Rolling Stone使用的方法,由Sokoban求解器开发的 阿尔伯塔大学GAMES集团。更多复杂的推箱子级别 然而,即使对于最好的自动求解器,它也是遥不可及的。
这是你想知道的吗?
顺便说一下,以可证明的最佳方式解决推箱子谜题是NP-hard,这意味着如果你弄明白如何去做,$1,000,000 prize等着你。