如何线性化一个非凸约束?

时间:2019-05-20 15:25:04

标签: cplex opl

我是CPLEX的一名工程专业学生和新用户。当我运行脚本时,它说我的约束之一是非凸的。我知道我应该线性化它,但是我不知道如何。

x[i][j]是一个二进制变量。

E[i]是一个连续变量,取决于x[i][j]

eev[i]是输入(在路径i上浪费了能量)。

edh[i]是一种输入(能量从i浪费到j)。 emax也是一个输入,一个常量。是初始电池电量,即最高电量。

这是电动汽车调度公式的一部分,E[i]是经过i路线后该车辆上剩余的能量。

如何线性化以下约束,以免出现非凸形:

E[j] <= (E[i]-edh[i][j]-eev[j])*x[i][j]+emax*(1-x[i][j])

我知道如何线性化它:

E[j] == (E[i]-edh[i][j]-eev[j])*x[i][j]+emax*(1-x[i][j])

但这不是我的脚本所需要的。

非常感谢您!

1 个答案:

答案 0 :(得分:0)

您可以更改

E[j] <= (E[i]-edh[i][j]-eev[j])*x[i][j]+emax*(1-x[i][j])

进入

E[j] <= E[i]*x[i][j]-edh[i][j]*x[i][j]-eev[j]*x[i][j]+emax*(1-x[i][j])

并且为了处理E [i] * x [i] [j],它是二进制决策变量和另一个决策变量之间的乘积,您可以依靠

https://www.ibm.com/developerworks/community/forums/html/topic?id=aa9aa3db-4fbc-4209-a767-5b5e54902cbd&ps=25

我提供了3种方法。

其中之一是转弯

dvar int x in 2..10;
dvar boolean b;

maximize x;
subject to
{
b*x<=7;
}

进入

dvar int x in 2..10;
dvar boolean b;

dvar int bx;

maximize x;
subject to
{
bx<=7;



2*b<=bx;
bx<=10*b;

bx<=x-2*(1-b);
bx>=x-10*(1-b);
}

致谢