簡體   English   中英

Matlab優化-約束中優化變量的條件和

[英]Matlab optimization - conditional sum of optimization variable in constraint

我正在嘗試使用MATLAB (bintprog)中的二進制變量來解決ILP問題。 我需要定義如下的約束:

約束

我想對二進制變量x<sub>i, j</sub>求和,直到其中一個zero ,然后停止該求和。 如何在ILP中定義此約束?

在我看來,這是非常不典型的MIP約束。 這是我嘗試制定的方式:

在此處輸入圖片說明

您必須考慮:

  • 處理情況B(取決於你的目標和其他約束)的必要性和BIGM的方法的挫折很好讀
  • 如何實現兩個二進制變量的乘積(這很容易;請參見此處

編輯

以二進制輔助變量的兩倍數量為代價,也可以在沒有bigM常數的情況下公式化它。

草圖:

  • 與其使用單方面的含義來設置指標,不如使用等於 == 兩種含義 ->沒有aux-var是免費的; 全部為0或1,僅取決於x(z)
  • 現在,按照以下思路構建第二層二進制輔助變量(b_i): b_i >= smallConst * b_i-1 + smallConst * a_i (smallConst in(0,0.5];不應接近0)
  • 將b-vector用於最終的總和約束(如上文所述;但不再使用a-vector!)

我的閱讀方式(有點困難,因為幾乎沒有解釋;我想這個問題的措辭可能更清楚),這實際上是在計算第一個x(k)的值為1。這里我假設x(i,j)映射到x(k)因此我們可以更好地定義順序。 可以使用新的二進制變量y(k)進行計數:

y(k) = x(k)*y(k-1)   if k>1
y(k) = x(k)          if k=1
y(k) in {0,1}

例如:

x = [1 1 1 0 1 0]
y = [1 1 1 0 0 0]

非線性表達式x(k)*y(k-1)可以很容易地線性化(它是兩個二進制變量的乘積;請參見此處 ;請注意,使用此公式,我們甚至可以將y(k)放寬到0和1之間的連續值)。 優化的版本如下所示:

y(k) >= x(k)+y(k-1)-1   if k>1
y(k) = x(k)             if k=1
0 <= y(k) <= 1

現在你可以做

sum(k, y(k)) <= c

這種表述也可以說:前導1的數量應在c1和c2之間。

我們也可以立即寫:

x(1) + ... + x(c+1) <= c

這也禁止超過c的前1個,甚至更簡單。

我們更經常看到的另一個問題(例如,在發電機調度中)是以下條件:我們不能打開c個以上連續x(k) (即,在c個連續周期內,發電機不能打開超過c個連續周期)開啟時,必須關閉發電機至少1個小時)。 這意味着我們不允許序列超過c 1個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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