将 9 个 3x3 矩阵按特定顺序排列成 9x9 矩阵

问题描述 投票:0回答:1

主要问题是我必须排列矩阵:

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)

所有矩阵只能使用一次且不能旋转。

visual

在纸面上我知道它应该是什么,但无法在 python 中工作。

我尝试用蛮力,随机放置它们,直到找到正确的解决方案(用 IF 检查总和),但程序被冻结了。

尝试按位置 1、2、3 排列它们并检查,但无法弄清楚如何不使用旧的、新的轮胎,并在下一节中使用之前失败的东西。

有没有办法在Python中解决这个问题?

python numpy matrix sum
1个回答
0
投票

暴力破解版(没有任何优化):

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
© www.soinside.com 2019 - 2024. All rights reserved.