繁体   English   中英

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

[英]Generating Random Puzzle Boards for Rush Hour Game

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

我一直在尝试思考如何为该问题生成实例,并根据解决董事会所需的最小数量来生成难度。

有算法或策略的想法吗?

提前致谢!

高峰时间难题的例子

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

  1. 生成一个随机的棋盘,该棋盘中有红色赛车处于获胜位置。
  2. 建立所有可及位置的图表。
  3. 选择一个距离每个获胜位置最大的位置。

可到达位置的数量并不大(可能始终低于100k),因此(2)和(3)是可行的。

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

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

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

  1. 一种从现有板生成其他板的方法
  2. 评估/健身功能

(2)很简单,也许用最长的解决方案的长度,见上文。 虽然这是相当昂贵的。

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

  • 在某处加车
  • 移开汽车(我想这总是会让董事会容易一些)

这两个足以覆盖所有可能的董事会。 但是可能会添加其他方法,因为移除后会使板子更容易。 这里有一些想法:

  • 垂直于行驶方向移动汽车
  • 在同一车道(aaa..bb.) -> (bb..aaa.)内交换汽车

爬坡/最陡的上升可能很糟糕,因为分支因子很大。 可以尝试对一组可能的相邻板子进行二次采样,即,根本不看,而只是看几个随机的子板。

考虑到汽车的放置,问题中给出的板最多具有4*4*4*5*5*3*5 = 24.000可能的配置。

对于当今的计算机,具有24.000个节点的图形不是很大。 因此,一种可能的方法是

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

我知道这很古老,但是最近我不得不处理类似的问题,因此也许可以帮上忙。

  1. 通过从终端状态(即反向)应用随机运算符来构造实例将无法正常工作。 这是由于状态空间中的对称性。 平均而言,您最终会处于过于接近终端状态的状态。
  2. 相反,更好的方法是生成初始状态(通过将随机车放置在网格上),然后尝试使用一些有界的启发式搜索算法(例如IDA *branch and bound )来解决它。 如果无法在边界下求解实例,则将其丢弃。

  3. 尽量避免A * 如果您对“硬”实例的含义进行了定义(我发现很难完成16步),则可以将A *与修剪规则一起使用,该修剪规则可以防止节点g用(x)+(h) x扩展> TT是您的阈值(例如16))。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM