ACO 개미군집 최적화 알고리즘을 기반으로 도시 TSP 문제를 해결하기 위한 Matlab 시뮬레이션

목차

1. ACO 개미군집 최적화 알고리즘 개요

2. ACO 개미 군집 최적화 알고리즘 기반 도시 TSP 문제 해결

3.MATLAB 핵심 프로그램

4.aco-tsp 시뮬레이션 결과


1. ACO 개미군집 최적화 알고리즘 개요

       ACO 개미 군집 최적화 알고리즘은 자연에서 개미의 먹이 활동 행동을 시뮬레이션하여 최적화 문제를 해결하는 생체공학 알고리즘입니다. 이 알고리즘은 원래 1992년 이탈리아 학자 M.Dorigo et al.에 의해 제안되었으며 TSP(Traveling Salesman Problem)를 해결하는 데 성공적으로 적용되었습니다. 개미는 먹이를 찾을 때 이동 경로에 페로몬이라는 물질을 남깁니다. 후속 개미가 경로를 선택할 때 페로몬 농도가 높은 경로를 선택하는 경향이 있습니다. 동시에 개미는 경로의 길이에 따라 페로몬의 농도를 조절합니다. 경로가 짧을수록 페로몬 농도가 높아지고 더 많은 개미가 해당 경로를 선택하게 됩니다. 지속적인 반복과 업데이트를 통해 결국 최적의 솔루션을 찾을 수 있습니다.

       ACO 알고리즘에서는 인공 개미를 사용하여 실제 개미의 행동을 시뮬레이션합니다. 각 인공 개미는 솔루션 공간에서 실행 가능한 솔루션을 독립적으로 검색하고 솔루션에 페로몬을 남깁니다. 해결책이 좋을수록 더 많은 페로몬이 남게 됩니다. 알고리즘이 진행됨에 따라 최적의 솔루션 경로에 대한 페로몬 농도가 점차 증가하고 점점 더 많은 개미가 이 경로를 선택하게 됩니다. 결국 전체 개미 군집은 최적 또는 거의 최적에 가까운 솔루션으로 수렴됩니다.
       ACO 알고리즘에서 각 개미가 다음 노드를 선택할 확률은 다음 공식으로 표현될 수 있습니다.

p_ij = [tau_ij^알파] / [sum_{k in allowed_k} tau_ik^alpha]

       그 중 p_ij는 노드 i에서 노드 j까지 개미가 있을 확률을 나타내고, tau_ij는 노드 i와 노드 j 사이의 페로몬 농도를 나타내고, alpha는 페로몬 농도의 중요도를 나타내며, allowed_k는 개미가 방문하지 않은 노드의 집합을 나타냅니다.

각 반복 후에 각 노드의 페로몬 농도는 다음 공식에 따라 업데이트됩니다.

tau_ij = (1 - rho) * tau_ij + sum_{k=1}^m delta_tau_ij^k

       그 중 rho는 페로몬의 휘발률을 나타내고, m은 개미의 수를 나타내며, delta_tau_ij^k는 노드 i와 노드 j 사이에 k번째 개미가 남긴 페로몬 농도의 증가분을 나타낸다. delta_tau_ij^k는 다음 공식을 사용하여 계산할 수 있습니다.

delta_tau_ij^k = Q / L_k

그 중 Q는 상수를 나타내고, L_k는 k번째 개미의 경로 길이를 나타낸다.

       또한 개미 수, 반복 횟수, 페로몬의 초기 농도 등과 같이 알고리즘의 수렴 속도와 검색 범위를 제어하는 ​​데 사용되는 몇 가지 다른 매개 변수와 공식이 있습니다. 이러한 매개변수의 선택은 특정 문제의 특성과 규모에 맞게 조정되어야 합니다.

2. ACO 개미 군집 최적화 알고리즘 기반 도시 TSP 문제 해결

      TSP 문제는 주어진 도시 집합에서 각 도시를 정확히 한 번 방문하고 경로의 전체 길이를 최소화하는 최단 경로를 찾는 고전적인 조합 최적화 문제입니다. TSP 문제는 NP-hard 문제입니다. 즉, 다항식 시간에서는 최적의 해를 찾을 수 없습니다.

       ACO 개미 군집 최적화 알고리즘을 기반으로 도시 TSP 문제를 해결함에 있어 각 도시를 노드로 간주하고 도시 간 거리를 에지의 가중치로 간주합니다. 각 개미는 출발지에서 출발하여 각 도시를 차례로 방문하고, 최종적으로 출발지로 돌아옵니다. 개미는 각 도시를 방문할 때 페로몬 농도와 현재 도시와 방문하지 않은 도시 사이의 거리를 바탕으로 다음 방문 도시를 선택하게 됩니다. 구체적으로, 개미가 다음 도시를 선택할 확률은 다음 공식으로 표현될 수 있습니다.

p_ij = [tau_ij^알파] / [sum_{k in allowed_k} tau_ik^alpha]

       이 중 p_ij는 도시 i에서 도시 j로 개미가 이동할 확률, tau_ij는 도시 i와 도시 j 사이의 페로몬 농도, alpha는 페로몬 농도의 중요도, allowed_k는 개미가 방문하지 않은 도시의 집합을 나타냅니다.

      각 반복에서 각 개미는 모든 도시를 방문하고 시작점으로 돌아올 때까지 위 공식에 따라 방문할 다음 도시를 선택합니다. 그런 다음 각 개미의 경로 길이를 기준으로 각 도시 간의 페로몬 농도 증가분을 계산합니다. 구체적으로 페로몬 농도의 증가는 다음 공식으로 표현될 수 있다.

