[英]Defining OR-constraint in mixed-integer problem with SCIP
我正在嘗試使用 SCIP 工具 ( https://github.com/scipopt/PySCIPOpt ) 的 python 接口來解決混合整數優化問題。
我想定義一個具有三個約束的 OR 約束,但必須只滿足其中一個。
例如,我想最小化一個變量x
具有三個約束x>=1, x>=2, x>=3
,但其中只有一個必須是有效的,然后最小化x
的值。 當然結果應該是x=1
。
然而,OR 約束 API addConsOr
需要約束列表和結果變量(resvar,操作的結果變量)。 雖然我可以提供約束列表,但我不知道第二個 function 參數中結果變量的含義。 當我將第二個參數設置為新變量時,以下代碼無法運行並導致分段錯誤。
from pyscipopt import Model
model = Model()
x = model.addVar(vtype = "I")
b = model.addVar(vtype="B")
model.addConsOr([x>=1, x>=2, x>=3], b)
model.setObjective(x, "minimize")
model.optimize()
print("Optimal value:", model.getObjVal())
此外,將第二個變量設置為 True 也會出現分段錯誤。
model.addConsOr([x>=1, x>=2, x>=3], True)
您所描述的不是 OR 約束。 or-constraint 是一種約束,它考慮一組二進制變量並將結果作為這些值的 OR,如SCIP 文檔中所述。
你想要的是一個一般的析取約束。 這些在 SCIP 中作為SCIPcreateConsDisjunction
存在,但尚未包含在 Python API 中。 幸運的是,您可以很容易地自己擴展 API。 只需將正確的 function 添加到scip.pxd
並在scip.pyx
中定義包裝器。 只需看看它是如何針對現有約束類型完成的,並以相同的方式進行。 如果您使用更改創建拉取請求,PySCIPOpt GitHub 的人員將會很高興。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.