如何线性化非凸约束?

How to linearize a non-convex constraint?

我是工程专业的学生,​​也是 CPLEX 的新用户。当我 运行 我的脚本时,它说我的约束之一是非凸的。我知道我应该把它线性化,但我不知道怎么做。

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

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

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

edh[i] 是一个输入(从 ij 浪费的能量)。 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])

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

非常感谢您!

你可以改变

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);
}