益智15的好随机发生器

时间:2016-04-13 08:53:13

标签: algorithm math random 8-puzzle

我已经实现了一个难题15,供人们在线竞争。我当前的随机数发生器的工作原理是从良好的配置开始并移动平铺100次(任意数量)

一切都很好,但是,有一段时间,瓷砖很容易洗牌,只需要几步就可以解决这个难题,因此对于一些人来说,以更高的速度获得更好的分数对游戏来说真的是不公平的。

什么是随机化初始配置的好方法,所以它不是“太容易”?

2 个答案:

答案 0 :(得分:4)

您可以生成完全随机的配置(可以解决),然后使用一些求解器来确定最佳的移动顺序。如果序列足够长,那么好,否则生成新配置并重复。

更新&细节

维基百科上有一个关于15拼图的article以及它何时(并且不是可解决的)。简而言之,如果空方块位于右下角,那么当且仅当反转的数量(反转是序列中两个元素的交换,不一定是相邻元素)相对于目标排列是均匀的。

然后,您可以通过执行偶数次反转来轻松生成可解决的启动状态,这可能导致不那么容易解决的状态比通过常规移动快得多,并且保证它将会仍然可以解决。

事实上,您不需要像我上面提到的那样使用搜索算法,但这是一种可接受的启发式算法。这样的总是低估永远不会过高估计解决谜题所需的移动次数,即你可以保证它不会减少启发式告诉你的动作。

良好的启发式算法是每个数字与其目标位置的曼哈顿距离之和。

<强>摘要

简而言之,用于生成起始位置的可能(非常简单)算法可能如下所示:

1: current_state <- goal_state
2: swap two arbitrary (randomly selected) pieces
3: swap two arbitrary (randomly selected) pieces again (to ensure solvability)
4: h <- heuristic(current_state)
5: if h > desired threshold
6:     return current_state
7: else
8:   go to 2.

要确定状态有多困难,您需要使用一些求解器找到最优解。启发式只会给你一个估计。

答案 1 :(得分:2)

我会这样做

  1. 从解决方案开始(就像你一样)
  2. 以随机方向进行有效转弯

    所以你必须跟踪差距的位置并生成随机方向(N,E,S,W)并进行移动。我认为这部分你也做过了。

  3. 计算展示位置的随机性

    因此,根据数组的顺序计算一些系数。因此,有序(已解决)的解决方案将具有低值,并且随机将具有高值。然而,系数的等式是反复试验的问题。这里有一些想法可以使用:

    • correlation coefficient
    • 价值与其邻居的平均差异之和

      1 2 4
      3 6 5
      9 8 7
      
      coeff(6)= (|6-3|+|6-5|+|6-2|+|6-8|)/4
      coeff=coeff(1)+coeff(2)+...coeff(15)
      
    • 与有序数组的距离

    您可以将更多方法结合在一起。您可以将其划分为单独的行和列,然后将子系数组合在一起。

  4. 来自#3的循环#2单位系数足够高(阈值)

    阈值也可用于改变难度。