⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sy3.m

📁 matlab程序
💻 M
字号:
%结果为minf=--74.7613,x1=4.1572,x2=8.9101.
n=2;e1=0.001;e2=0.001;A=1.3;k=n+1;% 数据初始化
x=zeros(k,2);
f=zeros(1,k);
ftemp=zeros(1,k);
xmean=zeros(k,2);
xx=zeros(k,2);
xmeanbad=zeros(1,2);%剔除坏点的平均值
xtemp=zeros(1,2);
a=[1,1];b=[9,9];% 设计变量上下限
r=rand(k,2);% 产生随机数
% 形成k个顶点
for i=1:k
    for j=1:n
        x(i,j)=a(j)+r(i,j)*(b(j)-a(j));
    end
    if i==1; % 判断第1个顶点  
       while(x(1,1)<0 | x(1,2)<0 | 10*(x(1,1)+x(1,2))-x(1,1)*x(1,1)-x(1,2)*x(1,2)-34<0 | x(1,1)*x(1,1)+x(1,2)*x(1,2)-25<0) 
           % 第1个顶点不是可行点,从新生成
              r(1,:)=rand(2);
              x(i,1)=a(1)+r(i,1)*(b(1)-a(1));
              x(i,2)=a(2)+r(i,2)*(b(2)-a(2));
       end
    end   
end
% 形成复合形 
s=1;
 while  s ~=k
     for i=1:s
         xx(i,:)=x(i,:);
     end    
    xmean(s,:)=mean(xx);
   while (x(s+1,1)<0 | x(s+1,2)<0 | 10*(x(s+1,1)+x(s+1,2))-x(s+1,1)*x(s+1,1)-x(s+1,2)*x(s+1,2)-34<0 | x(s+1,1)*x(s+1,1)+x(s+1,2)*x(s+1,2)-25<0) 
           % 第s+1个顶点不是可行点,从新生成
           x(s+1,1)=xmean(s,1)+0.5*(x(s+1,1)-xmean(s,1));
           x(s+1,2)=xmean(s,2)+0.5*(x(s+1,2)-xmean(s,2));
   end
     s=s+1;
 end
 for i=1:k
    f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
 end
   fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
   e=0; %停机判断值
for i=1:k
    e=(fmean-f(i))*(fmean-f(i))+e;
end
   e=sqrt(e/k);
