Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为高峰时段游戏生成随机拼图板_Algorithm_Language Agnostic_Artificial Intelligence_Game Engine_Puzzle - Fatal编程技术网

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

Algorithm 为高峰时段游戏生成随机拼图板,algorithm,language-agnostic,artificial-intelligence,game-engine,puzzle,Algorithm,Language Agnostic,Artificial Intelligence,Game Engine,Puzzle,如果你不熟悉它,这个游戏由一系列大小不同的汽车组成,水平或垂直设置在一个NxM网格上,该网格只有一个出口。 每辆车都可以在设定的方向上向前/向后移动,只要另一辆车没有挡住它。你永远不能改变汽车的方向。 有一辆特别的车,通常是红色的。它被设置在出口所在的同一排,游戏的目标是找到一系列的动作(一个动作-移动一辆车N步后退或前进),让红色的车驶出迷宫 我一直在思考如何为这个问题生成实例,根据解决电路板的最小数量生成难度级别 有什么算法或策略可以做到这一点吗 提前谢谢 一种可能的方法是反向创建它 生成一

如果你不熟悉它,这个游戏由一系列大小不同的汽车组成,水平或垂直设置在一个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)来解决它。如果无法在边界下解决实例,请放弃它

  • 尽量避免使用*。如果你定义了什么是“硬”实例(我发现16次移动相当困难),你可以使用*和剪枝规则,防止节点x扩展为g(x)+h(x)>T(T是你的阈值(例如,16))

  • 启发式函数-由于在解决问题时不必是最优的,因此可以使用任何简单的不可接受的启发式函数,例如目标的障碍方块数。或者,如果您需要更强的启发式函数,您可以通过为生成的谜题生成整个获胜状态集,然后使用从当前状态到任何终端状态的最小距离来实现曼哈顿距离函数
    添加游戏的图像怎么样?哦,当然!我刚才补充说。将引起兴趣。没有其他方法吗?@未知,确实有无限多的其他方法。这是怎么回事?我已经在创建随机板,我正在使用BFS算法,但我没有得到预期的结果。。。随机拼图太简单了,我不是在创建问题的硬实例。但是,使用解算器来获得最佳解并不意味着如何创建硬实例,你知道吗?无论如何,非常感谢!=)我明白你的意思。我需要在硬级别创建400个谜题,这就是为什么我希望它能更快。这种方法确保解决方案的移动次数最少?@Unknown我不理解你的问题。这种方法意味着您可以完全解决和分析一次(成功)放置车辆所产生的问题。您将知道解决每个可到达配置所需的最佳移动次数。如何创建包含所有可能位置的图?问题不是解决电路板。这是关于生成它们的。@通配符为了判断生成的电路板有多困难,您必须解决它。答案描述了一种方法:(1)解决电路板问题,(2)从所有可到达位置中选择一个硬启动位置。