⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_antclusterknown.m

📁 蚁群聚类算法程序。可以用来做基本的蝶形数据测试。效果很好。
💻 M
字号:




function  [m_pattern]=C_AntClusterKnown(m_pattern,patternNum)
for i=1:14
    for j=1:2
        m_pattern(i,j)=round(2*rand());
    end
end
patternNum=14;
centerNum=2; iterNum=100;
antNum=200;rho=0.1;q=0.5;
tao=ones(patternNum,centerNum);%14*2
tao=tao*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<iterNum)
    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)));
                end
          end
  else
               r=rand(antNum,patternNum);%200*14
            for i=1:antNum
                  for j=1:patternNum
                           if (r(i,j)<q)
                             [C,R]=max(tao(j,:));%返回最大值和位置
                             solution(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
                                   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)));
                        end
            end  %fori=1:antnum
    end  %if (counter==0)
        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.2;
        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,j)<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));
                          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)));
             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>iterNum/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.01/solution(m,patternNum+1);
                      end
                  end
             end
        end
        tao=(1-rho)*tao+tSum;
        counter=counter+1;
    end  %while 总循环
    for i=1:patternNum
          m_pattern(i).category=bestCluster(i);
    end
    disp(tao);
        toc            
                    
                    
                         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -