当前位置: 代码迷 >> python >> 如何限制约束编程中的零数
  详细解决方案

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

热度:61   发布时间:2023-07-14 08:58:15.0

对于给定的n和m,我迭代所有n乘m个部分矩阵,其条目为0或1.我想找到是否存在矩阵,使得没有两个具有相同和的列的子集。 在我们添加列时,我们只是按元素进行。 我目前的代码使用约束编程。 这是我的代码。

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

在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()的使用示例: ://hakank.org/or-tools/young_tableaux.py。

还有一个概括的solver.Count(),即solver.Distribute(又名Global Cardinality Count,GCC),您可以在其中同时计算/约束多个值。 有关如何使用的示例,请参阅我的deBruijn序列模型: ://hakank.org/or-tools/debruijn_binary.py。

  相关解决方案