在或工具线性求解器中实现IF-ELSE



作为我的代码的一部分,我试图获得求解器试图求解的非零契约的总数,这样我就可以添加约束并对其进行限制。由于or工具不直接支持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)

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

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。

最新更新