Для заданных n и m я перебираю все n на m частичных циркулирующих матриц с записями, которые либо 0 или 1. Я хочу найти, существует ли такая матрица, в которой нет двух подмножеств столбцов, дающих одинаковую сумму. Здесь, когда мы добавляем столбцы, мы просто делаем это поэлементно. В моем текущем коде используется программирование в ограничениях с помощью ortools. Однако это не так быстро, как хотелось бы. Для n = 7 и m = 12 он занимает более 3 минут, а для n = 10, m = 18 он не завершается, хотя необходимо учитывать только 2 ^ 18 = 262144 различных матрицы. Вот мой код.
from scipy.linalg import circulant
import numpy as np
import itertools
from ortools.constraint_solver import pywrapcp as cs
n = 7
m = 12
def isdetecting(matrix):
X = np.array([solver.IntVar(values) for i in range(matrix.shape[1])])
X1 = X.tolist()
for row in matrix:
x = X[row].tolist()
solver.Add(solver.Sum(x) == 0)
db = solver.Phase(X1, solver.INT_VAR_DEFAULT, solver.INT_VALUE_DEFAULT)
solver.NewSearch(db)
count = 0
while (solver.NextSolution() and count < 2):
solution = [x.Value() for x in X1]
count += 1
solver.EndSearch()
if (count < 2):
return True
values = [-1,0,1]
solver = cs.Solver("scip")
for row in itertools.product([0,1],repeat = m):
M = np.array(circulant(row)[0:n], dtype=bool)
if isdetecting(M):
print M.astype(int)
break
Можно ли решить эту проблему достаточно быстро, чтобы можно было решить n = 10, m = 18?