Optimization 具有OR逻辑的LP/MILP公式

Optimization 具有OR逻辑的LP/MILP公式,optimization,mathematical-optimization,linear-programming,cplex,mixed-integer-programming,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

我正在使用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); 
intn=。。。;
范围时间=1..n;
0..0.3中的dvar浮点+c[时间];
0..0.3中的dvar浮点+d[时间];
dvar浮点+x[时间];
int beta[时间]=。。。;
浮动pc[时间]=。。。;
浮动pd[时间]=。。。;
//表情
dexpr float funtion=时间总和(t)(d[t]*pd[t]-c[t]*pc[t]);
//模型
功能最大化;
服从{
x[1]==0.5;
c[1]==0;
d[1]==0;
forall(及时)
常数1:

x[t]据我所知,您建议的约束将允许此设置:

c[t] = 0.1
d[t] = 0.1
y[t] = 0.2
同时具有与0不同的
c
d

我可以看到这些选项来描述您的条件,而不受逻辑约束:

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

2) 使用布尔变量
y[t]
并添加约束

c[t] <= M * y[t]
d[t] <= M * (1 - y[t])
(y[t] == 0) => (c[t] == 0);
(y[t] == 1) => (d[t] == 0);
4) 您可以只声明
c[t]*d[t]==0
,但这将使模型非线性


在任何情况下,解算器都可能将您的原始公式减少到2或3。因此,重新设置约束可能不会使事情变得更快,而只会使事情变得更加模糊。

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

c[t] = 0.1
d[t] = 0.1
y[t] = 0.2
同时具有与0不同的
c
d

我可以看到这些选项来描述您的条件,而不受逻辑约束:

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

2) 使用布尔变量
y[t]
并添加约束

c[t] <= M * y[t]
d[t] <= M * (1 - y[t])
(y[t] == 0) => (c[t] == 0);
(y[t] == 1) => (d[t] == 0);
4) 您可以只声明
c[t]*d[t]==0
,但这将使模型非线性

在任何情况下,解算器都可能将您的原始公式减少到2或3。因此,重新设置约束可能不会使事情变得更快,而只会使事情变得更加模糊