2

我試圖對一個系統組件的操作進行建模,該組件將有兩種操作模式,我們稱它們爲1和2,再加上空閒模式0連續變量塊在混合整數線性編程中具有相同的值

怠速沒有限制,但每個操作模式將持續正好3個時間序列點,所以x_ {i} = 1意味着x_ {i + 1} = x_ {i + 2} = 1(無法發佈圖像,請使用下面的方程中的鏈接) operation mode 1

同樣適用於操作模式2

例如。 011102220是有效的,但是01110220不是。

111111或222222無效,但這是在其他資源相關約束(系統將沒有足夠的資源來操作超過3個時間系列點)時處理的,所以只要涉及到在變量數組中強制三個連續的1或2s是地址,應該沒問題。

由於提前,

回答

-1

讓我們有所簡化問題:我們假設我們只有二進制值,這意味着,我們只關心0和1。

引入一個新的輔助二進制矢量start_block。此矢量標記開始新塊。

此二進制向量內的非零值是約束的一部分,它定義了塊的含義。

讓我們打電話給解決方案 - 矢量X

暗示以成對的方式完成。

# zero-order logic 
start_block[x] -> X[x] 
start_block[x] -> X[x+1] 
start_block[x] -> X[x+2] 

<=> 

# zero-order logic (a->b <-> !a V b) 
!start_block[x] V X[x] 
!start_block[x] V X[x+1] 
!start_block[x] V X[x+2] 

<=> 

# linear expression 
(1 - start_block[x]) + X[x] >= 1 
(1 - start_block[x]) + X[x+1] >= 1 
(1 - start_block[x]) + X[x+2] >= 1 

這樣做對(關心邊框)的X整個決策可變尺寸。

請記住,這只是說:如果X中有1,則它是大於等於3的塊的一部分。它可以是4塊。因爲我完全不知道你的模型,這是我可以提供的最一般的方法。當然,你可以進一步調整你的情況!

對整數變量進行一般化應該不會太難,但可能會引入新的輔助變量。長度的

+0

感謝您的快速回復! 你能詳細介紹一下你的代碼的第二塊嗎? !start_block v X [x]部分是否使start_block [x]爲0以指示X中的三個連續的1? – BeWater

+0

不,它說:如果start_block [x] == 1 - >在x的pos x,x + 1,x + 2處將會有1。因此,它取決於您的剩餘模型如何合併它(一般流程是:start-block意味着X上的東西;因此可能start_block是在其餘模型中使用的變量)。在代碼塊中,只有最後一部分是相關的。上面的兩個模塊只是爲了顯示它來自哪裏。 – sascha

+0

如果您需要某些其他方向的效果,您可以始終對其進行建模(例如,從X到start_block)。但對於至少3個大小的這種特殊情況,這個方向非常實用。 – sascha

3

奔跑正好三個可以被建模爲:

y(t+1) >= y(t)-y(t-1) 
y(t+2) >= y(t)-y(t-1) 
1-y(t+3) >= y(t)-y(t-1) 

其中y(t)是一個二進制變量。長度至少爲3的運行可以通過刪除最後一個約束來模擬:

y(t+1) >= y(t)-y(t-1) 
y(t+2) >= y(t)-y(t-1) 
+0

謝謝!但是,如果y(t)= 0,y(t-1)= 1,那麼第三個約束將讀爲y(t + 3)<= 0,是不是會導致對y值產生不需要的0值鎖定? (因爲y(t)= 0且y(t + 3)= 0,迫使y(t + 1)和y(t + 2)爲0,所以10⇒10000 – BeWater

+0

恐怕我沒有遵循如果'y(t)= 0,y(t-1)= 1',我們有'1-y(t + 3)> = -1'或者'y(t + 3)<= 2',這就是沒有約束力 –

+0

你是完全正確的!我在計算中犯了一個愚蠢的錯誤,我對這種混淆表示歉意。 – BeWater

相關問題