主要问题是我必须排列矩阵:
matrix1 = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]])
matrix2 = np.array([[0, 0, 1], [0, 0, 0], [1, 0, 0]])
matrix3 = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]])
matrix4 = np.array([[1, 0, 1], [0, 0, 0], [1, 0, 1]])
matrix5 = np.array([[1, 0, 1], [0, 1, 0], [1, 0, 1]])
matrix6 = np.array([[1, 1, 1], [0, 0, 0], [1, 1, 1]])
matrix7 = np.array([[1, 1, 1], [1, 0, 0], [1, 1, 1]])
matrix8 = np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1]])
matrix9 = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
变成 9x9 矩阵,其中
row_sums == [9, 4, 9, 5, 2, 5, 4, 3, 4]) and
column_sums == [5, 4, 5, 7, 4, 7, 5, 4, 4]) and
diagonal_sum1 == 6 and diagonal_sum2 == 6)
所有矩阵只能使用一次且不能旋转。
在纸面上我知道它应该是什么,但无法在 python 中工作。
我尝试用蛮力,随机放置它们,直到找到正确的解决方案(用 IF 检查总和),但程序被冻结了。
尝试按位置 1、2、3 排列它们并检查,但无法弄清楚如何不使用旧的、新的轮胎,并在下一节中使用之前失败的东西。
有没有办法在Python中解决这个问题?
暴力破解版(没有任何优化):
from itertools import permutations
import numpy as np
matrices = [
matrix1,
matrix2,
matrix3,
matrix4,
matrix5,
matrix6,
matrix7,
matrix8,
matrix9,
]
for c in permutations(matrices, 9):
r1 = np.r_[c[0], c[1], c[2]]
r2 = np.r_[c[3], c[4], c[5]]
r3 = np.r_[c[6], c[7], c[8]]
f = np.c_[r1, r2, r3]
row_sums = f.sum(axis=1)
if np.allclose(row_sums, [9, 4, 9, 5, 2, 5, 4, 3, 4]):
col_sums = f.sum(axis=0)
if np.allclose(col_sums, [5, 4, 5, 7, 4, 7, 5, 4, 4]):
if f.diagonal().sum() == 6 and np.fliplr(f).diagonal().sum() == 6:
print("Solution:")
print(f)
break
打印(在我的 AMD 5700x 上大约需要 13 秒):
Solution:
[[1 1 1 1 1 1 1 1 1]
[1 1 1 0 0 0 1 0 0]
[1 1 1 1 1 1 1 1 1]
[0 0 1 1 0 1 1 0 1]
[0 1 0 0 0 0 0 1 0]
[1 0 0 1 0 1 1 0 1]
[0 0 1 1 1 1 0 0 0]
[0 0 0 1 0 1 0 1 0]
[1 0 0 1 1 1 0 0 0]]
real 0m13,802s
user 0m0,008s
sys 0m0,008s