如何限制约束编程中的零数

时间:2014-03-10 11:27:03

标签: python math constraint-programming integer-programming

对于给定的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]允许解决方案中的任意数量的零。如何指定解决方案中允许的确切数量的零?

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