我是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])
但这不是我的脚本所需要的。
非常感谢您!
答案 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],它是二进制决策变量和另一个决策变量之间的乘积,您可以依靠
我提供了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);
}
致谢