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

📄 smpso_f10.m

📁 改进型pso ,可以在matlab7.0环境下运行,其他版本的还未运行过,不能保证
💻 M
📖 第 1 页 / 共 2 页
字号:
% A SIMPLE IMPLEMENTATION OF THE PARTICLE SWARM OPTIMIZATION
clear;
clc;

for iii=1:1:2
    iii=iii
    % *************************************************************************
    %              单纯形微粒群优化算法求解----smPSO
    % *************************************************************************
    %  初始化
    PopSize=20;     MaxIt=3000;  
    maxw=1.8;       minw=0.02;     c1=2.0;      c2=2.0;      dim=2;

    popul(1,:)=rand(1,PopSize)*(12.1+3.0)-3.0;         %  位置初始化
    popul(2,:)=rand(1,PopSize)*(5.8-4.1)+4.1;          %  位置初始化
    vel=rand(dim,PopSize);                             %  速度初始化
    
    for i=1:PopSize
        fit(i)=21.5+popul(1,i)*sin(4.0*pi*popul(1,i))+popul(2,i)*sin(20.0*pi*popul(2,i));
    end
    ibestpos=popul;                  %  个体最好位置初始化---inCHEpso
    ibestfit=fit;                    %  各个体的适应值
    [bestpart,g]=max(fit);           %  找全局最好的适应值
    gbestfit=bestpart;               %  全局最好的适应值
    gbestpos=popul(:,g);
    gbestchange=gbestfit;
    gbestchangecounter=0;
    
    %  主程序开始运行
    iter=0;
    while (iter<MaxIt),              %  迭代开始
        iter=iter+1;
        w=minw+(maxw-minw)*(1+cos((iter-1)*pi/(MaxIt-1)))/2.0;

        for i=1:PopSize
            A(:,i)=gbestpos;
        end
        R1=rand(dim,PopSize);    R2=rand(dim,PopSize);
        vel=0.8*(w*vel+c1*R1.*(ibestpos-popul)+c2*R2.*(A-popul));           %  速度计算
        popul=popul+vel;                                                    %  位置计算
        clear A;    clear R1;    clear R2;
        
        for i=1:PopSize
            if popul(1,i)>12.1,        
                popul(1,i)=12.1;
            end
            if popul(1,i)<-3.0,
                popul(1,i)=-3.0;
            end
            if popul(2,i)>5.8
                popul(2,i)=5.8;
            end    
            if popul(2,i)<4.1
                popul(2,i)=4.1;
            end
        end
    
        for i=1:PopSize
            fit(i)=21.5+popul(1,i)*sin(4.0*pi*popul(1,i))+popul(2,i)*sin(20.0*pi*popul(2,i));
        end

        for i=1:PopSize
            if fit(i)>ibestfit(i)
                ibestfit(i)=fit(i);
                ibestpos(:,i)=popul(:,i);
            end
        end
        [bestpart,g]=max(fit);
        if bestpart>gbestfit;
            gbestfit=bestpart;
            gbestpos=popul(:,g);
        end
        
        if gbestfit>gbestchange
            gbestchange=gbestfit;
            gbestchangecounter=0;
        else
            gbestchangecounter=gbestchangecounter+1;
        end
        
        if gbestchangecounter>=1
            [OderF,IndexF]=sort(fit);                    %  从小到大排列适应值
            x1=gbestpos;                                 %  选单纯形的顶点
            x2=popul(:,IndexF(ceil(PopSize*3/4)));
            x3=popul(:,IndexF(ceil(PopSize/2)));
            clear OderF;    clear IndexF;
            
            for tempii=1:15                             %  进行5次单纯形法搜索
                fx1=21.5+x1(1)*sin(4.0*pi*x1(1))+x1(2)*sin(20.0*pi*x1(2));
                fx2=21.5+x2(1)*sin(4.0*pi*x2(1))+x2(2)*sin(20.0*pi*x2(2));
                fx3=21.5+x3(1)*sin(4.0*pi*x3(1))+x3(2)*sin(20.0*pi*x3(2));
                fx(1)=fx1;         fx(2)=fx2;         fx(3)=fx3;
                x(:,1)=x1;         x(:,2)=x2;         x(:,3)=x3;
                [OrderF,IndexF]=sort(fx);
                x1=x(:,IndexF(3));  x2=x(:,IndexF(2));  x3=x(:,IndexF(1));  
                fx1=OrderF(3);      fx2=OrderF(2);      fx3=OrderF(1); 
                clear OrderF;    clear IndexF;    clear fx;    clear x;
                
                error=sqrt((x1(1)-x2(1))^2+(x1(2)-x2(2))^2);
                if error<0.000001
                    a1=gbestpos(1,1);    a2=gbestpos(2,1);
                    x2(1)=(rand(1,1)-0.5)*2*15.1/2+a1;             %  位置初始化
                    x2(2)=(rand(1,1)-0.5)*2*1.7/2+a2;              %  位置初始化
                end
                error=sqrt((x1(1)-x3(1))^2+(x1(2)-x3(2))^2);
                if error<0.000001
                    a1=gbestpos(1,1);    a2=gbestpos(2,1);
                    x3(1)=(rand(1,1)-0.5)*2*15.1/2+a1;             %  位置初始化
                    x3(2)=(rand(1,1)-0.5)*2*1.7/2+a2;              %  位置初始化
                end
                error=sqrt((x2(1)-x3(1))^2+(x2(2)-x3(2))^2);
                if error<0.000001
                    a1=gbestpos(1,1);    a2=gbestpos(2,1);
                    x3(1)=(rand(1,1)-0.5)*2*15.1/2+a1;             %  位置初始化
                    x3(2)=(rand(1,1)-0.5)*2*1.7/2+a2;              %  位置初始化
                end
                clear error;
                if x2(1)>12.1,        
                  x2(1)=12.1;
                end
                if x2(1)<-3.0,
                    x2(1)=-3.0;
                end
                if x2(2)>5.8
                    x2(2)=5.8;
                end    
                if x2(2)<4.1
                    x2(2)=4.1;
                end
                if x3(1)>12.1,        
                  x3(1)=12.1;
                end
                if x3(1)<-3.0,
                    x3(1)=-3.0;
                end
                if x3(2)>5.8
                    x3(2)=5.8;
                end    
                if x3(2)<4.1
                    x3(2)=4.1;
                end
                
                fx1=21.5+x1(1)*sin(4.0*pi*x1(1))+x1(2)*sin(20.0*pi*x1(2));
                fx2=21.5+x2(1)*sin(4.0*pi*x2(1))+x2(2)*sin(20.0*pi*x2(2));
                fx3=21.5+x3(1)*sin(4.0*pi*x3(1))+x3(2)*sin(20.0*pi*x3(2));
                fx(1)=fx1;         fx(2)=fx2;         fx(3)=fx3;
                x(:,1)=x1;         x(:,2)=x2;         x(:,3)=x3;
                [OrderF,IndexF]=sort(fx);
                x1=x(:,IndexF(3));  x2=x(:,IndexF(2));  x3=x(:,IndexF(1));  
                fx1=OrderF(3);      fx2=OrderF(2);      fx3=OrderF(1); 
                clear OrderF;    clear IndexF;    clear fx;    clear x;
                
                x4=x1+x2-x3;                     %    反射
                if x4(1)>12.1,        
                  x4(1)=12.1;
                end
                if x4(1)<-3.0,
                    x4(1)=-3.0;
                end
                if x4(2)>5.8
                    x4(2)=5.8;
                end    
                if x4(2)<4.1
                    x4(2)=4.1;
                end
                fx4=21.5+x4(1)*sin(4.0*pi*x4(1))+x4(2)*sin(20.0*pi*x4(2));

                kzxs=1.5;
                if fx4>fx1                       %    扩张操作
                    x5=(x1+x2)/2+kzxs*(x4-(x1+x2)/2);
                    if x5(1)>12.1,        
                        x5(1)=12.1;
                    end
                    if x5(1)<-3.0,
                        x5(1)=-3.0;
                    end
                    if x5(2)>5.8
                        x5(2)=5.8;
                    end    
                    if x5(2)<4.1
                        x5(2)=4.1;
                    end
                    fx5=21.5+x5(1)*sin(4.0*pi*x5(1))+x5(2)*sin(20.0*pi*x5(2));
                    
                    x40=x4;    fx40=fx4;
                    distance0=10;    itertemp=0;
                    while (distance0>0.0001)&(itertemp<5)
                        if  fx5>=fx40                 %    再次扩张 
                            x40=x5;     fx40=fx5;     %    保留最佳
                            x5=(x1+x2)/2+kzxs*(x40-(x1+x2)/2);
                        else
                            x5=x40+0.5*(x5-x40);
                        end
                        if x5(1)>12.1,        
                            x5(1)=12.1;
                        end
                        if x5(1)<-3.0,
                            x5(1)=-3.0;
                        end
                        if x5(2)>5.8
                            x5(2)=5.8;
                        end    
                        if x5(2)<4.1
                            x5(2)=4.1;
                        end
                        fx5=21.5+x5(1)*sin(4.0*pi*x5(1))+x5(2)*sin(20.0*pi*x5(2));
                        itertemp=itertemp+1;
                        distance0=sqrt((x40(1)-x5(1))^2+(x40(2)-x5(2))^2);
                    end
                    x3=x2;    x2=x1;            %    新的单纯形顶点
                    if fx5>=fx40
                        x1=x5;
                    else
                        x1=x40;
                    end
                end
                clear x5;    clear fx5;    clear kzxs;
                
                if fx4<=fx1                      %    不压缩也不扩张
                    if fx4>=fx2
                         x3=x2;     x2=x4;     x1=x1;       %    新的单纯形顶点
                    end
                end
                
                if fx4<fx2                       %    压缩
                    if fx4>=fx3
                        xa=x4;    fxa=fx4;
                    else
                        xa=x3;    fxa=fx3;
                    end
                    x6=(x1+x2)/2+0.7*(xa-(x1+x2)/2);
                    if x6(1)>12.1,        
                        x6(1)=12.1;
                    end
                    if x6(1)<-3.0,
                        x6(1)=-3.0;
                    end
                    if x6(2)>5.8
                        x6(2)=5.8;
                    end    
                    if x6(2)<4.1
                        x6(2)=4.1;
                    end
                    fx6=21.5+x6(1)*sin(4.0*pi*x6(1))+x6(2)*sin(20.0*pi*x6(2));
                    if fx6>=fxa
                           x3=x6;      x2=x2;    x1=x1;       %    压缩
                    else
                        x7=x2+(x1-x2)/2;                      %    收缩
                        x8=x3+(x1-x3)/2;
                        x1=x1;         x2=x7;    x3=x8;
                    end
                end
                clear xa;    clear fxa;    clear x6;    clear fx6;    clear x7;    clear x8;
            end
        %    iter=iter+1;
            gbestchangecounter=2;
            [OderF,IndexF]=sort(fit);                      %  从小到大排列适应值
            popul(:,IndexF(1))=x1;                         %  将单纯形法搜索后的顶点回代给PSO
            popul(:,IndexF(2))=x2;
            popul(:,IndexF(3))=x3;
            clear OderF;    clear IndexF;
            
            fx(1)=21.5+x1(1)*sin(4.0*pi*x1(1))+x1(2)*sin(20.0*pi*x1(2));
            fx(2)=21.5+x2(1)*sin(4.0*pi*x2(1))+x2(2)*sin(20.0*pi*x2(2));
            fx(3)=21.5+x3(1)*sin(4.0*pi*x3(1))+x3(2)*sin(20.0*pi*x3(2));

⌨️ 快捷键说明

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