• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

有效集matlab代码

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
%有效集
function activeset 
H=[2 -1; -1 4]; 
c=[-1 -10]'; 
Ae=[ ]; be=[ ]; 
Ai=[-3 -2; 1 0; 0 1]; 
bi=[-6 0 0]'; 
x0=[0 0]'; 
[x,lambda,exitflag,output]=qpact(H,c,Ae,be,Ai,bi,x0)


function [x,lamk,exitflag,output]=qpact(H,c,Ae,be,Ai,bi,x0) 

% 初始化 
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(tm1<tm) 
                    tm=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

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
扩展delphi线程使之传递参数.发布时间:2022-07-18
下一篇:
ubuntu16.04matlab中文注释乱码的解决办法发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap