很多时候,问题不是简单的线性规划问题,而是更为复杂的非线性规划问题
当目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。
例 某企业由n个项目可以投资,至少投资一个。设该企业的总资金为A,投资第i个项目需要花费 a i a_i ai,并且预计收益分别为 b i b_i bi。选择最佳的投资方案
解 投资决策变量为
x i = { 0 , 投 资 第 i 个 项 目 1 , 不 投 资 第 i 个 项 目 x_i=\begin{cases} 0,投资第i个项目\\ 1,不投资第i个项目 \end{cases} xi={0,投资第i个项目1,不投资第i个项目
则投资总额为 ∑ i = 1 n a i x i \sum\limits_{i=1}^n a_ix_i i=1∑naixi,投资总收益为 ∑ i = 1 n b i x i \sum\limits_{i=1}^n b_ix_i i=1∑nbixi列出数学模型为
m a x Q = ∑ i = 1 n a i x i ∑ i = 1 n b i x i , s . t . { 0 < ∑ i = 1 n a i x i ≤ A x i ( 1 − x i ) = 0 , i = 1 , 2 , . . . , n max\ Q=\frac{\sum\limits_{i=1}^n a_ix_i}{\sum\limits_{i=1}^n b_ix_i},\\ s.t.\begin{cases} 0<\sum\limits_{i=1}^n a_ix_i\le A\\ x_i(1-x_i)=0,i=1,2,...,n \end{cases} max Q=i=1∑nbixii=1∑naixi,s.t.⎩⎨⎧0<i=1∑naixi≤Axi(1−xi)=0,i=1,2,...,n
该模型中的目标函数和约束条件都是非线性的,将上述模型概括成一般形式
m i n f ( x ) , s . t . { h j ( x ) ≤ 0 , j = 1 , . . . , q g i ( x ) = 0 , i = 1 , . . . , p min\ f(\bm x),\\ s.t.\begin{cases} h_j(\bm x)\le 0,j=1,...,q\\ g_i(\bm x)=0,i=1,...,p \end{cases} min f(x),s.t.{hj(x)≤0,j=1,...,qgi(x)=0,i=1,...,p
matlab中非线性规划的数学模型写成一下形式:
m i n f ( x ) , s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q c ( x ) ≤ 0 c e q ( x ) = 0 l b ≤ x ≤ u b min\ f(\bm x),\\ s.t.\begin{cases} \bm{A\cdot x\le b}\\ Aeq\cdot \bm x=beq\\ c(\bm x)\le 0\\ ceq(\bm x)=0\\ lb\le\bm x\le ub \end{cases} min f(x),s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧A⋅x≤bAeq⋅x=beqc(x)≤0ceq(x)=0lb≤x≤ub
引入matlab的求解命令
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
fun和nonlcon都是用m文件定义的函数,x0是x的初始值,具体函数的定义如下所展示
(1)fun1.m定义目标函数
function f=fun1(x);
f=sum(x.^2)+8;
(2)fun2.m定义约束条件,其中g表示不等约束条件,h表示等式约束条件
function[g,h]=fun2(x);
g=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^2-20];
h=[-x(1)-x(2)^2+x(3)^3
x(2)+2*x(3)^2-3];
可直接使用
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
二次规划是一种特殊的非线性规划问题,目标函数是二次函数,而约束条件只是线性的,就称这种规划为二次规划
m i n 1 2 x T H x + f T x s . t . { A x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b min\ \frac{1}{2}\bm x^T\bm {Hx}+f^T\bm x\\ s.t.\begin{cases} \bm{Ax\le b}\\ Aeq\cdot x= beq\\ lb\le x\le ub \end{cases} min 21xTHx+fTxs.t.⎩⎪⎨⎪⎧Ax≤bAeq⋅x=beqlb≤x≤ub
值得一提的是H是是对称矩阵,是而H前有 1 2 \frac{1}{2} 21,所以数值需要乘2
matlab中的求解二次规划的命令是
[x,fval]=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
第(1)问是线性规划的知识点
决策变量是 x i ( i = 1 , . . . , 12 ) x_i(i=1,...,12) xi(i=1,...,12),表示A,B料场到每个工地的运输水泥吨数
则目标函数为
m i n ∑ i = 1 12 x i ( a i − a 料 场 ) 2 + ( b i − b 料 场 ) 2 min \sum\limits_{i=1}^{12}x_i\sqrt{(a_i-a_{料场})^2+(b_i-b_{料场})^2} mini=1∑12xi(ai−a料场)2+(bi−b料场)2
约束条件为
s . t . { ∑ i = 1 6 x i ≤ 20 ∑ i = 7 12 x i ≤ 20 x j + x j + 6 = d j j = 1 , 2 , . . . 6 s.t.\begin{cases} \sum\limits_{i=1}^6 x_i\le20\\ \sum\limits_{i=7}^{12} x_i\le20\\ x_j+x_{j+6}= d_j\ j=1,2,...6 \end{cases} s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧i=1∑6xi≤20i=7∑12xi≤20xj+xj+6=dj j=1,2,...6
第(2)问是二次规划
在第一问的基础上引入新决策变量 a A , b A , a B , b B a_A,b_A,a_B,b_B aA,bA,aB,bB表示地是两个料场的位置
目标函数是一个非线性的函数需要在m文件中定义
function f=fun1(x);
a=[1.25,8.75,0.5,5.75,3,7.25];
b=[1.25,0.75,4.75,5,6.5,7.75];
d=[3,5,4,7,6,11];
f1=0;
for i=1:6
s(i)=sqrt((x(13)-a(i))^2+(x(14)-b(i))^2);
f1=s(i)*x(i)+f1;
end
f2=0;
for i=7:12
s(i)=sqrt((x(15)-a(i-6))^2+(x(16)-b(i-6))^2);
f2=s(i)*x(i)+f2;
end
f=f1+f2;
约束条件为
x0=[3,5,4,7,1,0,0,0,0,0,5,11,5.6348,4.8687,7.2479,7.7499];
fm=inf;
A=[1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0;
0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0];
b=[20;20];
Aeq=zeros(6,16);
for i=1:6
Aeq(i,i)=1;
Aeq(i,i+6)=1;
end
beq=[3,5,4,7,6,11];
vlb=[zeros(12,1);-inf;-inf;-inf;-inf];
求解命令
[x,fval]=fmincon('fun1',x0,A,b,Aeq,beq,vlb,[]);
值得注意的是,求解的结果是在初值给定的条件下计算得来的,我们将x0=x作为初值再次运算,就能得到一组更准确的答案,重复代入后,对比fval的值,选择出最优解