二次规划.docx
《二次规划.docx》由会员分享,可在线阅读,更多相关《二次规划.docx(10页珍藏版)》请在冰豆网上搜索。
二次规划
2013-2014
(1)专业课程实践论文
题目:
二次规划
一、算法理论
二次规划是非线性优化中的一种特殊情形,它的目标函数是二次实函数,约束函数都是线性函数。
由于二次规划比较简单,便于求解(仅次于线性规划),并且一些非线性优化问题可以转化为求解一系列的二次规划问题,因此二次规划的求解方法较早引起人们的重视,成为求解非线性优化的一个重要途径。
二次规划的算法较多,本论文仅介绍求解一般约束凸二次规划的有效集方法。
考虑一般二次规划
有效集方法的最大难点是事先一般不知道有效集
,因此只有想办法构造一个集合序列去逼近它。
即从初始点
出发,计算有效集
,解对应的等式约束子问题。
重复这一做法,得到有效集序列
,
,使之
,以获得原问题的最优解。
我们分六步来介绍有效集方法的算法原理和实施步骤。
第一步选定初始值。
给定初始可行点
,令
。
第二步求解子问题。
确定相应的有效集
,求解子问
得到极小点
和拉格朗日乘子向量
。
若
转入步三;否则转步二。
第三步检验终止准则。
计算拉格朗日乘子
其中
,令
。
若
,则
是全局极小点,停算。
否则若
,则令
,转步一。
第四步确定步长
。
令
,其中
,其中
。
令
。
第五步若
,则令
,否则,若
,则令
,其中
满足
。
第六步令
,转步一。
二、算法框图
三、算法程序
function[x,lamk,exitflag,output]=qpact(H,c,Ae,be,Ai,bi,x0)
%功能:
用有效集方法解一般约束二次规划问题:
%minf(x)=0.5*x’*H*x+c’*x,
%s.t.a’˙i*x-b˙i=0,(i=1,...,l),
%a’˙i*x-b˙i?
=0,(i=l+1,...,m)
%输入:
x0是初始点,H,c分别是目标函数二次型矩阵和向量;
%Ae=(a˙1,...,a˙l)’,be=(b˙1,...,b˙l)’;
%Ai=(a˙–l+1?
...,a˙m),bi=(b˙–l+1?
...,b˙m)’.
%输出:
x是最优解,lambda是对应的乘子向量;output是结构变量,
%输出极小值f(x),迭代次数k等信息,exitflag是算法终止类型
%%%%%%%%%%%%%%%%%主程序开始%%%%%%%%%%%%%%%%%
%初始化
epsilon=1.0e-9;err=1.0e-6;
k=0;x=x0;n=length(x);kmax=1.0e3;
ne=length(be);ni=length(bi);lamk=zeros(ne+ni,1);
index=ones(ni,1);
for(i=1:
ni)
if(Ai(i,:
)*x>bi(i)+epsilon),index(i)=0;end
end%算法主程序
while(k<=kmax)%求解子问题
Aee=[];
if(ne>0),Aee=Ae;end
for(j=1:
ni)
if(index(j)>0),Aee=[Aee;Ai(j,:
)];end
end
gk=H*x+c;
[m1,n1]=size(Aee);
[dk,lamk]=qsubp(H,gk,Aee,zeros(m1,1));
if(norm(dk)<=err)
y=0.0;
if(length(lamk)>ne)
[y,jk]=min(lamk(ne+1:
length(lamk)));
end
if(y>=0)
exitflag=0;
else
exitflag=1;
for(i=1:
ni)
if(index(i)&(ne+sum(index(1:
i)))==jk)
index(i)=0;break;
end
end
end
k=k+1;
else
exitflag=1;
%求步长
alpha=1.0;tm=1.0;
for(i=1:
ni)
if((index(i)==0)&(Ai(i,:
)*dk<0))
tm1=(bi(i)-Ai(i,:
)*x)/(Ai(i,:
)*dk);
if(tm1tm=tm1;ti=i;
end
end
end
alpha=min(alpha,tm);
x=x+alpha*dk;%修正有效集
if(tm<1),index(ti)=1;end
end
if(exitflag==0),break;end
k=k+1;
end
output.fval=0.5*x'*H*x+c'*x;
output.iter=k;%%%%%%%%求解子问题%%%%%%%%%%%%%%%
function[x,lambda]=qsubp(H,c,Ae,be)
ginvH=pinv(H);
[m,n]=size(Ae);
if(m>0)
rb=Ae*ginvH*c+be;
lambda=pinv(Ae*ginvH*Ae')*rb;
x=ginvH*(Ae'*lambda-c);
else
x=-ginvH*c;
lambda=0;
end
四、算法实现
例1.求解二次规划问题
。
解:
在Matlab命令窗口输入下列命令和计算结果为
例2.求解二次规划问题
。
解:
在Matlab命令窗口输入下列命令和计算结果为
例3.求解二次规划问题
。
解:
在Matlab命令窗口输入下列命令和计算结果为
例4.求解二次规划问题
。
解:
在Matlab命令窗口输入下列命令和计算结果为