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