Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Artificial intelligence Sokoban解算器,提示_Artificial Intelligence - Fatal编程技术网

Artificial intelligence Sokoban解算器,提示

Artificial intelligence Sokoban解算器,提示,artificial-intelligence,Artificial Intelligence,我必须做一个索科班解算器(http://en.wikipedia.org/wiki/Sokoban). 你做过一次吗?我在搜索提示,而不是代码。比如“你可以使用IDA*alg”或者“我使用了那个启发式,它非常好”或者“我使用那个技术不会避免死锁” 基本上,我想在写任何代码之前在纸上写下策略。你可以创建一个蛮力解算器,尝试将你的人推向每个可能的方向。通过使用递归(或堆栈),如果找不到解决方案,您可以追溯您的步骤 A*可能对你没有任何好处,因为你不必在迷宫中找到路,还需要移动箱子。这意味着您可能需要

我必须做一个索科班解算器(http://en.wikipedia.org/wiki/Sokoban). 你做过一次吗?我在搜索提示,而不是代码。比如“你可以使用IDA*alg”或者“我使用了那个启发式,它非常好”或者“我使用那个技术不会避免死锁”


基本上,我想在写任何代码之前在纸上写下策略。

你可以创建一个蛮力解算器,尝试将你的人推向每个可能的方向。通过使用递归(或堆栈),如果找不到解决方案,您可以追溯您的步骤

A*可能对你没有任何好处,因为你不必在迷宫中找到路,还需要移动箱子。这意味着您可能需要在移动箱子后向原来的方向后退一步。因此,对于每一步,你都需要评估所有方向,包括你来自的方向。也就是说,除非在上一步中没有移动长方体

[编辑] 你可以用一个*使它更聪明一点;找到从当前位置移动到任何位置的方法,您可以从中移动长方体。这可能会使您的解决方案更有效,因为您不必跟踪中间的所有位置,而只需跟踪从上一个框到下一个框的位置。

Terms 场-当前游戏的水平、整个游戏区域

位置-一个阶段,现场设置

最终位置-不可能转弯的位置-目标或僵局

箱子-与板条箱相同

理论 只是一点逻辑——看起来很明显,但我们将在实现部分使用它

所以-关于索科班的每一场比赛,我们可以说这是其中之一:

  • 可解决,未解决-在解决过程中
  • 可解决,已解决-目标
  • 无法解决,无法解决-如果我们的实施没有结果,并且没有更多可能的移动/移动组合
现在-Sokoban游戏由以下回合组成:

  • 移动-角色可以在由墙和/或框定义的区域内移动,该区域小于或等于整个游戏区域(如果不算墙,并且没有框)-但是,在场地周围移动角色除了得分外没有任何区别,这与实际解决方案无关-让我们暂时忽略它
  • 推动-推动箱子更为重要,通过推动箱子达到各自的目标,有可能导致我们的目标——解决现场问题
框可以是:

  • 在目标中-此框很可能不需要移动,一些规则可以禁止框在目标位置移动(非常不寻常)
  • 可推动-在1到4个方向
  • 不可冲撞,不在目标位置
    • 被两堵墙阻挡-无论发生什么情况,当前位置都是无法解决的
    • 其他-我们稍后会到达这个箱子-现在一个板条箱挡住了我们的路
过程 这是我们将用于解决问题的逐步过程(定义如下):

  • 使用当前位置的每个可直接访问推送(可推送或目标内推送)填充possibleTurnsn,玩家位于当前位置
  • 获取possibleTurnsn中的第一项,将其删除并执行
  • 查看当前位置是否:
  • 最终目标解决了,什么都不要做
  • 是最终-死锁-此回合导致死锁,不再填充它,返回2。步骤,n保持不变
  • 不是最终-增量n,并在该位置用可能的圈数填充possibleTurnsn
  • 定义:

    possibleTurnsx-二维数组或数组数组-x定义转弯的“深度”

    n-开始时为零,在执行上述算法时将递增

    提示
    最后,上述过程将给你留下一个转身组合,这将离开一个解决的位置。最后一件事是使用像A*这样的算法来确定这些转弯/推送之间的最短路线,以最大化速度和得分,最小化游戏中的转弯次数。

    我已经写了关于Sokoban算法的硕士论文。我的目的是对Sokoban解算器中使用的技术提供一个很好的概述。它不提供明确的答案,但可能为有兴趣编写Sokoban解算器的人提供一个良好的起点


    如果迷宫很大,暴力是不可行的。我说的是30个位置的迷宫,3-4颗钻石/进球。据我所知,问题必须分为不同的步骤,我是否有问题。1.如何表示拼图的状态。2.如何在台阶之间移动(该男子可以向4个方向移动)。3.如何决定下一步最好(这是最难的一点)。然后是一些子问题,如查找是否处于死锁状态。最后一步是通过尝试和错误(蛮力)可以完成的。人类盲目地尝试每一个方向将需要永远的时间,但对于一台根本没有问题的计算机来说。就像我之前说的,你不需要记住男人走的每一步,只需要记住移动盒子的每一步。唯一需要记住(存储)的是上次移动后实际更新的字段,以及每个步骤移动的框的新旧位置。所有其他数据都可以通过回滚堆栈上的STAP来扣除。至于检测死锁:您需要为每个字段状态存储一些值。如果该值在您以前的状态列表中,则表示该情况以前发生过,并且您处于循环中。您可以存储电路板的散列,但也可以存储整个电路板。如果需要,可以在字段中存储框的位置。256x256字段中的10个框只能存储在20个字节中。我