[TSP] 개미 군락 알고리즘 개선을 기반으로 여행하는 세일즈맨 문제 해결을위한 Matlab 소스 코드

1. 소개

TSP 문제는 여행하는 세일즈맨 문제입니다. 고전적인 TSP는 다음과 같이 설명 할 수 있습니다. 상품 세일즈맨이 상품을 판매하기 위해 여러 도시에 가고 싶어합니다. 세일즈맨은 한 도시에서 시작하여 모든 도시를지나 가야합니다. 출발. 전체 여행을 가장 짧게 만들기 위해 여행 경로를 어떻게 선택해야합니까? 그래프 이론의 관점에서 볼 때 문제의 본질은 가중 된 완전 무 방향 그래프에서 가장 작은 가중치를 가진 해밀턴주기를 찾는 것입니다.

출장 세일즈맨에게 질문하는 방법은 여러 가지가 있는데, 최근에 TSP에 대해 몇 가지 질문을했는데 아래에 요약하겠습니다. 대부분의 TSP 문제는 NP-Hard이기 때문에 효율적인 다항식 수준의 알고리즘을 얻기가 어렵습니다. 일반적으로 사용되는 알고리즘은 무차별 대입 검색 및 상태 압력 DP로 편향되어 있습니다. 여기서는 상태 압력 DP를 사용하여 해결합니다. 대부분의 TSP 질문에서 제공하는 위치의 수는 매우 적습니다.

고전적인 TSP 문제를 고려할 때 상태 압력 DP를 사용하고 각 위치를 이진 1/0으로 압축하면 상태 전이 방정식을 얻는 것이 어렵지 않습니다.
dp [S] [i] = min (dp [S] [ i], dp [S ^ (1 << (i-1))] [k] + dist [k] [i])
S는 현재 상태를 나타내고, i (1에서 시작)는 i 번째 마지막을 의미합니다. 현재 상태에 도달했을 때 방문한 위치
k는 i와 다른 S에서 방문한 모든 위치 입니다.
dist는 두 지점 사이의 최단 경로를 나타냅니다.
그리고 초기화 :
DP [S] [i] = dist [start] [i] (S == 1 << (i-1))
처음 상태 압력 dp에 익숙하지 않다면, 위 공식의 의미는 대부분의 TSP 문제의 핵심입니다.


여기에 사진 설명 삽입

둘째, 소스 코드

%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                %清除所有变量
close all;                %清图
clc;                      %清屏
m=50;                     %蚂蚁个数
Alpha=1;                  %信息素重要程度参数              
Beta=5;                   %启发式因子重要程度参数
Rho=0.1;                  %信息素蒸发系数
G_max=200;                %最大迭代次数
Q=100;                    %信息素增加强度系数
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
    3238 1229;4196 1044;4312  790;4386  570;3007 1970;2562 1756;...
    2788 1491;2381 1676;1332  695;3715 1678;3918 2179;4061 2370;...
    3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...
    3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
    2370 2975];                 %31个省会城市坐标
%%%%%%%%%%%%%%%%%%%%%%%%第一步:变量初始化%%%%%%%%%%%%%%%%%%%%%%%%
n=size(C,1);              %n表示问题的规模(城市个数)
D=zeros(n,n);             %D表示两个城市距离间隔矩阵
for i=1:n
    for j=1:n
        if i~=j
            D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
        else
            D(i,j)=eps;
        end
        D(j,i)=D(i,j);
    end
end
Eta=1./D;                    %Eta为启发因子,这里设为距离的倒数
Tau=ones(n,n);               %Tau为信息素矩阵
Tabu=zeros(m,n);             %存储并记录路径的生成
NC=1;                        %迭代计数器
R_best=zeros(G_max,n);       %各代最佳路线
L_best=inf.*ones(G_max,1);   %各代最佳路线的长度
figure(1);%优化解
while NC<=G_max            
    %%%%%%%%%%%%%%%%%%第二步:将m只蚂蚁放到n个城市上%%%%%%%%%%%%%%%%
    Randpos=[];
    for i=1:(ceil(m/n))
        Randpos=[Randpos,randperm(n)];
    end
    Tabu(:,1)=(Randpos(1,1:m))'; 
    %%%%%第三步: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
                    J(Jc)=k;
                    Jc=Jc+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);
            Select=find(Pcum>=rand);
            to_visit=J(Select(1));
            Tabu(i,j)=to_visit;
        end
    end

세, 실행 결과

여기에 사진 설명 삽입
여기에 사진 설명 삽입

네, 비고

QQ1575304183을 추가하는 대신 코드를 작성하거나 작성하십시오.

과거 리뷰 >>>>>>

[경로 계획] 개미 식민지를 기반으로 여러 여행 세일즈맨 MTSP 문제를 해결하기위한 Matlab 소스 코드

[TSP] Ant colony 알고리즘은 GUI MATLAB 소스 코드로 TSP 문제 해결을위한 MATLAB

[TSP] 문제 해결 TSP 혼돈 입자 떼 알고리즘 MATLAB 소스 코드

[TSP] 시뮬레이션 된 어닐링 MATLAB 소스 기반 TSP 문제

[TSP 문제를위한 유전 알고리즘 기반 TSP 문제 MATLAB 소스

[TSP 문제] 개미 식민지 알고리즘 기반 TSP 문제 Matlab 소스 코드

[TSP] 반딧불이 알고리즘 MATLAB 소스 코드를 기반으로 TSP 문제 해결

[TSP 문제] 미분 진화 기반 TSP 문제 Matlab 소스 코드

[TSP 문제] 입자 떼 알고리즘 Hopfield를 기반으로 여행 세일즈맨 문제를 해결 MATLAB 소스 코드

추천

출처blog.csdn.net/qq_34763204/article/details/113746161