[英]Julia (JuMP): Indicator constraints with multiple conditional values (is a boolean expression possible?)
我想根據我的二元決策變量x
中的值隨“時間”的變化來實施約束。
我正在嘗試為電力系統的單元承諾優化問題實施最小運行時間約束。 x
表示單元激活,其中0
和1
表示功率單元n
在特定時間t
分別關閉或打開。
為此, 指標約束似乎是一個有前途的解決方案,並且在類似問題的啟發下,實施似乎非常簡單。
因此,由於引入了 boolean 運算符( !
和¬
),我過早地想以 boolean 的方式表達變化:
@constraint(m, xx1[n=1:N,t=2:T], (!x[n,t-1] && x[n,t]) => {next(t, 1) + next(t, 2) == 2})
說:如果單位之前被停用但現在處於開啟狀態,則要求該單位在接下來的 2 次處於活動狀態。
哪里next(t, i) = x[((t - 1 + i) % T) + 1]
。
我收到以下錯誤:
LoadError: MethodError: no method matching !(::VariableRef)
Closest candidates are:
!(!Matched::Missing) at missing.jl:100
!(!Matched::Bool) at bool.jl:33
!(!Matched::Function) at operators.jl:896
我檢查了指標約束是否僅適用於單個術語。
問題:這是可能的還是有其他明顯的解決方案?
故障排除和解決方法:我嘗試了以下方法(如果我的診斷錯誤,請糾正我):
x
相關的另一個變量。 我找到了一個解決方案,但它非常粗略,記錄在Julia discourse 中。 從解決方案中發現的直接問題是指標約束不能作為雙向蘊涵,而只能作為一種方式, LHS->RHS
。 請參閱@Oscar Dowson 給出的正確方法。您可以從github獲得工作代碼。
訣竅是找到具有等效真值表的約束:
# Like
(!x[1] && x[2]) => {z == 1}
# Is equivalent to:
z >= -x[1] + x[2]
# Proof
-x[1] + x[2] = sum <= z
--------------------------
- 0 + 0 = 0 <= 0
- 1 + 0 = -1 <= 0
- 0 + 1 = 1 <= 1
- 1 + 1 = 0 <= 0
我被推薦給 MOSEK Modeling Cookbook來幫助制定正確的約束公式。
最終請參閱此處的線程以獲取更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.