【问题标题】:A good randomizer for puzzle-15一个很好的谜题 15 随机化器
【发布时间】:2016-04-13 08:53:12
【问题描述】:

我实施了一个谜题 15,供人们在线竞争。我目前的随机化器的工作原理是从良好的配置开始并移动瓷砖 100 次移动(任意数)

一切都很好,但是,偶尔洗牌太容易了,只需要几个动作就可以解决难题,因此对于某些人以更高的速度获得更好的分数来说,这个游戏真的很不公平。

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

【问题讨论】:

    标签: algorithm math random sliding-tile-puzzle


    【解决方案1】:

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

    更新和详情

    在 Wikipedia 上有一个 article 关于 15 谜题以及它何时(和不可)可解。简而言之,如果空方块在右下角,那么当且仅当反转数(反转是序列中两个元素的交换,不一定是相邻元素)相对于目标排列是偶数。

    然后,您可以通过进行偶数次反转来轻松生成可解的开始状态,这可能会比通过常规移动更快地导致不太容易解决的状态,并且可以保证它会仍然可以解决。

    实际上,您不需要使用我上面提到的搜索算法,而是一种可接受的启发式算法。这样的人总是低估永远不会高估解决难题所需的移动次数,即保证你不会采取启发式告诉你的移动次数。

    一个好的启发式是每个数字到其目标位置的曼哈顿距离之和。

    总结

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

    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.
    

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

    【讨论】:

    • 这看起来真的有点矫枉过正。我希望有一些具有数学属性的随机瓷砖位置
    • 谢谢!肯定会帮助我实现更好的随机化器!
    【解决方案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 单位系数足够高(阈值)

      门槛也可以用来改变难度。

    【讨论】:

    • “随机性”计算方法的有趣想法,谢谢。我可能会尝试的第一件事是使用与有序数组的曼哈顿距离,看看它对于一个洗好的游戏场有哪些值
    • @user151496 有时也可以计算镜像/旋转数组的值并选择最差的值
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多