为高峰时间游戏生成随机拼图板

时间:2013-09-04 00:39:25

标签: algorithm language-agnostic artificial-intelligence game-engine puzzle

如果您不熟悉它,游戏包含一系列不同大小的汽车,水平或垂直设置在具有单个出口的NxM网格上。 只要另一辆车没有挡住它,每辆车都可以按照它设定的方向前进/后退。你永远不能改变汽车的方向。 有一辆特别的车,通常是红色的。它设置在出口所在的同一排,游戏的目标是找到一系列动作(移动 - 向前或向前移动N步),这将允许红色汽车驶出迷宫

我一直在考虑如何为这个问题生成实例,根据解决板的最小数量生成难度级别。

有任何算法或策略的想法吗?

提前致谢!

Example of Rush hour puzzle

3 个答案:

答案 0 :(得分:1)

一种可能的方法是反向创建它。

  1. 生成一块随机牌,让红色汽车处于获胜位置。
  2. 构建所有可到达位置的图表。
  3. 选择与每个获胜位置的距离最远的位置。
  4. 可到达位置的数量并不大(可能总是低于100k),因此(2)和(3)是可行的。

    如何通过本地搜索创建更难的实例

    上述方法可能不会产生硬实例,因为大多数随机实例不会引起汽车的复杂联锁行为。

    您可以进行一些本地搜索,这需要

    1. 从现有的
    2. 生成其他电路板的方法
    3. 评估/健身功能
    4. (2)很简单,也许使用最长解决方案的长度,见上文。虽然这是非常昂贵的。

      (1)需要一些思考。可能的修改是:

      • 在某处添加汽车
      • 取出一辆汽车(我认为这样可以让电路板更容易)

      这两个足以覆盖所有可能的电路板。但有人可能会添加其他方法,因为删除会使电路板更容易。以下是一些想法:

      • 垂直于其行驶方向移动车辆
      • 在同一车道内交换汽车(aaa..bb.) -> (bb..aaa.)
      由于分支因子较大,爬坡/最陡峭的上升可能很糟糕。人们可以尝试对可能的相邻电路板进行二次采样,即不要只看几个随机电路板。

答案 1 :(得分:1)

考虑到汽车的位置,问题中给出的董事会最多4*4*4*5*5*3*5 = 24.000个可能的配置。

对于今天的计算机来说,具有24.000个节点的图表并不是很大。所以可能的方法是

  • 构建所有位置的图形(节点是位置,边缘是移动),
  • 查找所有节点的获胜动作数(例如,使用Dijkstra)和
  • 选择与目标距离较远的节点。

答案 2 :(得分:0)

我知道这很古老,但我最近不得不处理类似的问题,所以这可能会有所帮助。

  1. 通过从终端状态(即反向)应用随机运算符来构造实例将不会很好地工作。这是由于状态空间的对称性。平均而言,你最终处于一个离终端状态太近的状态。
  2. 相反,更好的方法是生成初始状态(通过在网格上放置随机车辆),然后尝试使用某些有界启发式搜索算法(例如 IDA * )或分支和绑定。如果某个实例无法在边界下解决,请将其丢弃。

  3. 尽量避免 A * 。如果你对你的意思有一个定义,那就是" hard"实例(我发现16个动作非常困难)你可以使用 A * 修剪规则,以防止 g + h扩展节点 x (x)> T T 是你的门槛(例如,16))。

  4. 启发式功能 - 由于您在解决它时不必是最佳选择,因此您可以使用任何简单的不允许的启发式方法,例如目标的障碍方格数。或者,如果您需要更强的启发式功能,您可以通过为生成的拼图生成整个获胜状态集,然后使用从当前状态到任何终端状态的最小距离来实现曼哈顿距离函数。