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

📄 aco.asv

📁 求解离散问题的pso aco 算法
💻 ASV
字号:
% CAO for the feature eselection in KNN
function [ant_best1,ant_rmse_oca1]=aco(x,feature,as,q,rmax,r1,ta,tb,tmax,nn)
%as=15; % ants
%tmax=50; %iterations
%q=0.5; % an evaporation parameter
%rmax=20; % r solutions
%r1=5; % best solutions
%ta=0.25; %
%tb=0.95; 
d=0;

[n2,p2]=size(feature);
rmse=zeros(p2,10);%%二折交叉检验,标识参考PSO2
            ant1=[];
n1=floor(n2/2);
ant_best=zeros(p2,p2);
ant=zeros(p2,p2);
ant_rmse_oca2=[];
ant_best2=[];
n=[];
t=[];
p=[];
p1=[];
aco1=[];
for q=1:15
    ant(q,q)=1;
end
ant_rmse_oca=zeros(p2,10);
%ant_iteration=50; % Iterations

for i=1:p2
    ant_rmse_oca(i,1)=1e3;
    ant_rmse_oca(i,2)=i;
    ant_rmse_oca(i,10)=0;
end
aco=zeros(as,p2);
w1=[];
for i=1:as
        aco(i,:)=0;
         w1(i)=floor(round(rand*15+0.5));
         for j=1:w1(i)
             z=floor(round(rand*15+0.5));
             while(aco(i,z)~=0)
                 z=floor(round(rand*15+0.5));
                 if(aco(i,z)==0)
                     aco(i,z)=1;
                     break;
                 end
             end
             if(aco(i,z)==0)
                 aco(i,z)=1;
             end
         end
end

for i=1:as
    aco_rmse(i,1)=100;
    aco_rmse(i,2)=i;
    aco_rmse(i,10)=0;
end


for i=1:as
    for hh=1:10
        aco_rmse(i,hh)=0;%%运算前每个粒子的指标归零,重新计算
    end
    
    for l=1:p2
        aco1(l)=aco(i,l);
    end
    %cmodel=ones(2,2);
    [pso_rmse1]=checkoutnknn(feature,aco1,x,nn); % 校验数据
    aco_rmse(i,1)=pso_rmse1(1);
    aco_rmse(i,2)=i;%%粒子标识
    aco_rmse(i,3)=pso_rmse1(3);
    aco_rmse(i,4)=pso_rmse1(4);
    aco_rmse(i,5)=pso_rmse1(5);
    aco_rmse(i,6)=pso_rmse1(6);
    aco_rmse(i,7)=pso_rmse1(7);%% 第一类分类正确率
    aco_rmse(i,8)=pso_rmse1(8);%% 第二类分类正确率
    aco_rmse(i,9)=pso_rmse1(9);%%分类正确率平均值
    aco_rmse(i,10)=pso_rmse1(10); %%分类总正确率
    %%分类总正确率
end

rmse=aco_rmse;%%由于20组粒子的初始位置是随机得到
rand20=aco;%%由于20组粒子的初始位置是随机得到
best5=zeros(5,p2);

for j=1:as-1%%对15组指标进行排序,找出最优的5组数据
    for i=1:as-1
        if rmse(i,1)>rmse(i+1,1)
            for y=1:10
            k=rmse(i,y);
            rmse(i,y)=rmse(i+1,y);
            rmse(i+1,y)=k;
            end
        end
    end
end


for i=1:5
    for j=1:p2
        best5(i,j)=rand20(rmse(i,2),j);%%最优的五组特征选取数据为排序后的前五组随机数据
    end
end
        
for i=1:p2
    for j=1:5
        if(j==1)n(i)=0;
        end
        n(i)=n(i)+best5(j,i);%%对于每个特征的启发因子的最优的5组数据的选取值累加
    end
end

for i=1:p2
    t(i)=p2/rmse(1,1);%%信息素初始值为蚂蚁个数除以最优的rmse值,即排序后的第一个值
    ant(i,i)=1;
end


