def get_sudoku_matrix(n):
X = np.array([[cp.Variable(n**2) for i in range(n**2)] for j in range(n**2)])
cons = ([x >= 0 for row in X for x in row] +
[cp.sum_entries(x) == 1 for row in X for x in row] +
[sum(row) == np.ones(n**2) for row in X] +
[sum([row[i] for row in X]) == np.ones(n**2) for i in range(n**2)] +
[sum([sum(row[i:i+n]) for row in X[j:j+n]]) == np.ones(n**2) for i in range(0,n**2,n) for j in range(0, n**2, n)])
f = sum([cp.sum_entries(x) for row in X for x in row])
prob = cp.Problem(cp.Minimize(f), cons)
A = np.asarray(prob.get_problem_data(cp.ECOS)["A"].todense())
A0 = [A[0]]
rank = 1
for i in range(1,A.shape[0]):
if np.linalg.matrix_rank(A0+[A[i]], tol=1e-12) > rank:
A0.append(A[i])
rank += 1
return np.array(A0)
评论列表
文章目录