簡體   English   中英

使用 SCIP 定義混合整數問題中的 OR 約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM