1.はじめに
TSP問題は巡回セールスマン問題です。古典的なTSPは、次のように説明できます。商品のセールスマンは、商品を販売するために複数の都市に行きたいと考えています。セールスマンは1つの都市から始めて、出発。総移動距離を最短にするために、移動ルートをどのように選択する必要がありますか。グラフ理論の観点から、問題の本質は、重み付けされた完全に無向のグラフで最小の重みを持つハミルトン閉路を見つけることです。
巡回セールスマンに質問する方法はたくさんありますが、最近、TSPについていくつか質問をしましたので、以下に要約します。ほとんどのTSP問題はNP困難であるため、効率的な多項式レベルのアルゴリズムを取得することは困難です。一般に、使用されるアルゴリズムはブルートフォース検索と状態圧力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は、2点間の最短経路を表します。
そして初期化:
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
3、実行中の結果
四、備考
QQ1575304183を追加するために、コードを完成させるか、記述してください