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

📄 aco2.m

📁 求解离散问题的pso aco 算法
💻 M
字号:
d=0;
ant_best=zeros(15,15);
ant=zeros(15,15);
n=[];
t=[];
p=[];
p1=[];
best5=zeros(5,15);
ant_rmse_oca=[];
ant_iteration=50;

for i=1:15
    ant_rmse_oca(i,1)=1e3;
    ant_rmse_oca(i,2)=i;
    ant_rmse_oca(i,10)=0;
end


for j=1:19%%对20组指标进行排序,找出最优的5组数据
    for i=1:19
        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:15
        best5(i,j)=rand20(rmse(i,2),j);%%最优的五组特征选取数据为排序后的前五组随机数据
    end
end
        
for i=1:15
    for j=1:5
        if(j==1)n(i)=0;
        end
        n(i)=n(i)+best5(j,i);%%对于每个特征的启发因子的最优的5组数据的选取值累加
    end
end

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


for ant_iteration=1:50%%五十次迭代
    for j=1:15%%对于每一个蚂蚁
        k=0;
        for z=1:15
            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:15
        for j=1:14
            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
    for i=1:15%%15只蚂蚁进行计算
        e=0;
        ta=0.25;
        tb=0.95;
        while ant_rmse_oca(i,2)>ta&ant_rmse_oca(i,10)<tb%%当选取的特征的指标达到要求,停止运算
            if e>=14%%如果15个特征都选取完了还没有找到满足要求的指标
                    break;
            end
            for j=1:15
                if ant(i,p1(j,2))==0%%如果蚂蚁没有选择第概率大小排序第j的特征
                    ant(i,p1(j,2))=1;%%选择该特征
                end
               
                d=0;
                rmse=zeros(15,10);%%二折交叉检验,标识参考PSO2
                for j=1:345
                    dm=10000;
                 for b=346:690
                      d=sqrt(ant(i,1)*(feature(b,1)-feature(j,1))*(feature(b,1)-feature(j,1))+pso(i,2)*(feature(b,2)-feature(j,2))*(feature(b,2)-feature(j,2))+pso(i,3)*(feature(b,3)-feature(j,3))*(feature(b,3)-feature(j,3))+pso(i,4)*(feature(b,4)-feature(j,4))*(feature(b,4)-feature(j,4))+pso(i,5)*(feature(b,5)-feature(j,5))*(feature(b,5)-feature(j,5))+pso(i,6)*(feature(b,6)-feature(j,6))*(feature(b,6)-feature(j,6))+pso(i,7)*(feature(b,7)-feature(j,7))*(feature(b,7)-feature(j,7))+pso(i,8)*(feature(b,8)-feature(j,8))*(feature(b,8)-feature(j,8))+pso(i,9)*(feature(b,9)-feature(j,9))*(feature(b,9)-feature(j,9))+pso(i,10)*(feature(b,10)-feature(j,10))*(feature(b,10)-feature(j,10))+pso(i,11)*(feature(b,11)-feature(j,11))*(feature(b,11)-feature(j,11))+pso(i,12)*(feature(b,12)-feature(j,12))*(feature(b,12)-feature(j,12))+pso(i,13)*(feature(b,13)-feature(j,13))*(feature(b,13)-feature(j,13))+pso(i,14)*(feature(b,14)-feature(j,14))*(feature(b,14)-feature(j,14))+pso(i,15)*(feature(b,15)-feature(j,15))*(feature(b,15)-feature(j,15)));
         
                     if d<dm
                         x(j,2)=x(b,1);
                         dm=d;
                     end
                 end
             end
             for j=346:690
                 dm=10000;
                 for b=1:345
                     d=sqrt(ant(i,1)*(feature(b,1)-feature(j,1))*(feature(b,1)-feature(j,1))+pso(i,2)*(feature(b,2)-feature(j,2))*(feature(b,2)-feature(j,2))+pso(i,3)*(feature(b,3)-feature(j,3))*(feature(b,3)-feature(j,3))+pso(i,4)*(feature(b,4)-feature(j,4))*(feature(b,4)-feature(j,4))+pso(i,5)*(feature(b,5)-feature(j,5))*(feature(b,5)-feature(j,5))+pso(i,6)*(feature(b,6)-feature(j,6))*(feature(b,6)-feature(j,6))+pso(i,7)*(feature(b,7)-feature(j,7))*(feature(b,7)-feature(j,7))+pso(i,8)*(feature(b,8)-feature(j,8))*(feature(b,8)-feature(j,8))+pso(i,9)*(feature(b,9)-feature(j,9))*(feature(b,9)-feature(j,9))+pso(i,10)*(feature(b,10)-feature(j,10))*(feature(b,10)-feature(j,10))+pso(i,11)*(feature(b,11)-feature(j,11))*(feature(b,11)-feature(j,11))+pso(i,12)*(feature(b,12)-feature(j,12))*(feature(b,12)-feature(j,12))+pso(i,13)*(feature(b,13)-feature(j,13))*(feature(b,13)-feature(j,13))+pso(i,14)*(feature(b,14)-feature(j,14))*(feature(b,14)-feature(j,14))+pso(i,15)*(feature(b,15)-feature(j,15))*(feature(b,15)-feature(j,15)));
         
                     if d<dm
                         x(j,2)=x(b,1);
                         dm=d;
                     end
                 end
             end
                 for v=1:690
                     rmse(i,1)=rmse(i,1)+(x(v,1)-x(v,2))*(x(v,1)-x(v,2));
                     if x(v,1)==1&x(v,2)==1
                         rmse(i,3)=rmse(i,3)+1;
                     end
                     if x(v,1)==1&x(v,2)==2
                         rmse(i,4)=rmse(i,4)+1;
                     end
                     if x(v,1)==2&x(v,2)==1
                         rmse(i,5)=rmse(i,5)+1;
                     end
                     if x(v,1)==2&x(v,2)==2
                         rmse(i,6)=rmse(i,6)+1;
                     end
                 end
                 rmse(i,1)=sqrt(rmse(i,1)/690);
                 rmse(i,2)=i;
                 rmse(i,7)=rmse(i,3)/(rmse(i,3)+rmse(i,4));
                 rmse(i,8)=rmse(i,6)/(rmse(i,5)+rmse(i,6));
                 rmse(i,9)=(rmse(i,7)+rmse(i,8))/2;
                 rmse(i,10)=(rmse(i,6)+rmse(i,3))/(rmse(i,3)+rmse(i,4)+rmse(i,5)+rmse(i,6));
                 
                 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.1;%%rmse的判定指标上调
                 tb=tb-0.05;%%OCA得判定指标下调
                  if e>=14%%如果15个特征都选取完了还没有找到满足要求的指标
                    break; 
                else
                    e=e+1;%%选取特征加1
                end
            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:15
        t(i)=0.5*t(i)+ant_rmse_oca(1,1)*ant_best(ant_rmse_oca(1,2),i);%%对t值进行迭代
    end
end

disp('ACO运行结果为:'+ant_rmse_oca(1,1:10));
disp(ant_best(1,:));
disp('程序结束');

⌨️ 快捷键说明

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