在 or-tools 线性求解器中实现 IF-ELSE

Implementing IF-ELSE in or-tools linear solver

作为我的代码的一部分,我试图获取我的求解器试图解决的非零合同的总数,以便我可以添加约束并对其施加限制。由于 or-tools 不直接支持 if 语句,我决定使用我在许多网站上找到的 .OnlyEnforceIf() 解决方案。这是我想出的代码:

from ortools.linear_solver import pywraplp 
solver = pywraplp.Solver.CreateSolver('SCIP') 
max_count = 2 
symbol = ["a", "b", "c", "d"] 
Weights = {sym: solver.IntVar(0.0, 1000, sym) for sym in symbols}
bools = {sym: solver.BoolVar(sym) for sym in symbols} 
for sym in symbols:
     solver.Add(Weights[sym] == 0).OnlyEnforceIf(bools[sym].Not())
     solver.Add(Weights[sym] > 0).OnlyEnforceIf(bools[sym]) solver.Add(solver.Sum(list(bools.values())) == max_count)

我曾经 运行 一个简单的 If-Else 和 z3 求解器没有问题,但出于某种原因,or-tools 不支持它。这是我在网上找到的唯一方法,但是当我 运行 它时,我得到以下信息:

File "/Volumes/GoogleDrive/My Drive/xxx/xxStrategy/eng.py", line 63, in runner         solver.Add(Weights[sym] == 0).OnlyEnforceIf(bools[sym].Not())
 AttributeError: 'Constraint' object has no attribute 'OnlyEnforceIf' 

我不知道该怎么办,这让我很困扰!任何帮助将不胜感激。

您使用的API仅适用于CP-SAT。