| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 4118 人关注过本帖
标题:复合形法求最优化问题
只看楼主 加入收藏
gumengyin
Rank: 1
等 级:新手上路
帖 子:21
专家分:7
注 册:2014-3-19
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:1 
复合形法求最优化问题
两个函数
1.function[x1,fx]=gen_complex(x0,k,f,g_cons)
N=length(x0);
M=size(g_cons);
M=length(M(:,1));
x1(:,1)=x0;
fx(1)=fevel(f,x0);
a=1.3;
s=rand(N,k)*2-ones(N,k);
s=s/norm(s);
k2=1;
while k2<k
    x0=x1(:,1)+a*s(:,k2);
    gx=fevel(g_cons,x0);
    if max(gx)<0
        k2=k2+1;
        x1(:,k2)=x0;
        fx(k2)=fevel(f,x0);
    else
        a=0.7*a;
    end
end
   
第二个:function [xo,fo,go]=opt_complex(f,g_cons,x0,x1,xu,to1x,to1fun,maxiter)
N=length(x0);
M=size(g_cons);
k1=0;
k=N+1;%单纯性顶点个数
gx=ones(M,1);
while max(gx)>0
    x0=x1+rand(N,1).*xu;
    gx=feval(g_cons,x0);
end
[x1,fx]=gen_complex(x0,k,f,g_cons);
flag1=1;flag2=1;flag3=1;
k1=0
fx;
x1;
fprintf('此处暂停,请按下任意键继续\n')
pause
while k1<maxiter
    flag1=1;flag2=1;flag3=1;
    k1=k1+1
    [fx,I]=sort(fx);
    for i=1:k
        x2(:,1)=x1(:,I(i));
    end
    x1=x2;
    fmax1=fx(k);
    imax1=I(k);
    fmin=fx(1);
    imin=I(1);
    fmax2=fx(k-1);
    imax2=I(k-1);
    %计算形心
    xc=zeros(N,1);
    for i=1:k
        xc=xc+x1(:,i);
    end
    xc=xc-x1(:,imax1);
    xc=xc/(k-1);
    gxc=feval(g_cons,xc);
    alpha=1.31;
    %反射
    xr=xc+alpha*(xc-x1(:,imax1));
    gxr=feval(g_cons,xr)
    if max(gxr)<0
        fxr=feval(f,xr);
        if fxr<fmax1
            fprintf('反射成功\n')
            fmax1,fxr
            fmax1=fxr;
            fx(imax1)=fxr;
            x1(:,imaxl)=xr;
            flag1=-1;
        else
            %反射失败
            flag1=1;
        end
    else
        %反射失败
        flag1=1;
    end
    gama=0.7;
    if flag1==-1
        fprintf('延伸\n')
        xe=xr+gama*(xr-xc);
        gxe=feval(g_cons,xe)
        if max(gxe)<0
            fxe=feval(f,xe);
            if fxe<fmax1
                fprintf('延伸成功\n')
                fxe,fmax1
                fx(imax1)=fxe;
                fmax1=fxe;
                x1(:,imax1)=xe;
                flag2=-1;
            else
                %延伸失败
                flag2=1;
            end
        else
            %延伸失败
            flag2=1;
        end
    end
    beta=0.7;
    if flag1~=-1&flag2~=-1
        fprintf('收缩\n')
        xk=x1(:,imax1)+beta*(xc-x1(:,imax1));
        gxk=feval(g_cons,xk)
        if max(gxk)<0
            fxk=feval(f,xk);
            if fxk<fmax1
                fprint('收缩成功\n')
                fxk,fmax1
                fmax1=fxk;
                fx(imax1)=fxk;
                x1(:,imax1)=xk;
                flag3=-1;
            else
                %收缩失败
                flag3=1;
            end
        else
            %收缩失败
            flag3=1;
        end
    end
        if flag1~=-1&flag2~=-1&flag3~=-1
            fprintf('flag1,flag2,flag3\n%d%d%d\n',flag1,flag2,flag3)
            fprintf('重新生成单纯性\n')
            [fx,I]=sort(fx);
            imin=I(1);
            x0=x1(:,imin);
            [x1,fx]=gen_complex(x0,k,f,g_cons)
        end
    end
    xo=x1(:,imin);
fo=feval(f,xo);
go=feval(g_cons,xo);
k1

用户程序是:f=inline('(x(1)-5)^2+4*(x(2)-6)^2','x');
tolx=1e-6;
tolfun=1e-6;
x0=[8,14]';
x1=[2 2]';
xu=[7 9]';
maxiter=65;
option=optimset('largescale','off');
[xo,fxo,g]=opt_complex(f,@fun_cons,x0,x1,xu,tolx,tolfun,maxiter)
[xo,fo]=fmincon(f,x0,[],[],[],[],x1,xu,@fun_cons,options)
function[c ceq]=fun_cons(x)
c=[64-x(1)^2-x(2)^2
    -x(1)+x(2)-10
    x(1)-10];
ceq=[];

各位大神帮我看看哪里出现了问题
搜索更多相关主题的帖子: function 
2014-04-23 22:40
鸥翔鱼游
Rank: 5Rank: 5
等 级:职业侠客
帖 子:182
专家分:323
注 册:2014-4-19
收藏
得分:20 
且学且珍惜,得认学习真正消化
2014-04-25 14:18
快速回复:复合形法求最优化问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049529 second(s), 7 queries.
Copyright©2004-2020, BCCN.NET, All Rights Reserved