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

📄 pso23.asv

📁 求解离散问题的pso aco 算法
💻 ASV
字号:

% PSO for the feature eselection in KNN
function [gbest,gbest_rmse]=pso23(feature,wmax,wmin,vmax,c1,c2,ps,tmax)
pso=zeros(ps,15);
v1=zeros(ps,15);
rmse=zeros(15,10);
pso_rmse=zeros(20,10);%%同上,每个粒子都有以上十项指标
pbest=zeros(20,15);
pbest_rmse=zeros(20,10);%%同上,每个粒子都有以上十项指标
gbest=zeros(1,15);
gbest_rmse=zeros(1,10);%%同上,每个粒子都有以上十项指标
for i=1:ps
        pbest_rmse(i,1)=100;
        pbest_rmse(i,10)=0;
        gbest_rmse(1,1)=100;
        gbest_rmse(1,10)=0;
end

for i=1:ps
    pso_rmse(i,1)=100;
    pso_rmse(i,2)=i;
    pso_rmse(i,10)=0;
end

%for i=1:6
%    pso_rmse1(i)=0;
%end
% inialize the particle
for i=1:ps
        pso(i,:)=0;
         w(i)=floor(round(rand*15+0.5));
         for j=1:w(i)
             z=floor(round(rand*15+0.5));
             while(pso(i,z)~=0)
                 z=floor(round(rand*15+0.5));
                 if(pso(i,z)==0)
                     pso(i,z)=1;
                     break;
                 end
             end
             if(pso(i,z)==0)
                 pso(i,z)=1;
             end
         end
end

[n,p]=size(feature); % data set
n1=floor(n/2); % two-fold
n2=n-n1;
for i=1:ps
    for hh=1:10
        pso_rmse(i,hh)=0;%%运算前每个粒子的指标归零,重新计算
    end
    pso1=[];
    for l=1:15
        pso1(l)=pso(i,l);
    end
    cmodel=ones(2,2);
    [pso_rmse1]=checkout(feature,pso1,cmodel); % 校验数据
    pso_rmse(i,1)=pso_rmse1(1);
    pso_rmse(i,3)=pso_rmse1(3);
    pso_rmse(i,4)=pso_rmse1(4);
    pso_rmse(i,5)=pso_rmse1(5);
    pso_rmse(i,6)=pso_rmse1(6);
    pso_rmse(i,2)=i;%%粒子标识
    pso_rmse(i,7)=pso_rmse1(7);;%% 第一类分类正确率
    pso_rmse(i,8)=pso_rmse(i,6)/(pso_rmse(i,5)+pso_rmse(i,6));%% 第二类分类正确率
    pso_rmse(i,9)=(pso_rmse(i,7)+pso_rmse(i,8))/2;%%分类正确率平均值
    pso_rmse(i,10)=(pso_rmse(i,6)+pso_rmse(i,3))/(pso_rmse(i,3)+pso_rmse(i,4)+pso_rmse(i,5)+pso_rmse(i,6)); 
    %%分类总正确率
    if pso_rmse(i,1)<=pbest_rmse(i,1) & pso_rmse(i,10)>=pbest_rmse(i,10)%%如果粒子当前结果优于自身最优位置
        for h=1:10
            pbest_rmse(i,h)=pso_rmse(i,h);%% 自身最优位置的指标修改为当前的指标
        end
        for j=1:15
            pbest(i,j)=pso(i,j);%% 自身最优位置修改为当前位置
        end
     end
     if pso_rmse(i,1)<=gbest_rmse(1,1) & pso_rmse(i,10)>=gbest_rmse(1,10)%% 如果粒子当前结果优于整体最优位置
         for h=1:10
             gbest_rmse(1,h)=pso_rmse(i,h);%% 整体最优位置的指标修改为当前的指标
         end
        for j=1:15
            gbest(1,j)=pso(i,j);%%整体最优位置修改为当前位置
        end
     end
end

rmse=pso_rmse;%%由于20组粒子的初始位置是随机得到,所以ACO中的20组初始指标直接使用该20组粒子的指标
rand20=pso;%%由于20组粒子的初始位置是随机得到,所以ACO中的20组初始位置值直接使用该20组粒子的初始位置

for iteration=1:tmax%%迭代50次
    pso_rmse=zeros(ps,10);%%每迭代一次粒子的指标归零
    for i=1:ps%%下面的算法与初始值时的二折算法一样,故不作标注
        for hh=1:10
            pso_rmse(i,hh)=0;
        end
        pso1=[];
        for l=1:15
            pso1(l)=pso(i,l);
        end
        cmodel=ones(2,2);
        pso_rmse1=checkout(feature,pso1,cmodel); %数据校验
        pso_rmse(i,1)=pso_rmse1(1);
        pso_rmse(i,3)=pso_rmse1(3);
        pso_rmse(i,4)=pso_rmse1(4);
        pso_rmse(i,5)=pso_rmse1(5);
        pso_rmse(i,6)=pso_rmse1(6);
        pso_rmse(i,1)=sqrt(pso_rmse(i,1)/n);%%计算离差
        pso_rmse(i,2)=i;%%粒子标识
        pso_rmse(i,7)=pso_rmse(i,3)/(pso_rmse(i,3)+pso_rmse(i,4));%% 第一类分类正确率
        pso_rmse(i,8)=pso_rmse(i,6)/(pso_rmse(i,5)+pso_rmse(i,6));%% 第二类分类正确率
        pso_rmse(i,9)=(pso_rmse(i,7)+pso_rmse(i,8))/2;%%分类正确率平均值
        pso_rmse(i,10)=(pso_rmse(i,6)+pso_rmse(i,3))/(pso_rmse(i,3)+pso_rmse(i,4)+pso_rmse(i,5)+pso_rmse(i,6)); 
        if pso_rmse(i,1)<=pbest_rmse(i,1) & pso_rmse(i,10)>=pbest_rmse(i,10)
            for h=1:10
                pbest_rmse(i,h)=pso_rmse(i,h);
            end
            for j=1:15
                pbest(i,j)=pso(i,j);
            end
        end
        if pso_rmse(i,1)<=gbest_rmse(1,1) & pso_rmse(i,10)>=gbest_rmse(1,10)
            for h=1:10
                gbest_rmse(1,h)=pso_rmse(i,h);
            end
            for j=1:15
                gbest(1,j)=pso(i,j);
            end
        end
    end
    
    for i=1:ps%%对于每个粒子进行粒子群算法的迭代
        w=wmax-(wmax-wmin)/tmax*iteration;%%懒惰因子的计算
        %c1=2;%%学习因子计算
        %c2=2;%%学习因子计算
        for j=1:15
            v1(i,j)=v1(i,j)*w+c1*rand*(pso(i,j)-pbest(i,j))+c2*rand*(pso(i,j)-gbest(1,j));%%速度计算
            if v1(i,j)>vmax
                v1(i,j)=4.5;
            end
            if v1(i,j)<-vmax
                v1(i,j)=-4.5;
            end
            sv=1/(1+exp(-v1(i,j)));
            if rand<sv
                pso(i,j)=1;
            else
                pso(i,j)=0;
            end
        end
    end
end
    

disp('PSO运行结果为:'+gbest_rmse(1,:));
disp(gbest(1,:));

disp('程序结束');

⌨️ 快捷键说明

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