對於給定的n和m我遍歷由米局部circulant矩陣所有n與是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可以解決?
我想用一個更快的編譯器切換到一種語言,並應用一些嘮叨的蠻力。具有2^18 64位整數的2^18元素獨立性計算聽起來對我來說是可行的。 –