[英]Generating Random Puzzle Boards for Rush Hour Game
如果您不熟悉它,那么游戏将包含一组大小不一的汽车,这些汽车可以在水平方向或垂直方向上设置在具有单个出口的NxM网格上。 只要另一辆车没有挡住它,每辆车都可以按照其设置的方向前进/后退。 您永远无法改变汽车的方向。 有一辆特殊的汽车,通常是红色的。 它位于出口所在的同一行中,游戏的目标是找到一系列动作(移动-将汽车向后或向前移动N步),这将使红色汽车驶出迷宫。
我一直在尝试思考如何为该问题生成实例,并根据解决董事会所需的最小数量来生成难度。
有算法或策略的想法吗?
提前致谢!
一种可能的方法是反向创建它。
可到达位置的数量并不大(可能始终低于100k),因此(2)和(3)是可行的。
上面的方法可能不会产生困难的实例,因为大多数随机实例不会引起汽车的复杂联锁行为。
您可以进行一些本地搜索,这需要
(2)很简单,也许用最长的解决方案的长度,见上文。 虽然这是相当昂贵的。
(1)需要一些思考。 可能的修改是:
这两个足以覆盖所有可能的董事会。 但是可能会添加其他方法,因为移除后会使板子更容易。 这里有一些想法:
(aaa..bb.) -> (bb..aaa.)
内交换汽车 爬坡/最陡的上升可能很糟糕,因为分支因子很大。 可以尝试对一组可能的相邻板子进行二次采样,即,根本不看,而只是看几个随机的子板。
考虑到汽车的放置,问题中给出的板最多具有4*4*4*5*5*3*5 = 24.000
可能的配置。
对于当今的计算机,具有24.000个节点的图形不是很大。 因此,一种可能的方法是
我知道这很古老,但是最近我不得不处理类似的问题,因此也许可以帮上忙。
相反,更好的方法是生成初始状态(通过将随机车放置在网格上),然后尝试使用一些有界的启发式搜索算法(例如IDA *或branch and bound )来解决它。 如果无法在边界下求解实例,则将其丢弃。
尽量避免A * 。 如果您对“硬”实例的含义进行了定义(我发现很难完成16步),则可以将A *与修剪规则一起使用,该修剪规则可以防止节点g用(x)+(h) x扩展> T ( T是您的阈值(例如16))。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.