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을 추가하는 대신 코드를 작성하거나 작성하십시오.