【问题标题】:Sokoban game: move boxes automatically推箱子游戏:自动移动箱子
【发布时间】:2012-04-03 14:32:29
【问题描述】:

我已经实现了一个功能,当门将使用广度优先搜索算法自动移动时。现在我希望它也能自动移动盒子(如果 keeper 可以在不移动另一个盒子的情况下将盒子从源移动到目的地)。我该怎么做?我试过修改BFS,还没成功。

更新:我不需要解决这个难题。相反,我想开发方便的用户界面,当用户可以用鼠标移动框时。为此,我需要一些算法,这将允许计算移动序列。但这只是关于移动单个盒子,如果不移动其他盒子的话。

【问题讨论】:

  • 您遇到的具体问题是什么(除了广泛的“它不起作用”)?
  • 它很好地解决了简单的路线(当盒子路径只包含每个位置一次时)。但也有一个复杂的情况,当盒子不止一次地踩在每个位置上时(例如,你将一个盒子移动到广阔的区域以重新定位守门员,然后将盒子移回相同的路径)。我相信我不仅应该存储是否访问了特定位置,还应该存储当时的守门员在哪里)。
  • 我更想问的是人们是否已经为这项任务开发了一些算法。我不知道,如果我的方法是推动/移动最佳,而我绝对希望它是最佳的。

标签: algorithm graph-algorithm


【解决方案1】:

像以前一样使用广度优先搜索(如果您愿意,也可以使用 A*),但搜索适当的状态集。

当您为守门员搜索路径时,状态对应于网格中的方块。但是当你在寻找让守门员移动方块的方法时,状态对应于网格中的个方格(一个用于守门员,一个用于方块)。

这是最小的不平凡的例子。假设我们有一个推箱子级别,其正方形标记如下:

网格包含守门员和一个方块。状态空间由 keeper 和 block 占据的方格对组成。有 56 个这样的状态,在下图中用小圆圈绘制。

线条显示了此状态空间内可能的转换。细线对应守门员的移动(并且是双向的)。粗线对应于推动块(因此仅向一个方向移动)。 这个是你需要搜索的状态空间。

例如,如果block从7开始,keeper从8开始,那么keeper可以按照状态空间中的红色路径将block推到8:

请注意,沿着这条路径,方块会经过位置 7–6–5–6–7–8。仅考虑方块的位置是无法找到这条路径的,因为方块两次通过位置 6 和 7。

【讨论】:

  • 感谢您的精彩解释。你能分享一下,你是怎么做那些漂亮的插图的?
  • 不客气。我使用OmniGraffle 制作了图表。
  • 算法还将在地图上包含修改后的 BFS 以查明守门员是否可以在修改后的地图中到达其位置。 BFS 将被修改,因为其中一个块(移动一个)的位置会不同。
【解决方案2】:

来自Wikipedia - Sokoban

推箱子可以使用计算复杂性理论来研究。 解决推箱子谜题的问题已被证明是 NP-hard.3这对人工智能也很有意思 研究人员,因为解决推箱子可以比作设计一个 在仓库中移动箱子的机器人。进一步的工作表明 解决推箱子问题也是 PSPACE 完备的。[4]

推箱子之所以难,不仅是因为它的分支因素(即 可与国际象棋相媲美),还有其巨大的搜索树深度;一些 关卡需要超过 1000 次“推送”。熟练的人类玩家依靠 主要是启发式;他们通常能够迅速丢弃无用的 或多余的比赛路线,并识别模式和子目标, 大幅减少搜索量。

一些推箱子谜题可以通过使用 单智能体搜索算法,例如 IDA*,增强了几个 利用特定领域知识的技术。[5] Rolling Stone 使用的方法,这是由 阿尔伯塔大学游戏集团。更复杂的推箱子关卡 然而,即使是最好的自动求解器也无法实现。

这是你想知道的吗?

顺便说一句,以可证明的最佳方式解决推箱子谜题是NP-hard,这意味着如果你知道如何解决,就有一个$1,000,000 prize 等着你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多