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