2014-07-19 37 views
2

我有一個ILP問題,其中我表達了一些約束來實現A或B,其中A和B是邏輯AND的結果(假設A = A1和A2,B = B1和B2和B3)。在我的問題的這一點上,A和B之間的一個被認爲等於1.A和B都是二進制變量。在整數線性規劃(ILP)中有多個賦值的If-Then-Else

我想表達的,與IF-THEN-ELSE,這種說法:

if (A == true) 
    /* Choose one between C and D */ 
    C_OR_D >= C; 
    C_OR_D >= D; 
    C_OR_D <= C + D; 
    C_OR_D = 1; 
else          /* or if (B == true), that's the same */ 
    /* Choose one between E and F */ 
    E_OR_F >= E; 
    E_OR_F >= F; 
    E_OR_F <= E + F; 
    E_OR_F = 1; 

我知道如何編寫簡單的IF-條件,如

/* if (x == true) then y = true */ 
y >= x; 

,但我不知道如何寫一組約束來表達一個「複雜」的if。

你們有人知道如何在LPSolve中解決這個問題嗎?

回答

2

要回答第一部分:

的,並且可以模擬爲

A >= A1 + A2 -1 
A <= A1 
A <= A2 

的,或者可以建模爲

B >= B1 
B >= B2 
B <= B1 + B2 

爲了模擬的if-else約束,你可以使用「大M」技術。

設M是一個足夠大的數字。

您可以通過在其一側添加M來「禁用」不等式。那麼不論變量值如何,不等式都成立。

例如

if (A == 1) 
    C_OR_D >= C; 
else 
    E_OR_F >= E; 

可以被建模爲

(1-A) * M + C_OR_D >= C 
A * M + E_OR_F >= E 
0

一種特殊情況是相當於 「如果X = N則SAME =真」。 在X A解決這一整數值是:

  1. SAME + BIGGER + SMALLER = 1
  2. X - M1 * BIGGER + SMALLER < = N
  3. X + M2 * SMALLER - 更大> = N

對於二元變量SAME,BIGGER,SMALLER和足夠大的數字M1,M2(取決於X的可能範圍)。

如果X = N,BIGGER和SMALLER必須爲0,否則違反後兩個方程之一。結果,SAME必須是1(等式1)。

如果X> N,那麼BIGGER = 1將禁用等式2,並且因爲X> = N + 1等式3仍然成立。 SAME = SMALLER = 0(等式1)。

如果X < N那麼SMALLER = 1將禁用等式3,因爲X < = N-1等式2仍然成立。 SAME = BIGGER = 0(等式1)。