用唯一性约束随机化矩阵的算法

时间:2017-09-07 10:02:19

标签: python algorithm

我尝试使用以下约束开发一种用于随机化NxN矩阵N次的算法N次:在得到的矩阵中的所有列中,任何两个值A和B最多可以存在一次。例如,3x3矩阵随机化3次,结果如下:

matrix #0
[0, 3, 6]
[1, 4, 7]
[2, 5, 8]

matrix #1
[0, 3, 6]
[7, 1, 4]
[5, 8, 2]

matrix #2
[0, 3, 6]
[4, 7, 1]
[8, 2, 5]

任何给定列中任意两个数字A和B的配对,比如矩阵#0的第0列中的0和1,对于每个结果矩阵中的所有列都是唯一的。这种情况必须适用于矩阵中的每两个配对值。

我使用以下代码开发了我认为的解决方案:

#!/usr/bin/python

w,h = 5,5
matrix_list = []

def rotate(l,n):
    return l[-n:] + l[:-n]

def transpose(l):
    return list(map(list, zip(*l)))

matrix = [[x*w + y for x in range(w)] for y in range(h)]
#matrix = transpose(matrix)

for i in range(w):
    matrix_list.append(matrix[:])
    matrix = [rotate(matrix[n],n) for n in range(w)]

for m in matrix_list:
    for arr in m:
        print(arr)
    print('\n')

它只是移动每一行的值N个位置N是矩阵的行索引的值。

然而,我发现只要N是偶数且N> 1,算法就不起作用。 2,如下面的4x4矩阵的部分输出所示(重复行0和2中的值的配对):

(from matrix #0)
[0, 4, 8, 12]
[1, 5, 9, 13]
[2, 6, 10, 14]
[3, 7, 11, 15]

(from matrix #2)
[0, 4, 8, 12]
[9, 13, 1, 5]
[2, 6, 10, 14]
[11, 15, 3, 7]

我尝试了各种各样的转换和转置方法,并继续空洞。任何帮助创建偶数维矩阵的解决方案或覆盖奇数矩阵和偶数矩阵的一般解决方案都将非常感激。

0 个答案:

没有答案