📄 c_antclusterknown.m
字号:
function [m_pattern]=C_AntClusterKnown(m_pattern,patternNum)
disType=DisSelDlg(); %获得距离计算类型
[centerNum iterNum]=InputClassDlg();%获得类中心数何最大迭代次数
%初始化参数
antNum=200;%蚂蚁数目
rho=0.1;%1-rho:信息素轨迹的衰减系数
q=0.5;%转化规则参数
tao=ones(patternNum,centerNum)*0.01;%信息素矩阵初始化
solution=zeros(antNum,patternNum+1);%解矩阵初始化
%初始化聚类中心
for i=1:centerNum
m_center(i).feature=m_pattern(i).feature;
m_center(i).index=i;
m_center(i).patternNum=0;
end
counter=0;
bestVal=inf;
while(counter<interNum)
solution=0*solution;
if(counter==0)
%随机生成初始蚁群分布矩阵
for i=1:antNum
solution(i,1:patternNum)=randperm(patternNum);
for j=1:patternNum
if(solution(i,j)>centerNum)
solution(i,j)=fix(rand*centerNum+1);
end
m_pattern(j).category=solution(i,j);
end
%计算聚类中心
for j=1:centerNum
m_center(j)=CalCenter(m_center(j),m_pattern,patternNum);
end
m_antCenter(i).m_center=m_center;
%计算目标函数
for j=1:patternNum
solution(i,patternNum+1)=solution(i,patternNum+1)
+GetDistance(m_pattern(j),m_center(solution(i,j)),disType);
end
end
else
%根据信息素矩阵计算每只蚂蚁的解
r=rand(antNum,patternNum);%产生随机数
for i=1:antNum
for j=1:patternNum
if(r(i,j)<q) %若r<q,选择与样品间具有最大信息素的类为样品要归属的类
[C,R]=max(tao(j,:));
solution(i,j)=R;%i只蚂蚁的第j个样品对应的R类
else %根据转换概率随机选择要归属的类
temp=sum(tao(j,:));
tp=tao(j,:)/temp;%转移概率
for m=2:centerNum
tp(m)=tp(m)+tp(m-1);
end
rp=rand;
for m=1:centerNum %根据产生的随机数r判断归属的类
if(rp<=tp(m))
solution(i,j)=m;
break;
end
end
end
m_pattern(j).category=solution(i,j);
end
%计算聚类中心
for j=1:centerNum
m_center(j)=CalCenter(m_center(j),m_pattern,patternNum);
end
m_antCenter(i).m_center=m_center;
%计算目标函数
for j=1:patternNum
solution(i,patternNum+1)=solution(i,patternNum+1)
+GetDistance(m_pattern(j),m_center(solution(i,j),disType));
end
end
end
%对蚂蚁按目标函数由小到大排序
for i=1:antNum-1
for j=i+1:antNum
if (solution(i,patternNum+1)>solution(j,patternNum+1))
temp=solution(i,:);
solution(i,:)=solution(j,:);
solution(j,:)=temp;
temp2=m_antCenter(i);
m_antCenter(i)=m_antCenter(j);
m_antCenter(j)=temp2;
end
end
end
jp=0.05;%局部概率辖制
L=2;
k=1;
tempSolution=solution;
while (k<L)
r=rand(1,patternNum);
for j=1:patternNum
m_pattern(j).category=solution(k,j);
end
for i=1:patternNum
if(r(1,i)<jp)%该样品被分到其他类
dis=inf;
pj=0;
for j=1:centerNum
if(j~=m_pattern(i).category)
disTemp=GetDistance(m_pattern(i),m_antCenter(k).m_center(j),disType);
if(dis>disTemp)
dis=disTemp;
pj=j;
end
end
end
m__pattern(i).category=pj;
end
end
%计算调整后的目标函数
for j=1:centerNum
m_antCenter(k).m_center(j)=CalCenter(m_antCenter(k).m_center(j),m_pattern,patternNum);
end
solution(k,patternNum+1)=0;
for j=1:patternNum
solution(k,patternNum+1)=solution(k,patternNum+1)+GetDistance(m_pattern(j),m_center(solution(k,j)),disType);
end
%若调整后的目标函数小于先前的,保留调整后的样品所属的类
if(solution(k,patternNum+1)>tempSolution(k,patternNum+1))
solution(k,:)=tempSolution(k,:);
end
if(solution(k,patternNum+1)<bestVal)%保留最优解
bestVal=solution(k,patternNum+1);
bestCluster=solution(k,:);
t=counter;
end
k=k+1;
end
if(bestVal==0)%counter-t>interNum/2
break;
end
%信息素更新
tSum=zeros(patternNum,centerNum);
for m=1:L
for i=1:patternNum
for j=1:centerNum
if(solution(m,i)==j)
tSum(i,j)=tSum(i,j)+0.001/solution(m,patternNum+1);
end
end
end
end
tao=(1-rho)*tao+tSum;
counter=counter+1;
end
for i=1:patternNum
m_pattern(i).category=bestCluster(i);
end
disp(tao);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -