Artificial intelligence Sokoban解算器,提示
我必须做一个索科班解算器(http://en.wikipedia.org/wiki/Sokoban). 你做过一次吗?我在搜索提示,而不是代码。比如“你可以使用IDA*alg”或者“我使用了那个启发式,它非常好”或者“我使用那个技术不会避免死锁”Artificial intelligence Sokoban解算器,提示,artificial-intelligence,Artificial Intelligence,我必须做一个索科班解算器(http://en.wikipedia.org/wiki/Sokoban). 你做过一次吗?我在搜索提示,而不是代码。比如“你可以使用IDA*alg”或者“我使用了那个启发式,它非常好”或者“我使用那个技术不会避免死锁” 基本上,我想在写任何代码之前在纸上写下策略。你可以创建一个蛮力解算器,尝试将你的人推向每个可能的方向。通过使用递归(或堆栈),如果找不到解决方案,您可以追溯您的步骤 A*可能对你没有任何好处,因为你不必在迷宫中找到路,还需要移动箱子。这意味着您可能需要
基本上,我想在写任何代码之前在纸上写下策略。你可以创建一个蛮力解算器,尝试将你的人推向每个可能的方向。通过使用递归(或堆栈),如果找不到解决方案,您可以追溯您的步骤 A*可能对你没有任何好处,因为你不必在迷宫中找到路,还需要移动箱子。这意味着您可能需要在移动箱子后向原来的方向后退一步。因此,对于每一步,你都需要评估所有方向,包括你来自的方向。也就是说,除非在上一步中没有移动长方体 [编辑] 你可以用一个*使它更聪明一点;找到从当前位置移动到任何位置的方法,您可以从中移动长方体。这可能会使您的解决方案更有效,因为您不必跟踪中间的所有位置,而只需跟踪从上一个框到下一个框的位置。Terms 场-当前游戏的水平、整个游戏区域 位置-一个阶段,现场设置 最终位置-不可能转弯的位置-目标或僵局 箱子-与板条箱相同 理论 只是一点逻辑——看起来很明显,但我们将在实现部分使用它 所以-关于索科班的每一场比赛,我们可以说这是其中之一:
- 可解决,未解决-在解决过程中
- 可解决,已解决-目标
- 无法解决,无法解决-如果我们的实施没有结果,并且没有更多可能的移动/移动组合
- 移动-角色可以在由墙和/或框定义的区域内移动,该区域小于或等于整个游戏区域(如果不算墙,并且没有框)-但是,在场地周围移动角色除了得分外没有任何区别,这与实际解决方案无关-让我们暂时忽略它
- 推动-推动箱子更为重要,通过推动箱子达到各自的目标,有可能导致我们的目标——解决现场问题
- 在目标中-此框很可能不需要移动,一些规则可以禁止框在目标位置移动(非常不寻常)
- 可推动-在1到4个方向
- 不可冲撞,不在目标位置
- 被两堵墙阻挡-无论发生什么情况,当前位置都是无法解决的
最后,上述过程将给你留下一个转身组合,这将离开一个解决的位置。最后一件事是使用像A*这样的算法来确定这些转弯/推送之间的最短路线,以最大化速度和得分,最小化游戏中的转弯次数。我已经写了关于Sokoban算法的硕士论文。我的目的是对Sokoban解算器中使用的技术提供一个很好的概述。它不提供明确的答案,但可能为有兴趣编写Sokoban解算器的人提供一个良好的起点
如果迷宫很大,暴力是不可行的。我说的是30个位置的迷宫,3-4颗钻石/进球。据我所知,问题必须分为不同的步骤,我是否有问题。1.如何表示拼图的状态。2.如何在台阶之间移动(该男子可以向4个方向移动)。3.如何决定下一步最好(这是最难的一点)。然后是一些子问题,如查找是否处于死锁状态。最后一步是通过尝试和错误(蛮力)可以完成的。人类盲目地尝试每一个方向将需要永远的时间,但对于一台根本没有问题的计算机来说。就像我之前说的,你不需要记住男人走的每一步,只需要记住移动盒子的每一步。唯一需要记住(存储)的是上次移动后实际更新的字段,以及每个步骤移动的框的新旧位置。所有其他数据都可以通过回滚堆栈上的STAP来扣除。至于检测死锁:您需要为每个字段状态存储一些值。如果该值在您以前的状态列表中,则表示该情况以前发生过,并且您处于循环中。您可以存储电路板的散列,但也可以存储整个电路板。如果需要,可以在字段中存储框的位置。256x256字段中的10个框只能存储在20个字节中。我