最优化中单纯形法的matlab举例

        最优化中的单纯形有两个解释,一种是解线性规划的数值求解方法,还有一种就是本文讨论的的单纯形,优化多维无约束问题的一种数值方法,课本上将它归为非线性最优化的一种方法。具体参见百度百科。

两种单纯形都用到了单纯形的概念,它是N维中的N + 1个顶点的凸包:直线上的一个线段,平面上的一个三角形,三维空间上的四面体。本文的所要讨论的单纯形主要思想是:在已有单纯形的基础上,建立起新的单纯形,判断是否是最优解,如果不是则继续建立新的单纯形,搜索下一个点。就拿二维空间中的

f()

问题举例,二维平面上的3个不在一条直线的点组成一个凸包:

起始的构成单纯形的凸包是x1,x2,x3,三个点,不妨设f(x1)>=f(x2)>=f(x3),接着我们可以认为在x1 关于x2,x3的对称面找到一个比f(x1)更小的点,将这个点设为x4,计算x4的值,根据x4的值分为以下几种处理情况:

1、f(x4) < f(x3),猜想x1->x4方向延伸可能还有更小的点,定义为一个固定步长搜索到x6(图上未标出),比较x4和x6的函数值大小,如果f(x4) <= f(x6),则令x4, x2, x3构成新的单纯形,否则是x6, x2, x3构成新的单纯形

2、f(x4) >= f(x3) 分为下面几种情况:

     (1)f(x4) < f(x2), 令x4, x2, x3构成新的单纯形;

     (2)f(x4)  >=  f(x2) :

              (a)    f(x4) <  f(x1) ,令x4, x2, x3构成新的单纯形;

              (b)    f(x4) >=  f(x1),可能x4的搜索步长太大,定义一个缩小步长,找到x5点,比较f(x5)点的值,如果有f(x5) < f(x2),

                      令x5, x2, x3构成新的单纯形;否则以x1为中心收缩单纯形,令x1' ,  x2' , x3构成新的单纯形。

3、通过不断构建单纯形逼近最优解。

具体matlab实现代码:

clear all;
n=2;
x=zeros(n+1,n);
for ijk=1:n+1
  x(ijk,:)=randsample(10,n);
end
T=[];%记录每步的计算结果
T=[T;x(1,:),x(2,:),x(3,:)] ;
%画图
hold on;
plot(x(:,1),x(:,2));
line(x([1,3],1),x([1,3],2));
a=1;
b=0.5;
c=2;
d=0;%记录循环次数
while 1
    temp=[];
    for ijk=1:n+1
        temp=[temp,equ2(x(ijk,:))];
    end
    [ilval,il]=min(temp);
    [ihval,ih]=max(temp);
    % 确定第二大的数
    temp2=temp;
    temp2(ih)=-1;
    [~,ih2]=max(temp2);
    xmid=(1/n)*(sum(x,1)-x(ih,:));
    xn=xmid+a*(xmid-x(ih,:));
    fx=equ2(xn);
    if fx>=equ2(x(il,:))
        if fx>=equ2(x(ih2,:))
            if fx >= equ2(x(ih,:))
                x(ih,:)=xn;
                xc=xmid+b*(x(ih,:)-xmid);              
                % 确定第二大的数
                temp3=[];
                for ijk=1:n+1
                    temp3=[temp3,equ2(x(ijk,:))];
                end
                [ihval,ih]=max(temp3);
                temp3(ih)=-1;
                [~,ih22]=max(temp3);
                if equ2(xc)<equ2(x(ih22,:))
                    x(ih,:)=xc;
                else
                    for ik=1:n+1
                        x(ik,:)=0.5*(x(ik,:)+x(il));
                    end
                end
            else 
                x(ih,:)=xn;
            end                
        else
            x(ih,:)=xn;
        end   
    else
        if fx<=equ2(xmid+c*(xn-xmid))
            x(ih,:)=xn;
        else
            x(ih,:)=xmid+c*(xn-xmid);
        end  
    end
   if (ftest1(x,il)<=1e-6)&&(ftest2(x,il)<=1e-6) %终止判定条件
          break;
   end
    T=[T;x(1,:),x(2,:),x(3,:)];
    %画图
    hold on;
    plot(x(:,1),x(:,2));
    line(x([1,3],1),x([1,3],2));   
    d=d+1; 
end

function f = equ2(x)
t1=x(1);
t2=x(2);
f=t1^2+t2^2;
end

function t=ftest1(x,il)
 k=size(x,1);
 ts=0;
 for i=1:k
     ts=ts+(equ2(x(i,:))-equ2(x(il,:)))^2;
 end
 t=sqrt((1/(k-1))*ts);
end

function t=ftest2(x,il)
 k=size(x,1);
 ts=0;
 for i=1:k
     ts=ts+sum(((x(i,:))-x(il,:).^2));
 end
 t=(1/k)*ts;
end

运行结果:



猜你喜欢

转载自blog.csdn.net/github_19765307/article/details/39085051
今日推荐