目录
“基本原理 蚁群算法(Ant Colony Optimization,ACO)是一种基于种群寻优的启发式搜索算法,有意大利学者M.Dorigo等人于1991年首先提出。该算 法受到自然界真实蚁群集体在觅食过程中行为的启发,利用真实蚁群通过个体间的信息传递、搜索从蚁穴到食物间的最短路径等集体寻优特 征,来解决一些离散系统优化中的困难问题。
算法基本思想:
(1)根据具体问题设置多只蚂蚁,分头并行搜索。
(2)每只蚂蚁完成一次周游后,在行进的路上释放信息素,信息素量与解的质量成正比。
(3)蚂蚁路径的选择根据信息素强度大小(初始信息素量设为相等),同时考虑两点之间的距离,采用随机的局部搜索策略。这使得距离较短的边,其上的信息素量较大,后来的蚂蚁选择该边的概率也较大。
(4)每只蚂蚁只能走合法路线(经过每个城市1次且仅1次),为此设置禁忌表来控制。
(5)所有蚂蚁都搜索完一次就是迭代一次,每迭代一次就对所有的边做一次信息素更新,原来的蚂蚁死掉,新的蚂蚁进行新一轮搜索。
(6)更新信息素包括原有信息素的蒸发和经过的路径上信息素的增加。
(7)达到预定的迭代步数,或出现停滞现象(所有蚂蚁都选择同样的路径,解不再变化),则算法结束,以当前最优解作为问题的最优解。
将各个蚂蚁随机地置于不同的出发地,对每个蚂蚁k ( k = 1 , 2 , ⋯ , m ) ,按照轮盘赌法得到下面的转移概率公式计算其下一个待访问的城市,直到所有蚂蚁访问完所有的城市。
matlab2022a仿真结果如下:


- tic
- CityNum=30;
- [dislist,Clist]=tsp(CityNum);
-
- Tlist=zeros(CityNum);%禁忌表(tabu list)
- cl=100;%保留前cl个最好候选解
- bsf=Inf;
- tl=50; %禁忌长度(tabu length)
- l1=200;%候选解(candidate),不大于n*(n-1)/2(全部领域解个数)
- S0=randperm(CityNum);
- S=S0;
- BSF=S0;
- Si=zeros(l1,CityNum);
- StopL=200; %终止步数
- p=1;
- clf;
- figure(1);
-
- while (p<StopL+1)
- if l1>CityNum*(CityNum)/2
- disp('候选解个数,不大于n*(n-1)/2(全部领域解个数)! 系统自动退出!');
- l1=(CityNum*(CityNum)/2)^.5;
- break;
- end
- ArrS(p)=CalDist(dislist,S);
- i=1;
- A=zeros(l1,2);
- while i<=l1
- M=CityNum*rand(1,2);
- M=ceil(M);
- if M(1)~=M(2)
- m1=max(M(1),M(2));m2=min(M(1),M(2));
- A(i,1)=m1;A(i,2)=m2;
- if i==1
- isdel=0;
- else
- for j=1:i-1
- if A(i,1)==A(j,1)&&A(i,2)==A(j,2)
- isdel=1;
- break;
- else
- isdel=0;
- end
- end
- end
- if ~isdel
- i=i+1;
- else
- i=i;
- end
- else
- i=i;
- end
- end
-
- for i=1:l1
- Si(i,:)=S;
- Si(i,[A(i,1),A(i,2)])=S([A(i,2),A(i,1)]);
- CCL(i,1)=i;
- CCL(i,2)=CalDist(dislist,Si(i,:));
- CCL(i,3)=S(A(i,1));
- CCL(i,4)=S(A(i,2));
- end
- [fs fin]=sort(CCL(:,2));
- for i=1:cl
- CL(i,:)=CCL(fin(i),:);
- end
-
- if CL(1,2)<bsf %藐视准则(aspiration criterion)
- bsf=CL(1,2);
- S=Si(CL(1,1),:);
- BSF=S;
- for m=1:CityNum
- for n=1:CityNum
- if Tlist(m,n)~=0
- Tlist(m,n)=Tlist(m,n)-1;
- end
- end
- end
- Tlist(CL(1,3),CL(1,4))=tl;
- else
- for i=1:cl
- if Tlist(CL(i,3),CL(i,4))==0
- S=Si(CL(i,1),:);
- for m=1:CityNum
- for n=1:CityNum
- if Tlist(m,n)~=0
- Tlist(m,n)=Tlist(m,n)-1;
- end
- end
- end
- Tlist(CL(i,3),CL(i,4))=tl;
- break;
- end
- end
- end
-
- Arrbsf(p)=bsf;
- drawTSP(Clist,BSF,bsf,p,0);
- p=p+1;
- end
- BestShortcut=BSF
- theMinDistance=bsf
-
- figure(2);
- plot(Arrbsf,'r'); hold on;
- plot(ArrS,'b');grid;
- title('搜索过程');
- legend('最优解','当前解');
- A_073
V