基于ACO蚁群算法的tsp优化问题matlab仿真

157 阅读3分钟

1.算法描述

     “基本原理 蚁群算法(Ant Colony Optimization,ACO)是一种基于种群寻优的启发式搜索算法,有意大利学者M.Dorigo等人于1991年首先提出。该算 法受到自然界真实蚁群集体在觅食过程中行为的启发,利用真实蚁群通过个体间的信息传递、搜索从蚁穴到食物间的最短路径等集体寻优特 征,来解决一些离散系统优化中的困难问题。

 

       算法基本思想:

 

(1)根据具体问题设置多只蚂蚁,分头并行搜索。

 

(2)每只蚂蚁完成一次周游后,在行进的路上释放信息素,信息素量与解的质量成正比。

 

(3)蚂蚁路径的选择根据信息素强度大小(初始信息素量设为相等),同时考虑两点之间的距离,采用随机的局部搜索策略。这使得距离较短的边,其上的信息素量较大,后来的蚂蚁选择该边的概率也较大。

 

(4)每只蚂蚁只能走合法路线(经过每个城市1次且仅1次),为此设置禁忌表来控制。

 

(5)所有蚂蚁都搜索完一次就是迭代一次,每迭代一次就对所有的边做一次信息素更新,原来的蚂蚁死掉,新的蚂蚁进行新一轮搜索。

 

(6)更新信息素包括原有信息素的蒸发和经过的路径上信息素的增加。

 

(7)达到预定的迭代步数,或出现停滞现象(所有蚂蚁都选择同样的路径,解不再变化),则算法结束,以当前最优解作为问题的最优解。

 

      将各个蚂蚁随机地置于不同的出发地,对每个蚂蚁k ( k = 1 , 2 , ⋯  , m ) ,按照轮盘赌法得到下面的转移概率公式计算其下一个待访问的城市,直到所有蚂蚁访问完所有的城市。

1.png

2.仿真效果预览

matlab2022a仿真结果如下:

2.png

3.png

3.MATLAB核心程序 `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`