%------------------------------------------------------------------------------------------------------------------- 
 while  e> e1    %停机判断
           % 寻找映像点
              Max=f(1);
              Min=f(1);
              bad=1;
              good=1;
              for i=1:k
              % 寻找坏点
               if Max<f(i)
                  Max=f(i);
                  bad=i;
               end
              % 寻找好点
                if Min>f(i)
                   Min=f(i);
                   good=i;
                 end   
              end 
            xx=x;
            xx(bad,:)=0;%剔除坏点
            xmeanbad(1,1)=sum(xx(:,1))/(k-1);
            xmeanbad(1,2)=sum(xx(:,2))/(k-1);
        if  (xmeanbad(1,1)<0 | xmeanbad(1,2)<0 | 10*(xmeanbad(1,1)+xmeanbad(1,2))-xmeanbad(1,1)*xmeanbad(1,1)-xmeanbad(1,2)*xmeanbad(1,2)-34<0 | xmeanbad(1,1)*xmeanbad(1,1)+xmeanbad(1,2)*xmeanbad(1,2)-25<0) 
              %xmeanbad不在可行域
              a=x(good,:);
              b=xmeanbad;
        %-------------------------------------------------------------------------------------------------------------------
              % 产生随机数
              r=rand(k,2);
              % 形成k个顶点
             for i=1:k
                 for j=1:n
                     x(i,j)=a(j)+r(i,j)*(b(j)-a(j));
                 end
               % 判断第1个顶点  
                 if i==1;
                    while(x(1,1)<0 | x(1,2)<0 | 10*(x(1,1)+x(1,2))-x(1,1)*x(1,1)-x(1,2)*x(1,2)-34<0 | x(1,1)*x(1,1)+x(1,2)*x(1,2)-25<0) 
                        % 第1个顶点不是可行点,从新生成
                           r(1,:)=rand(2);
                           x(i,1)=a(1)+r(i,1)*(b(1)-a(1));
                           x(i,2)=a(2)+r(i,2)*(b(2)-a(2));
                    end
                 end   
             end
             % 形成复合形 
             s=1;
              while  s~=k
                  for i=1:s
                      xx(i,:)=x(i,:);
                  end    
                 xmean(s,:)=mean(xx);
                while (x(s+1,1)<0 | x(s+1,2)<0 | 10*(x(s+1,1)+x(s+1,2))-x(s+1,1)*x(s+1,1)-x(s+1,2)*x(s+1,2)-34<0 | x(s+1,1)*x(s+1,1)+x(s+1,2)*x(s+1,2)-25<0) 
                        % 第s+1个顶点不是可行点,从新生成
                        x(s+1,1)=xmean(s,1)+0.5*(x(s+1,1)-xmean(s,1));
                        x(s+1,2)=xmean(s,2)+0.5*(x(s+1,2)-xmean(s,2));
                end
                  s=s+1;
              end
              for i=1:k
                 f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
              end
              fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
              e=0; %停机判断值
             for i=1:k
              e=(fmean-f(i))*(fmean-f(i))+e;
             end
             e=sqrt(e/k);
      %-------------------------------------------------------------------------------------------------------------------
        else
            %-------------------------------------------------------------------------------------------------------------------
              A=1.3;
            xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
              while(xtemp(1,1)<0 | xtemp(1,2)<0 | 10*(xtemp(1,1)+xtemp(1,2))-xtemp(1,1)*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-34<0 | xtemp(1,1)*xtemp(1,1)+xtemp(1,2)*xtemp(1,2)-25<0) 
                     A=A/2;
                     xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
              end
                 fa=4*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-12;
              if fa<Max
                  x(bad,:)=xtemp;
                  Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
                  xmean(s,:)=mean(x);
                  for i=1:k
                     f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
                  end
                  fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
                  e=0; %停机判断值
                  for i=1:k
                     e=(fmean-f(i))*(fmean-f(i))+e;
                  end
                  e=sqrt(e/k);
                  e
              else 
                   %-------------------------------------------------------------------------------------------------------------------
                   while A<=e2
                       secondMax=f(good);
                       second=good; 
                       for i=1:k
                            f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
                       end
                        for i=1:k
                             % 寻找坏点
                              if Max<f(i)
                                 Max=f(i);
                                 bad=i;
                              end
                             % 寻找好点
                              if Min>f(i)
                                  Min=f(i);
                                  good=i;
                                end   
                             end 
                        for i=1:k
                              f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
                          end
                      for i=1:k
                          if  (f(i)<Max & f(i)>Min)
                               secondMax=f(i);
                               second=i;
                          end
                      end 
                      secondMax
                      x(bad,:)=x(second,:);
                      Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
                      xx=x;
                      xx(bad,:)=0;%剔除坏点
                      xmeanbad(1,1)=sum(xx(:,1))/(k-1);
                      xmeanbad(1,2)=sum(xx(:,2))/(k-1);
                      xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
                      while(xtemp(1,1)<0 | xtemp(1,2)<0 | 10*(xtemp(1,1)+xtemp(1,2))-xtemp(1,1)*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-34<0 | xtemp(1,1)*xtemp(1,1)+xtemp(1,2)*xtemp(1,2)-25<0) 
                             A=A/2;
                             xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
                      end 
                               fa=4*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-12;
                               fa
                               Max
                            if fa<Max
                                x(bad,:)=xtemp;
                                Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
                                xmean(s,:)=mean(x);
                                for i=1:k
                                   f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
                                end
                                fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
                                e=0; %停机判断值
                                for i=1:k
                                   e=(fmean-f(i))*(fmean-f(i))+e;
                                end
                                e=sprt(e/k);
                                e
                                break%跳出
                            end
                   end
                     %-------------------------------------------------------------------------------------------------------------------
                   while A>e2
                       A
                        A=A/2;
                        xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
                        while(xtemp(1,1)<0 | xtemp(1,2)<0 | 10*(xtemp(1,1)+xtemp(1,2))-xtemp(1,1)*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-34<0 | xtemp(1,1)*xtemp(1,1)+xtemp(1,2)*xtemp(1,2)-25<0) 
                                A=A/2;
                                 xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
                        end
                            fa=4*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-12;
                            fa
                            Max
                            if fa<Max
                                x(bad,:)=xtemp;
                                Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
                                xmean(s,:)=mean(x);
                                for i=1:k
                                   f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
                                end
                                fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
                                e=0; %停机判断值
                                for i=1:k
                                   e=(fmean-f(i))*(fmean-f(i))+e;
                                end
                                e=sprt(e/k);
                                e
                                break%跳出
                            elseif   A<=e2
                                    %-------------------------------------------------------------------------------------------------------------------
                                  while A<=e2
                                      A
                                      secondMax=f(good);
                                      second=good;
                                       for i=1:k
                                           f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
                                       end
                                      for i=1:k
                                          % 寻找坏点
                                           if Max<f(i)
                                              Max=f(i);
                                              bad=i;
                                           end
                                          % 寻找好点
                                            if Min>f(i)
                                               Min=f(i);
                                               good=i;
                                             end   
                                      end 
                                      for i=1:k
                                        if ( f(i)<Max & f(i)>Min )
                                             secondMax=f(i);
                                             second=i;
                                        end
                                      end
                                     f
                                     second
                                     secondMax
                                     x(bad,:)=x(second,:);
                                     Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
                                     xx=x;
                                     xx(bad,:)=0;%剔除坏点
                                     xmeanbad(1,1)=sum(xx(:,1))/(k-1);
                                     xmeanbad(1,2)=sum(xx(:,2))/(k-1);
                                     xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
                                     while(xtemp(1,1)<0 | xtemp(1,2)<0 | 10*(xtemp(1,1)+xtemp(1,2))-xtemp(1,1)*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-34<0 | xtemp(1,1)*xtemp(1,1)+xtemp(1,2)*xtemp(1,2)-25<0) 
                                            A=A/2;
                                            xtemp= xmeanbad+A*(xmeanbad-x(bad,:));
                                     end 
                                              fa=4*xtemp(1,1)-xtemp(1,2)*xtemp(1,2)-12;
                                              fa
                                              Max
                                           if fa<Max
                                               x(bad,:)=xtemp;
                                               Max=4*x(bad,1)-x(bad,2)*x(bad,2)-12;
                                               xmean(s,:)=mean(x);
                                               for i=1:k
                                                  f(i)=4*x(i,1)-x(i,2)*x(i,2)-12;
                                               end
                                               fmean=4*xmean(s,1)-xmean(s,2)*xmean(s,2)-12;
                                               e=0; %停机判断值
                                               for i=1:k
                                                  e=(fmean-f(i))*(fmean-f(i))+e;
                                               end
                                              e=sqrt(e/k);
                                              e
                                              flag=1;
                                               break%第一级跳出
                                           end
                                  end
                                  %-------------------------------------------------------------------------------------------------------------------
                            end    
                            if flag==1
                                break%第二级跳出
                            end    
                   end
              end 
            %-------------------------------------------------------------------------------------------------------------------  
        end
        flag=0;
 end  
 %-------------------------------------------------------------------------------------------------------------------
xmean(s,:)
fmean

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -