如何线性化非凸约束?
How to linearize a non-convex constraint?
我是工程专业的学生,也是 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])
但这不是我的脚本所需要的。
非常感谢您!
你可以改变
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);
}
我是工程专业的学生,也是 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])
但这不是我的脚本所需要的。
非常感谢您!
你可以改变
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);
}