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