对于给定的n和m,我迭代所有n个m个部分circulant矩阵,其条目为0或1.我想找到是否存在矩阵,使得没有两个子集具有相同总和的列。在我们添加列时,我们只是按元素进行。我当前的代码通过ortools使用约束编程。这是我的代码。
from scipy.linalg import circulant
import numpy as np
import itertools
from ortools.constraint_solver import pywrapcp as cs
n = 4
m = 6
def isdetecting(matrix):
solver = cs.Solver("scip")
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.CHOOSE_FIRST_UNBOUND, solver.ASSIGN_CENTER_VALUE)
solver.NewSearch(db)
count = 0
#Find just one non-zero solution if there is one
while (solver.NextSolution() and count < 2):
solution = [x.Value() for x in X1]
count += 1
solver.EndSearch()
if (count == 1):
return True
values = [-1,0,1]
nosols = 0
for row in itertools.product([0,1],repeat = m):
M = np.array(circulant(row)[0:n], dtype=bool)
if isdetecting(M):
nosols += 1
print M.astype(int)
行values = [-1,0,1]
允许解决方案中的任意数量的零。如何指定解决方案中允许的确切数量的零?
答案 0 :(得分:3)
在or-tools / Python中,可能会使用全局约束solver.Count()。例如:
the_count = 1 # number of 0's allowed
solver.Add(solver.Count(X1, 0,the_count))
其中“the_count”是(平面)数组“X1”中允许的0的数量。 the_count可以是常量变量或决策变量(因此您可以通过进一步约束来约束该值,或者只是让域执行约束计数的工作,例如域1..4将计数约束为1到4次出现)。
“X1”是检查的决策变量数组。第二个参数“0”是要在X中计数的值。
solver.Count()的使用示例:http://hakank.org/or-tools/young_tableaux.py。
还有一个概括的solver.Count(),即solver.Distribute(a.k.a。Global Cardinality Count,GCC),您可以在其中同时计算/约束多个值。请参阅我的deBruijn序列模型,了解如何使用它:http://hakank.org/or-tools/debruijn_binary.py。