具有OR逻辑的LP / MILP配方

时间:2019-11-11 13:44:16

标签: optimization mathematical-optimization linear-programming cplex mixed-integer-programming

我正在使用ILOG CPLEX解决LP / MILP问题。

int n = ...;
range time =1..n;

dvar float+ c[time] in 0..0.3;
dvar float+ d[time] in 0..0.3;
dvar float+ x[time];

int beta[time]=...;
float pc[time]=...;
float pd[time]=...;

//Expressions

dexpr float funtion = sum(t in time) (d[t]*pd[t]-c[t]*pc[t]); 

//Model

maximize function;

subject to {

    x[1] == 0.5;
    c[1] == 0;
    d[1] == 0;

    forall(t in time)
        const1:
            x[t] <= 1;          

    forall(t in time: t!=1)
        const2:
            (x[t] == x[t-1] + c[t] - d[t]);         

    forall(t in time: t!=1)
        const3:         
            ( d[t] <= 0) || (c[t] <= 0); 

正如您所看到的,我已经使用“ const3”强制将c [t]和d [t]永远不要大于0。

我的问题是,如何在LP / MILP数学公式中表示此约束?

添加这个新变量是否足够? :

y [t]≤c[t] + d [t]

y [t]≥c[t]

y [t]≥d[t]

0≤y[t]≤M(M是c或d的最大值)

1 个答案:

答案 0 :(得分:2)

据我所知,您建议的约束条件将允许此设置:

c[t] = 0.1
d[t] = 0.1
y[t] = 0.2

其中cd同时不同于0。

我可以看到以下选项来制定您的条件而不受逻辑约束:

1)使用仅包含c[t]d[t]的SOS约束。根据SOS的定义,在任何可行的解决方案中,只有两者之一可以为非零。

2)使用 boolean 变量y[t]并添加约束条件

c[t] <= M * y[t]
d[t] <= M * (1 - y[t])

3)再次使用布尔值y[t],然后使用指标约束

(y[t] == 0) => (c[t] == 0);
(y[t] == 1) => (d[t] == 0);

4)您可以只声明c[t] * d[t] == 0,但这会使模型成为非线性。

在任何情况下,求解器都可以将您的原始公式减小为2或3。因此重新构造约束可能不会使事情变得更快,而只会变得更加晦涩。