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

📄 c_antclusterknown.m

📁 已经知道的信息的
💻 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 + -