Я пытаюсь найти решение проблемы двоичного целочисленного программирования (BIP) в Судоку. Я моделирую это как:
- Сетка: 2D 2D список 9x9, каждая с 9 двоичными переменными.
- Ограничения: стандартные правила судоку
- Цель: максимизировать (1)
- Исходные значения: нет, я просто хочу получить пример решения
Вот код. Момент снятия ограничения boolean = True , ошибки нет. Но как это может работать с логическим ограничением. Я не понимаю значение "TypeError: G должна быть матрица 'd'". Любая подсказка будет полезна.
import cvxpy as cp
import numpy as np
x = [[cp.Variable(9, boolean=True) for j in range(9)] for i in range(9)]
objective = cp.Maximize(1)
constraints = []
cs = constraints
for i in range(9):
for j in range(9):
# one value per square
cs.append(cp.sum(x[i][j]) == 1)
# unique value every row
cs.append(cp.sum([x[k][i][j] for k in range(9)]) == 1)
# unique value every column
cs.append(cp.sum([x[i][k][j] for k in range(9)]) == 1)
# unique value every box
cs.append(cp.sum([x[(i//3)*3+k//3][(i%3)*3+k%3][j] for k in range(9)]) == 1)
prob = cp.Problem(objective, constraints)
result = prob.solve()
print("z:", result)
a = [[0 for j in range(9)] for i in range(9)]
for i in range(9):
for j in range(9):
for k in range(9):
if(x[i][j].value[k] > 0):
a[i][j] = k+1
print(a[i])