如何创建“至少n”约束?

2024-04-19 19:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我是约束编程的新手,并试图找出如何实现“至少n个”约束。在

例如,我有int变量x,y和z都在0到5的范围内。在

现在我要所有的解,其中至少有2个变量在2到3之间。在

所以像“给定条件之和>=2”

我该如何在python中使用Google的OR工具来实现呢?在

谢谢


Tags: or工具编程google条件int新手
2条回答

假设你有这些条件

x = 2.5
y = 4
z = 2.9

然后您可以构建一个值列表,然后应用lambdamap和{}来找出问题。例如:

^{pr2}$

它当然可以压实为:

if sum(map(lambda x: 1 if 2<=x<=3 else 0, values)) >= 2:
    # then at least 2 variables match the costraint
    pass
from ortools.sat.python import cp_model
import collections


class SolutionPrinter(cp_model.CpSolverSolutionCallback):
    """Print intermediate solutions."""

    def __init__(self, variables):
        cp_model.CpSolverSolutionCallback.__init__(self)
        self.__variables = variables
        self.__num_vars = len(variables)
        self.__num_values = len(variables[0])
        self.__solution_count = 0

    def on_solution_callback(self):
        self.__solution_count += 1
        for var in range(self.__num_vars):
            for value in range(self.__num_values):
                if self.BooleanValue(self.__variables[var][value]):
                    print('var[%i]=%i' % (var, value), end=' ')
                    break
        print()

    def solution_count(self):
        return self.__solution_count


num_vars = 3
max_values = 5

model = cp_model.CpModel()
vars = collections.defaultdict(list)

for var in range(num_vars):
    for value in range(max_values + 1):
        vars[var].append(model.NewBoolVar('x_%i_%i' % (var, value)))

# Exactly one value per variable
for var in range(num_vars):
    model.Add(sum(vars[var]) == 1)

# At least 2 between 2 and 3
model.Add(sum(vars[var][2] for var in range(num_vars)) +
          sum(vars[var][3] for var in range(num_vars)) >= 2)

# Enumerate all solutions
solver = cp_model.CpSolver()
solution_printer = SolutionPrinter(vars)
status = solver.SearchForAllSolutions(model, solution_printer)

print('Status = %s' % solver.StatusName(status))
print('Number of solutions found: %i' % solution_printer.solution_count())

输出

^{pr2}$

相关问题 更多 >