%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数民称:C_SFLA()
%参数:m_pattern:样品特征库;patternNum:样品数目
%返回值:m_pattern:样品特征库
%函数功能:按照蛙跳群聚类法对全体样品进行分类
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[m_pattern]=C_SFLA(m_pattern,patternNum)
frogNum=60;%初始化青蛙数目
disType=DisSelDlg();%获得距离计算类型
[centerNum iterNum memeplexNum]=InputClassDlg();%获得类中心数、最大迭代次数和模因组数
L=10;%模因组更新次数
m=memeplexNum;%模因组数
global Nwidth;
%初始化中心
for i=1:centerNum
m_center(i).feature=zeros(Nwidth,Nwidth);
m_center(i).patternNum=0;
m_center(i).index=i;
end
%初始化青蛙
for i=1:frogNum
Frog(i).fitness=0;
Frog(i).location=m_center;
Frog(i).string=ceil(rand(1,patternNum)*centerNum);
end
F_g.location=m_center;%群体最优青蛙位置
F_g.fitness=0;
F_g.string=zeros(1,patternNum);
%初始化子群
for i=1:m
memeplex(i).index=1;%每个模因组中最差青蛙的序号
memeplex(i).frog=[];
memeplex(i).F_b.location=m_center;%每个模因组最优青蛙位置
memeplex(i).F_b.fitness=0;%每个模因组最优青蛙适应度值
memeplex(i).F_w.location=m_center;%每个模因组最差青蛙位置
memeplex(i).F_w.fitness=0;%每个模因组最差青蛙适应度值
end
%生成初始青蛙群
for i=1:frogNum
for j=1:patternNum
m_pattern(j).category=Frog(i).string(1,j);
end
for j=1:centerNum
m_center(j)=CalCenter(m_center(j),m_pattern,patternNum);
end
Frog(i).location=m_center;
end
%计算每只青蛙的适应度值
for i=1:frogNum
temp=0;
for j=1:patternNum
temp=temp+GetDistance(m_pattern(j),Frog(i).location(Frog(i).string(1,j)),disType);
end
if(temp==0)%最优解,直接退出
break;
end
Frog(i).fitness=1/temp;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%群体进化
for iter=1:iterNum
%青蛙按适应度值降序排列
for i=1:frogNum-1
for j=i+1:frogNum
if(Frog(i).fitness<Frog(j).fitness)
temp=Frog(j);
Frog(j)=Frog(i);
Frog(i)=temp;
end
end
end
%实现青蛙分群
for i=1:frogNum
for j=1:m
if(mod(i,m)==0)
memeplex(m).frog=[memeplex(m).frog;Frog(i)];
end
if(mod(i,m)~=0&&mod(i,m)==j)
memeplex(j).frog=[memeplex(j).frog;Frog(i)];
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%每个模因组内执行memetic算法
Di=zeros(Nwidth,Nwidth);
for n=1:m %每个模因组内循环
for k=1:L
%模因组中的最差青蛙和最好青蛙
for i=n:m:frogNum
memeplex(n).F_w=Frog(1);
memeplex(n).F_b=Frog(1);
if(i~=1&&memeplex(n).F_w.fitness>Frog(i).fitness)
memeplex(n).F_w=Frog(i);
memeplex(n).index=i;
end
if(i~=1&&memeplex(n).F_b.fitness<Frog(i).fitness)
memeplex(n).F_b=Frog(i);
end
end
%更新模因组中的最差青蛙
fit=memeplex(n).F_w.fitness;
loc=memeplex(n).F_w.location;
for j=1:centerNum
%公式:D=rand(Fb-Fw)
Di=rand(Nwidth,Nwidth).*(memeplex(n).F_b.location(j).feature-memeplex(n).F_w.location(j).feature);
%公式:Fw=Fw+D
memeplex(n).F_w.location(j).featur=memeplex(n).F_w.location(j).feature+Di;
%计算适应度值
memeplex(n).F_w=Calfitness(m+pattern,patternNum,memeplex(n).F_w,Frog(memeplex(n).index),disType);
if(memeplex(n).F_w.fitness<fit) %如果适应度没有得到改善,则用全局最优青蛙代替子群内最优青蛙,并重新移动
memeplex(n).F_b.location(j).feature=F_g.location(j).feature;
memeplex(n).F_w.location=loc;
Di=rand(Nwidth,Nwidth).*(memeplex(n).F_b.location(j).feature-memeplex(n).F_w.location(j).feature);
memeplex(n).F_w.location(j).feature=memeplex(n).F_w.location(j).feature+Di;
memeplex(n).F_w=Calfitness(m_pattern,patternNum,memeplex(n).F_w,Frog(memeplex(n).index),disType);
if(memeplex(n).F_w.fitness<fit) %如果最差青蛙位置仍然没有改善,则随机改变最差青蛙位置
memeplex(n).F_w.loaction(j).feature=rand(Nwidth,Nwidth).*Frog(memeplex(n).index).location(j).feature;
end
end
end
end
end
%根据最近邻聚类法则对青蛙重新聚类
for i=1:frogNum
for j=1:patternNum
min=inf;
for k=1:centerNum
tempDis=GetDistance(m_pattern(j),Frog(i).location(k),disType);
if(tempDis<min)
min=tempDis;
m_pattern(j).category=k;
Frog(i).string(1,j)=k;
end
end
end
%重新计算聚类中心
for j=1:centerNum
Frog(i).location(j)=CalCenter(Frog(i).location(j),m_pattern,patternNum);
end
end
%重新计算青蛙的适应度值
for i=1:frogNum
temp=0;
for j=1:patternNum
temp=temp+GetDistance(m_pattern(j),Frog(i).location(Frog(i).string(1,j)),disType);
end
if(temp==0) %最优解,直接退出
iter=iterNum+1;
break;
end
Frog(i).fitness=1/temp;
end
%更新群体最优青蛙
for i=1:frogNum
if(Frog(i).fitness>F_g.fitness)
F_g.fitness=Frog(i).fitness;
F_g.location=Frog(i).location;
F_g.string=Frog(i).string;
end
end
for i=1:patternNum
m_pattern(i).category=F_g.string(1,i);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数名称:Calfitness()
%参数:m_pattern:样品;patternNum:样品个数;F_w:最差青蛙
%返回值:centerNum:输入类中心数;iterNum:输入迭代次数
%函数功能:计算最差青蛙适应度值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[F_w]=Calfitness(m_pattern,patternNum,F_w,Frog_index,disType)
for t=1:patternNum
temp=0;
temp=temp+GetDistance(m_pattern(t),F_w.location(Frog_index.string(1,t)),disType);
end
F_w.fitness=1/temp;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数名称:InputClassDlg()
%参数:空
%返回值:centerNum:输入类中心数;iterNum:输入迭代次数
%函数功能:用户输入雷中心数和迭代次数对话框
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[centerNum iterNum memeplexNum]=InputClassDlg( )
str1={'类中心数:','最大迭代次数','模因组数'};
T=inputdlg(str1,'输入对话框');
centerNum=str2num(T{1,1});
iterNum=str2num(T{2,1});
memeplexNum=str2num(T{3,1});
评论1