📄 aco2.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 + -