对于带有绝对值的非线性规划问题,尽量进行手工线性化再根据线性规划的方法去做。
例如:
对于
∣
x
i
∣
\vert x_i \vert
∣xi∣,我们无法运用正常的线性规划方式进行求解,因此我们可以进行变量变换,将模型转换为线性规划模型。
我们可以用两个线性规划变量来表示,令
u
i
=
x
i
+
∣
x
i
∣
2
,
v
i
=
∣
x
i
∣
−
x
i
2
,
i
=
1
,
2
,
3
,
4
u_i= \dfrac {x_i+\vert x_i \vert} 2,v_i=\dfrac {\vert x_i \vert-x_i} 2,i=1,2,3,4
ui=2xi+∣xi∣,vi=2∣xi∣−xi,i=1,2,3,4
令
u
u
u=
[
u
1
,
u
2
,
u
3
,
u
4
]
T
,
v
=
[
v
1
,
v
2
,
v
3
,
v
4
]
T
[u_1,u_2,u_3,u_4]^T,v=[v_1,v_2,v_3,v_4]^T
[u1,u2,u3,u4]T,v=[v1,v2,v3,v4]T
则转换成的线性规划模型为:
m
i
n
min
min
c
T
(
u
+
v
)
c^T(u+v)
cT(u+v)
s
t
st
st
{
A
(
u
−
v
)
≤
b
u
,
v
≥
0
\left\{ \begin{matrix} A(u-v)\leq b \\ u,v\geq0 \end{matrix} \right.
{A(u−v)≤bu,v≥0
所以我们在线性规划方程中添加一个变量就可以了。
c=[1,2,3,4];b=[-2;-1;-1/2];
a=[1,-1,-1,1;1,-1,1,-3;1,-1,-2,3];
prob=optimproblem('ObjectiveSense','min');//目标函数最小化,也可以写成prob=optimproblem;
u=optimvar('u',4,'LowerBound',0)//决策变量
v=optimvar('v',4,'LowerBound',0)//决策变量
prob.Objective=sum(c*(u+v))//目标函数
prob.Constraints.con=a*(u-v)<=b//约束条件
[sol,fval,flag,out]=solve(prob)//fval返回了最优值
x=sol.u-sol.v//求出xi的值
结果为
则最优解为
x
1
=
−
2
,
x
2
=
x
3
=
x
4
=
0
x_1=-2,x_2=x_3=x_4=0
x1=−2,x2=x3=x4=0.
最优值
f
v
a
l
=
2
fval=2
fval=2.