如果您不熟悉它,该游戏由一系列大小不一的汽车组成,水平或垂直设置在具有单个出口的 NxM 网格上。只要另一辆车没有挡住它,每辆车都可以按照它设定的方向前进/后退。你永远不能改变汽车的方向。有一辆专用车,通常是红色的。它设置在出口所在的同一行,游戏的目标是找到一系列动作(一个动作 - 将汽车向后或向前移动 N 步),这将使红色汽车驶出迷宫.
我一直在思考如何为这个问题生成实例,根据解决棋盘的最小数量生成难度级别。
对算法或策略有任何想法吗?
提前致谢!
如果您不熟悉它,该游戏由一系列大小不一的汽车组成,水平或垂直设置在具有单个出口的 NxM 网格上。只要另一辆车没有挡住它,每辆车都可以按照它设定的方向前进/后退。你永远不能改变汽车的方向。有一辆专用车,通常是红色的。它设置在出口所在的同一行,游戏的目标是找到一系列动作(一个动作 - 将汽车向后或向前移动 N 步),这将使红色汽车驶出迷宫.
我一直在思考如何为这个问题生成实例,根据解决棋盘的最小数量生成难度级别。
对算法或策略有任何想法吗?
提前致谢!
考虑到汽车的位置,问题中给出的电路板最多具有4*4*4*5*5*3*5 = 24.000
可能的配置。
对于当今的计算机而言,具有 24.000 个节点的图并不是很大。所以一种可能的方法是
一种可能的方法是反向创建它。
可到达位置的数量并不大(可能总是低于 100k),因此(2)和(3)是可行的。
上述方法可能不会产生硬实例,因为大多数随机实例不会引起汽车的复杂联锁行为。
您可以进行一些本地搜索,这需要
(2) 很简单,可能使用最长解的长度,见上。虽然这是相当昂贵的。
(1) 需要一些思考。可能的修改是:
这两个足以到达所有可能的板。但是可以添加其他方式,因为移除会使板更容易。这里有一些想法:
(aaa..bb.) -> (bb..aaa.)
由于大的分支因素,爬山/最陡上升可能很糟糕。可以尝试对一组可能的相邻板进行二次抽样,即,根本不看,而只看几个随机的板。
我知道这很古老,但我最近不得不处理一个类似的问题,所以也许这会有所帮助。
相反,更好的方法是生成初始状态(通过在网格上放置随机汽车),然后尝试使用一些有界启发式搜索算法(例如IDA*或branch and bound )来解决它。如果一个实例在边界下无法解决,则丢弃它。
尽量避免A*。如果你有你的定义你的意思是一个“硬”实例(我发现 16 步非常困难)你可以使用A*和一个修剪规则来防止节点x用g(x)+h(x)扩展>T(T是您的阈值(例如,16))。