Что означает «TypeError: G должно быть матрицей d» в «cvxpy»? - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь найти решение проблемы двоичного целочисленного программирования (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])
...