for ant_iteration=1:tmax%%五十次迭代
    ant=zeros(p2,p2);
    for q=1:15
        ant(q,q)=1;
    end
    for i=1:p2%%15只蚂蚁进行计算
        for j=1:p2%%特征
            k=0;
            for z=1:p2
                k=k+t(z)*n(z);
            end
            p(j)=(t(j)*n(j))/k;%%选取每个特征的概率计算
            p1(j,1)=p(j);%%把概率赋给P1的第一列
            p1(j,2)=j;%%第二列作特征的序号标识
        end
        for i=1:p2
            for j=1:(p2-1)
                if p1(j,1)<p1(j+1,1)%%按概率的大小对P1进行排序,以便蚂蚁选取特征
                    for z=1:2
                        k=p1(j,z);
                        p1(j,z)=p1(j+1,z);
                        p1(j+1,z)=k;
                    end
                end
            end
        end    
        e=1;
        ta=0.25;
        tb=0.95;
        while ant_rmse_oca(i,1)>ta&ant_rmse_oca(i,10)<tb%%当选取的特征的指标达到要求,停止运算
            if e>=(p2-1)%%如果15个特征都选取完了还没有找到满足要求的指标
                    break;
            end
            for j=1:p2
                if ant(i,p1(j,2))==0&rand()>=(0.80*p1(j,1)/p1(1,1))%%如果蚂蚁没有选择第概率大小排序第j的特征 
                    ant(i,p1(j,2))=1;%%选择该特征
                    e=e+1;
                    break;
                else e=e+1;
                end
            end
            
            for l=1:p2
                ant1(l)=ant(i,l);
            end
            aco_rmse1=checkoutnknn(feature,ant1,x,nn); %数据校验
            rmse(i,1)=aco_rmse1(1);
            rmse(i,2)=i;%%粒子标识
            rmse(i,3)=aco_rmse1(3);
            rmse(i,4)=aco_rmse1(4);
            rmse(i,5)=aco_rmse1(5);
            rmse(i,6)=aco_rmse1(6);
            rmse(i,7)=aco_rmse1(7);%% 第一类分类正确率
            rmse(i,8)=aco_rmse1(8);%% 第二类分类正确率
            rmse(i,9)=aco_rmse1(9);%%分类正确率平均值
            rmse(i,10)=aco_rmse1(10); %%分类总正确率
            if rmse(i,1)<ant_rmse_oca(i,1)&rmse(i,10)>ant_rmse_oca(i,10) 
                %%如果蚂蚁当前的选取值优于历史最优值,历史最优值和最优位置修改为当前值和位置
                for h=1:10
                    ant_rmse_oca(i,h)=rmse(i,h); 
                end
                for h=1:15
                    ant_best(i,h)=ant(i,h);
                end
            end                
            if rmse(i,1)<ta&rmse(i,10)>tb%%如果当前蚂蚁计算出来的指标满足条件,跳出循环
                break;
            end
            ta=ta+0.05;%%rmse的判定指标上调
            tb=tb-0.05;%%OCA得判定指标下调
            if e>=14%%如果15个特征都选取完了还没有找到满足要求的指标
                break; 
            end
        end
        for w=1:p2
            t(w)=0.5*t(w)+(1/ant_rmse_oca(i,1))*ant_best(i,w);%%对t值进行迭代
        end
    end
end

for i=1:15
    for j=1:14
        if ant_rmse_oca(j,1)>=ant_rmse_oca(j+1,1)&ant_rmse_oca(j,10)<=ant_rmse_oca(j+1,10)
            %%按15个蚂蚁的最优特征选择参数进行排序
            for z=1:10
                f=ant_rmse_oca(j,z);
                ant_rmse_oca(j,z)=ant_rmse_oca(j+1,z);
                ant_rmse_oca(j+1,z)=f;
            end
            for z=1:15
                f=ant_best(j,z);
                ant_best(j,z)=ant_best(j+1,z);
                ant_best(j+1,z)=f;
            end
        end
    end
end
for i=1:10
ant_rmse_oca2(1,i)=ant_rmse_oca(1,i);
end

for i=1:15
    ant_best2(1,i)=ant_best(1,i);
end

ant_best1=ant_best2;
ant_rmse_oca1=ant_rmse_oca2;
dlmwrite('pso.txt',ant_rmse_oca1,'-append','delimiter', ' ');
dlmwrite('pso.txt',ant_best1,'-append','delimiter', ' ');
%disp('ACO运行结果为:'+ant_rmse_oca(1,1:10));
%disp(ant_best(1,:));
%disp('程序结束');

⌨️ 快捷键说明

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