现在的位置: 首页 > 综合 > 正文

基本粒子群优化算法是2维变量的求解

2013年10月09日 ⁄ 综合 ⁄ 共 4280字 ⁄ 字号 评论关闭

    %基本粒子群优化算法(Particle Swarm Optimization)-----------
    %名称:基本粒子群优化算法(PSO)
    %作用:求解优化问题
    %说明:是2维变量的求解,程序中做了少量修改,可以准确迭代出结果
    %作者:周楠
    %时间:2009-12-18-2:00
    clear all;
    clc;
    %横坐标长度百分比
    x_rate=0.02;
    %纵坐标长度百分比
    y_rate=0.1;
    %字体显示位置横坐标长度百分比
    x1_show=0.5;
    x2_show=0.5;
    %字体显示位置纵坐标长度百分比
    y1_show=0.2;
    y2_show=0.9;
    %x1的范围[a1 b1];
    a1=-3.0;
    b1=12.1;
    %x2的范围[a2 b2];
    %X2[a2,b2]
    a2=4.1;
    b2=5.8;
    c1=2;             %学习因子1
    c2=2;             %学习因子2
    %惯性权重
    w_0=0.9;
    w_end=0.4;
    MaxDT=30;         %最大迭代次数
    D=2;              %搜索空间维数(未知数个数)
    N=50;             %初始化群体个体数目
    eps=10^(-16);     %设置精度(在已知最小值时候用),即运算精度
    rate=0.2;         %如果步长超出边界,则缩短为原来的rate
    %初始化种群的个体(位置和速度)
    %rand是0-1的均匀分布
    rr=rand(2,N);
    r1=rr(1,:);
    r2=rr(2,:);
    %二维初始位置变量生成
    xx=rand(N,2);
    x1=xx(:,1);
    x2=xx(:,2);
    x1=(b1-a1)*x1+a1;
    x2=(b2-a2)*x2+a2;
    x_x=[x1,x2];
    %速度
    v1=zeros(N,N);
    v2=v1;
    %某次迭代的最优解初始化
    pbest=zeros(MaxDT,N);
    uu=fx1Tox2(x_x(1,:));
    pbest(1,1)=uu(1,1);
    %某次迭代的最优解的位置初始化
    x_pbest=zeros(MaxDT,N,D);
    x_pbest(1,1,:)=x_x(1,:);
     %gbest为全局最优解的初始化
    gbest=pbest(1,1);           
    draw_gbest=pbest(1,1);   %draw_gbest为画出全局最优解的初始化
    %gbest为全局最优解的位置初始化
    x_gbest=zeros(1,D);
    x_gbest(1,:)=x_x(1,:);
    xx_x=zeros(1,D);%局部变量,用来存储临时变量
    %进入主要循环,按照公式依次迭代,直到满足精度要求
    for t=1:MaxDT
       for i=1:N
          for j=1:N
             w(i)=((w_0-w_end)*(MaxDT-i))/(MaxDT)+w_end;
             v1(i,j)=w(i)*v1(i,j)+c1*r1(j)*(x_pbest(t,j)-x_x(i,1))+c2*r2(j)*(x_gbest(1)-x_x(i,1));
             v2(i,j)=w(i)*v2(i,j)+c1*r1(j)*(x_pbest(t,j)-x_x(i,2))+c2*r2(j)*(x_gbest(2)-x_x(j,2));
             x_x(i,1)=x_x(i,1)+v1(i,j);
             x_x(i,2)=x_x(i,2)+v2(i,j);
             %对于步长太长,导致变量越界后的处理
             while (((x_x(i,1))>b1)||((x_x(i,2))>b2)||((x_x(i,1))<a1)||((x_x(i,2))<a2))
                  %方法一:如果步长超出边界,则缩短为原来的rate
%                 x_x(i,1)=x_x(i,1)-v1(i,j);
%                 x_x(i,2)=x_x(i,2)-v2(i,j);
%                 v1(i,j)=v1(i,j)*rate;
%                 v2(i,j)=v2(i,j)*rate;
%                 x_x(i,1)=x_x(i,1)+v1(i,j);
%                 x_x(i,2)=x_x(i,2)+v2(i,j);
                  %方法二:把如果步长超出边界,则取边界附近某 个值
                  if  ((x_x(i,1))>b1)
                     x_x(i,1)=x_x(i,1)-rate;
                  end
                  if  ((x_x(i,2))>b2)
                     x_x(i,2)=x_x(i,2)-rate;
                  end
                  if (( x_x(i,1)<a1))
                     x_x(i,1)=x_x(i,1)+rate;
                  end
                  if (( x_x(i,2)<a2))
                     x_x(i,2)=x_x(i,2)+rate;
                  end
             end
             %保存D个值,保存第t次迭代的第i次局部最优解
             xx_x(:,1)=x_x(i,1);
             xx_x(:,2)=x_x(j,2);
             if (fx1Tox2(xx_x)>pbest(t,i))
                pbest(t,i)=fx1Tox2(xx_x);
                x_pbest(t,i,:)=xx_x;
             end
          end
          %保存全局最优解
          if (pbest(t,i)>gbest)
             gbest=pbest(t,i);
             x_gbest=x_pbest(t,i,:);
          end
       end
    end
    %draw_gbest为画出全局最优解
    draw_gbest=max(pbest');
    mindle=draw_gbest(1);
    for t=1:MaxDT
        if (draw_gbest(t)>mindle)
            mindle=draw_gbest(t);
        else
            draw_gbest(t)=mindle;
        end
    end
    %最后给出计算结果
    disp('函数的全局最优位置为:')
    Solution=x_gbest
    disp('最后得到的优化极值为:')
    Result=gbest
    figure
    x=(1:MaxDT)';
    plot(x,pbest,'b:');
    title('粒子群优化算法')
    xlabel('迭代次数')
    ylabel('优化极值')
    aa=min(min(pbest));
    bb=max(gbest);
    string_cell{1}='/fontsize{10}/fontname{arial}绿实线:到目前为止遇到的最好的解';
    text((MaxDT+MaxDT*x_rate)*x1_show,((aa+aa*y_rate)+((bb+bb*y_rate)-(aa+aa*y_rate))*y1_show),string_cell,'color','m')
    string_cell{1}='/fontsize{10}/fontname{arial}红虚线:当前代中最好的个体';
    text((MaxDT+MaxDT*x_rate)*x1_show,((aa+aa*y_rate)+((bb+bb*y_rate)-(aa+aa*y_rate))*y1_show*y1_show),string_cell,'color','m')
    cell_string{4}=['/fontsize{15}/rm全局最优位置为= ' num2str(x_gbest,6)];
    cell_string{5}='/fontsize{15}';
    cell_string{6}=['/fontsize{15}/rm全局优化极值= ' num2str(gbest,6)];
    cell_string{7}='/fontsize{15}';
    cell_string{8}=['/fontsize{15}/rm迭代次数= ' num2str(MaxDT,6)];                                        
    text((MaxDT+MaxDT*x_rate)*x2_show,((aa+aa*y_rate)+((bb+bb*y_rate)-(aa+aa*y_rate))*y2_show),cell_string,'color','b','HorizontalAlignment','center')
    hold on
    plot(x,draw_gbest,'r-')
    axis([0,fix(MaxDT+MaxDT*x_rate),fix(aa+aa*y_rate),fix(bb+bb*y_rate)])
    hold off
    grid on
   
   
   
   
   
      

 

 

 

抱歉!评论已关闭.