一个很好的 puzzle-15 随机发生器
A good randomizer for puzzle-15
我已经实现了一个谜题 15,供人们在线竞争。我当前的随机化器的工作原理是从良好的配置开始并移动方块 100 次(任意数)
一切都很好,但是,偶尔洗牌太容易了,只需要几步就可以解决这个问题,所以这个游戏对一些人来说真的很不公平。速度。
什么是随机化初始配置而不是 "too easy" 的好方法?
您可以生成一个完全随机的配置(即可求解的),然后使用一些求解器来确定最佳的移动顺序。如果序列对你来说足够长,那很好,否则生成一个新的配置并重复。
更新和详情
维基百科上有一个 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.
要绝对确定状态的难度,您需要使用一些求解器找到最佳解决方案。启发式只会给你一个估计。
我会这样做
- 从解决方案开始(就像您所做的那样)
随机方向有效转弯
所以你必须跟踪间隙的位置并生成随机方向 (N,E,S,W)
并进行移动。我想这部分你也做过。
计算您的展示位置的随机性
所以根据数组的顺序计算一些系数。所以有序(已解决)的解决方案将具有低值,而随机将具有高值。然而,coefficiet 的等式是一个反复试验的问题。这里有一些使用方法的想法:
- 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)
与有序数组的绝对距离
您可以将更多方法组合在一起。您可以将其划分为单独的行和列,然后将子系数组合在一起。
来自#3的循环#2单元系数足够高(阈值)
阈值也可以用来改变难度。
我已经实现了一个谜题 15,供人们在线竞争。我当前的随机化器的工作原理是从良好的配置开始并移动方块 100 次(任意数)
一切都很好,但是,偶尔洗牌太容易了,只需要几步就可以解决这个问题,所以这个游戏对一些人来说真的很不公平。速度。
什么是随机化初始配置而不是 "too easy" 的好方法?
您可以生成一个完全随机的配置(即可求解的),然后使用一些求解器来确定最佳的移动顺序。如果序列对你来说足够长,那很好,否则生成一个新的配置并重复。
更新和详情
维基百科上有一个 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.
要绝对确定状态的难度,您需要使用一些求解器找到最佳解决方案。启发式只会给你一个估计。
我会这样做
- 从解决方案开始(就像您所做的那样)
随机方向有效转弯
所以你必须跟踪间隙的位置并生成随机方向
(N,E,S,W)
并进行移动。我想这部分你也做过。计算您的展示位置的随机性
所以根据数组的顺序计算一些系数。所以有序(已解决)的解决方案将具有低值,而随机将具有高值。然而,coefficiet 的等式是一个反复试验的问题。这里有一些使用方法的想法:
- 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)
与有序数组的绝对距离
您可以将更多方法组合在一起。您可以将其划分为单独的行和列,然后将子系数组合在一起。
来自#3的循环#2单元系数足够高(阈值)
阈值也可以用来改变难度。