我已经使用元组的排列实现了魔方。不变的多维数据集表示为(0,1,2,...,45,46,47)。
要将“转弯”应用于多维数据集,数字将随机排列。我已经对所有转弯进行了充分的测试,以至于我相当确定没有错别字。
我一直在尝试实现一种检查多维数据集是否有效的方法,因为(1,2,... 47,48)的12个随机排列中只有1个是有效的多维数据集。为了使排列成为有效的Rubik立方体,它必须满足3个要求。该SO线程对此进行了充分的记录:https://math.stackexchange.com/questions/127577/how-to-tell-if-a-rubiks-cube-is-solvable
3个步骤是: 边缘方向:边缘翻转的次数必须是偶数。 转角方向:转角次数必须除以3。 排列奇偶校验:这是我遇到麻烦的地方。排列奇偶校验必须是偶数,这意味着拐角奇偶校验必须与边缘奇偶校验匹配。
SymPy库为我提供了一种使用许多置换组属性的好方法,因此在计算置换奇偶校验的尝试中将其包括在内。
在应成功时失败的最简单的测试输入是多维数据集的向后旋转,表示为B。
代码如下:
def check_permutation_parity(cube):
corners = cube[:24]
edges = cube[24:]
edges = [e - 24 for e in edges]
corner_perms = corner_perms_only(corners)
edge_perms = edge_perms_only(edges)
normalized_corners = [int(c/3) for c in corner_perms]
normalized_edges = [int(e/2) for e in edge_perms]
sympy_corners = Permutation(list(normalized_corners))
sympy_edges = Permutation(list(normalized_edges))
corners_perm_parity = Permutation(list(normalized_corners)).parity()
edges_perm_parity = Permutation(list(normalized_edges)).parity()
if corners_perm_parity != edges_perm_parity:
return False
return True
使用一堆打印语句,我概述了整个代码中发生的事情:
这是初始状态。这是立方体的B排列,看起来像预期的那样。
cube:
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 18, 19, 20, 12, 13, 14, 21, 22, 23, 15, 16, 17, 24, 25, 26, 27, 30, 31, 28, 29, 32, 33, 36, 37, 34, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47)
接下来,我们看一下拐角和边缘。请记住,边上每边减去24。这对于最终转换为SymPy排列是必要的。
corners, edges
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 18, 19, 20, 12, 13, 14, 21, 22, 23, 15, 16, 17)
[0, 1, 2, 3, 6, 7, 4, 5, 8, 9, 12, 13, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
然后,我们仅提取每个3个角和每个2个边。因为我们不在乎方向,所以我们只能查看每个片段的排列。
corner_perms_only, edges_perms_only
(0, 3, 6, 9, 18, 12, 21, 15)
(0, 2, 6, 4, 8, 12, 10, 14, 16, 18, 20, 22)
然后我们以2或3的比例神化为SymPy
normalized_corners, edges
[0, 1, 2, 3, 6, 4, 7, 5]
[0, 1, 3, 2, 4, 6, 5, 7, 8, 9, 10, 11]
转换为SymPy后,拐角如下所示:
sympy corners
(4 6 7 5)
[(4, 5), (4, 7), (4, 6)]
[[0], [1], [2], [3], [4, 6, 7, 5]]
边缘看起来像这样:
sympy edges
(11)(2 3)(5 6)
[(2, 3), (5, 6)]
[[0], [1], [2, 3], [4], [5, 6], [7], [8], [9], [10], [11]]
给我们这种平价,因为拐角由3个周期组成,边缘由2个周期组成:
角,烫发边平价
1
0
由于奇偶校验不同,该函数返回false。
B:错
我们知道奇偶校验应该匹配,但是我无法获得结果,而且我迷失在哪里可以进行进一步的调试。所有代码都可以在我的GitHub上找到:https://github.com/elliotmartin/RubikLite/blob/master/Rubik.py
答案 0 :(得分:0)
我的问题与SymPy和排列奇偶无关。为了检查这一点,我实现了自己的循环分解算法,然后检查了奇偶校验。最后,问题与我如何为每个动作设置排列有关。
我想我已经学到了很多关于测试的知识-如果您的测试没有测试正确的东西,那么它们就没那么有用了。