簡體   English   中英

Julia (JuMP):具有多個條件值的指標約束(boolean 表達式可能嗎?)

[英]Julia (JuMP): Indicator constraints with multiple conditional values (is a boolean expression possible?)

我想根據我的二元決策變量x中的值隨“時間”的變化來實施約束。

我正在嘗試為電力系統的單元承諾優化問題實施最小運行時間約束。 x表示單元激活,其中01表示功率單元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

我檢查了指標約束是否僅適用於單個術語。

問題:這是可能的還是有其他明顯的解決方案?

故障排除和解決方法:我嘗試了以下方法(如果我的診斷錯誤,請糾正我):

  • 將更改實現為表達式:指標約束僅適用於二進制 integer 變量。
  • 將 change 實現為與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.

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