delta_tau_ij = Q / L_k

      그 중 delta_tau_ij는 도시 i에서 도시 j로의 페로몬 농도 증가를 나타내고, Q는 상수, L_k는 k번째 개미의 경로 길이를 나타낸다.

       마지막으로 다음 반복에서 사용할 각 도시 간의 페로몬 농도를 업데이트합니다. 구체적으로, 페로몬 농도의 업데이트는 다음 공식으로 표현될 수 있습니다.

tau_ij = (1 - rho) * tau_ij + sum_{k=1}^m delta_tau_ij^k

       그 중 rho는 페로몬의 휘발률을 나타내고, m은 개미의 수를 나타내며, delta_tau_ij^k는 도시 i와 도시 j 사이에 k번째 개미가 남긴 페로몬 농도의 증가분을 나타낸다.

      위 단계의 지속적인 반복과 업데이트를 통해 최종적으로 최적의 솔루션을 찾을 수 있습니다. 실제 응용에서는 다양한 문제 크기와 복잡성에 적응하기 위해 알고리즘을 최적화하고 개선해야 할 수도 있습니다. 또한, 개미군집 최적화 알고리즘 역시 국소최적해에 빠지기 쉬운 등 몇 가지 한계점을 갖고 있다. 따라서 알고리즘의 효율성과 신뢰성을 보장하려면 실제 응용 프로그램에서 매개 변수와 설정을 신중하게 선택해야 합니다.

      ACO 알고리즘은 TSP 문제를 해결하는 데 있어 좋은 결과를 얻었지만 몇 가지 한계도 있습니다. 예를 들어, 규모가 크고 복잡한 문제의 경우 알고리즘은 최적의 솔루션을 찾는 데 오랜 시간과 컴퓨팅 리소스가 필요할 수 있으며 동시에 알고리즘은 로컬 최적 솔루션에 빠지기 쉽습니다. 따라서 알고리즘의 효율성과 신뢰성을 보장하려면 실제 응용 프로그램에서 매개 변수와 설정을 신중하게 선택해야 합니다.

3.MATLAB 핵심 프로그램

.......................................................................              
while NC<=NC_max        %停止条件之一:达到最大迭代次数,停止
    %%2.将m只蚂蚁放到n个城市上
    Randpos=[];   %随即存取
    for i=1:(ceil(m/n))
        Randpos=[Randpos,randperm(n)];
    end
    Tabu(:,1)=(Randpos(1,1:m))';   
    %%3.m只蚂蚁按概率函数选择下一座城市,完成各自的周游
    for j=2:n     %所在城市不计算
        for i=1:m
            visited=Tabu(i,1:(j-1)); %记录已访问的城市,避免重复访问
            J=zeros(1,(n-j+1));       %待访问的城市
            P=J;                      %待访问城市的选择概率分布
            Jc=1;
            for k=1:n
                if length(find(visited==k))==0   %开始时置0
                    J(Jc)=k;
                    Jc=Jc+1;                         %访问的城市个数自加1
                end
            end
            %下面计算待选城市的概率分布
            for k=1:length(J)
                P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
            end
            P=P/(sum(P));
            %按概率原则选取下一个城市
            Pcum=cumsum(P);     %cumsum,元素累加即求和
            Select=find(Pcum>=rand); %若计算的概率大于原来的就选择这条路线
            to_visit=J(Select(1));
            Tabu(i,j)=to_visit;
        end
    end
    if NC>=2
        Tabu(1,:)=R_best(NC-1,:);
    end
    %%4.记录本次迭代最佳路线
    L=zeros(m,1);     %开始距离为0,m*1的列向量
    for i=1:m
        R=Tabu(i,:);
        for j=1:(n-1)
            L(i)=L(i)+D(R(j),R(j+1));    %原距离加上第j个城市到第j+1个城市的距离
        end
        L(i)=L(i)+D(R(1),R(n));      %一轮下来后走过的距离
    end
    L_best(NC)=min(L);           %最佳距离取最小
    pos=find(L==L_best(NC));
    R_best(NC,:)=Tabu(pos(1),:); %此轮迭代后的最佳路线
    L_ave(NC)=mean(L);           %此轮迭代后的平均距离
    NC=NC+1                      %迭代继续
 
 
    %%5.更新信息素
    Delta_Tau=zeros(n,n);        %开始时信息素为n*n的0矩阵
    for i=1:m
        for j=1:(n-1)
            Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
            %此次循环在路径(i,j)上的信息素增量
        end
        Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
        %此次循环在整个路径上的信息素增量
    end
    Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素
    %%6.禁忌表清零
    Tabu=zeros(m,n);             %直到最大迭代次数
end
%%7.输出结果及绘图
Pos=find(L_best==min(L_best));   %找到最佳路径(非0为真)
Shortest_Route=R_best(Pos(1),:)  %最大迭代次数后最佳路径
Shortest_Length=L_best(Pos(1))   %最大迭代次数后最短距离 
toc                   %计时结束
N=length(R);
scatter(C(:,1),C(:,2));
 hold on
 plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)],'r')
 hold on
for ii=2:N
    plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'r')
     hold on
end
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
title(['蚁群算法(最短距离):' num2str(Shortest_Length) ''])
up2224

4.aco-tsp 시뮬레이션 결과

추천

출처blog.csdn.net/ccsss22/article/details/133446521