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