---
摘要:旅行商問題的傳統求解方法是遺傳算法,但此算法收斂速度慢,并不能
獲得問題的最優化解。蟻算法是受自然界中蟻搜索食物行為啟發而提出的一
種智能優化算法,通過介紹蟻覓食過程中基于信息素的最短路徑的搜索策略,
給出基于MATLAB的蟻算法在旅行商問題中的應用,對問題求解進行局部優
化。經過計算機仿真結果表明,這種蟻算法對求解旅行商問題有較好的改進效
果。
關鍵詞:蟻算法;旅行商問題;MATLAB;優化
一、意義和目標
旅行商問題是物流領域中的典型問題,它的求解具有十分重要的理論和現實
意義。采用一定的物流配送方式,可以大大節省人力物力,完善整個物流系統。
已被廣泛采用的遺傳算法是旅行商問題的傳統求解方法,但遺傳算法收斂速
度慢,具有一定的缺陷。本文采用蟻算法,充分利用蟻算法的智能性,求解
旅行商問題,并進行實例仿真。進行仿真計算的目標是,該算法能夠獲得旅行商
問題的優化結果,平均距離和最短距離。
二、國內外研究現狀
仿生學出現于20世紀50年代中期,人們從生物進化機理中受到啟發,提出
了遺傳算法、進化規劃、進化策略等許多用以解決復雜優化問題的新方法。這些
以生物特性為基礎的演化算法的發展及對生物落行為的發現引導研究人員進
一步開展了對生物社會性的研究,從而出現了基于智能理論的蟻算法,并掀
起了一股研究的熱潮。
20世紀90年代意大利科學家M最早提出了蟻優化算法——螞
-.-word資料-
---
蟻系統(Antsystem,AS),在求解二次分配、圖著問題、車輛調度、集成電路
設計以及通信網絡負載問題的處理中都取得了較好的結果。
旅行商問題(TSP,TravelingSalesmanProblem)被認為是一個基本問題,
是在1859年由威廉·漢密爾頓爵士首次提出的。所謂TSP問題是指:有個城市,
要求旅行商到達每個城市各一次,且僅一次,并回到起點,且要求旅行路線最短。
這是一個典型的優化問題,對一個具有中等頂點規模的圖來說,精確求解也是很
復雜的,計算量隨著城市個數的增加而呈指數級增長,即屬于所謂的P問題。
TSP在工程領域有著廣泛的應用,并常作為比較算法性能的標志。如網絡通訊、
貨物運輸、電氣布線、管道鋪設、加工調度、專家系統、柔性制造系統等方面,
都是TSP廣泛應用的領域。求解算法包括貪婪法(GM)、極小代數法(MA)、模
擬退火法(SA)和遺傳算法(GA)等。而應用蟻算法求解旅行商問題是近年
來研究的新方向,由于其并行性與分布性,特別適用于大規模啟發式搜索,實驗
結果證明了其可行性和有效性。
三、蟻系統基本原理
在螞蟻到食物時,它們總能到一條從食物到巢穴之間的最優路徑。這
是因為螞蟻在尋路徑時會在路徑上釋放出一種特殊的信息素(phero-mone)。
當它們碰到一個還沒有走過的路口時,就隨機地挑選一條路徑前行。與此同時釋
放出與路徑長度有關的信息素。路徑越長,釋放的激素濃度越低。當后來的螞蟻
再次碰到這個路口的時候,選擇激素濃度較高路徑概率就會相對較大。這樣形成
了一個正反饋。最優路徑上的激素濃度越來越大,而其它的路徑上激素濃度卻會
隨著時間的流逝而消減。最終整個蟻會出最優路徑。在整個尋徑過程中,雖
然單個螞蟻的選擇能力有限,但是通過激素的作用,整個蟻之間交換著路徑信
-.-word資料-
---
息,最終出最優路徑。
四、基于MATLAB的蟻算法求解旅行商問題
TSP問題描述如下:
設有n個城市C=(1,2,...,n),任意兩個城市i,j之間的距離為dij
,求一
條經過每個城市的路徑π=(π(1),π(2),...,π(n)),使得距離最小。
主要符號說明
Cn個城市的坐標,n×2的矩陣
C_max最大迭代次數
m螞蟻個數
Alpha表征信息素重要程度的參數
Beta表征啟發式因子重要程度的參數
Rho信息素蒸發系數
Q信息素增加強度系數
R_best各代最佳路線
L_best各代最佳路線的長度
求解TSP問題的螞蟻算法中,每只螞蟻是一個獨立的用于構造路線的過程,
若干螞蟻過程之間通過自適應的信息素值來交換信息,合作求解,并不斷優化。
這里的信息素值分布式存儲在圖中,與各弧相關聯。螞蟻算法求解TSP問題的
過程如下:
(1)首先初始化,設迭代的次數為C。初始化C=0
(2)將m個螞蟻置于n個頂點上
(3)m只螞蟻按概率函數選擇下一座城市,完成各自的周游
-.-word資料-
---
每個螞蟻按照狀態變化規則逐步地構造一個解,即生成一條回路。螞蟻的任
務是訪問所有的城市后返回到起點,生成一條回路。設螞蟻k當前所在的頂點為
i,那么,螞蟻k由點i向點j移動要遵循規則而不斷遷移,按不同概率來選擇下
一點。
(4)記錄本次迭代最佳路線
(5)全局更新信息素值
應用全局信息素更新規則來改變信息素值。當所有m個螞蟻生成了m個解,
其中有一條最短路徑是本代最優解,將屬于這條路線上的所有弧相關聯的信息素
值進行更新。
全局信息素更新的目的是在最短路線上注入額外的信息素,即只有屬于最短
路線的弧上的信息素才能得到加強,這是一個正反饋的過程,也是一個強化學習
的過程。在圖中各弧上,伴隨著信息素的揮發,全局最短路線上各弧的信息素值
得到增加。
(6)終止
若終止條件滿足,則結束;否則C=C+1,轉入步驟(2)進行下一代進化。
終止條件可指定進化的代數,也可限定運行時間,或設定最短路長的下限。
(7)輸出結果
-.-word資料-
---
五、數據實驗及結果
通過計算機仿真,得出旅行商問題優化結果和平均距離和最短距離,如圖所
示:
-.-word資料-
---
六、分析與總結
本文設計了一種基于MATLAB實現的蟻算法,用以求解組合優化難題中的
典型代表旅行商問題。對30個城市旅行商問題進行了測試,所得結果能達到優
化作用,實現了本文的研究目標。
經過對旅行商問題的深入理解,得到了能解決問題的基本數學模型,然后設
計算法的基本思想,技術路線,最后編碼。在多次調試,修改后,本算法成功運
行,并實現了最初的設定目標。另外,MATLAB具有豐富的繪圖函數,對于繪圖
十分方便,這是選擇MATLAB解決TSP問題的算法編寫、調試的原因。
蟻算法研究處于初期,還有許多問題值得研究,如算法的參數選擇、螞蟻
數的比例等只能通過仿真實驗,無法給出理論指導。
-.-word資料-
---
附錄:
蟻算法解決旅行商問題MATLAB程序
functionyy=ACATSP
x=[4783987541444]';
y=[948467626499584462696269717876435
50]';
C=[xy];
C_max=50;
m=30;
Alpha=1.5;
Beta=2;
Rho=0.1;
Q=10^6;
%%-------------------------------------------------------------------------
%%主要符號說明
%%Cn個城市的坐標,n×2的矩陣
%%C_max最大迭代次數
%%m螞蟻個數
%%Alpha表征信息素重要程度的參數
%%Beta表征啟發式因子重要程度的參數
%%Rho信息素蒸發系數
%%Q信息素增加強度系數
%%R_best各代最佳路線
%%L_best各代最佳路線的長度
%%=========================================================================
%%第一步:變量初始化
n=size(C,1);%n表示問題的規模(城市個數)
D=zeros(n,n);%D表示完全圖的賦權鄰接矩陣
fori=1:n
forj=1:n
ifi~=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;%i=j時不計算,應該為0,但后面的啟發因子要取倒數,用eps
(浮點相對精度)表示
end
D(j,i)=D(i,j);%對稱矩陣
end
end
-.-word資料-
---
Eta=1./D;%Eta為啟發因子,這里設為距離的倒數
Tau=ones(n,n);%Tau為信息素矩陣
Tabu=zeros(m,n);%存儲并記錄路徑的生成
C=1;%迭代計數器,記錄迭代次數
R_best=zeros(C_max,n);%各代最佳路線
L_best=inf.*ones(C_max,1);%各代最佳路線的長度
L_ave=zeros(C_max,1);%各代路線的平均長度
whileC<=C_max%停止條件之一:達到最大迭代次數,停止
%%第二步:將m只螞蟻放到n個城市上
Randpos=[];%隨即存取
fori=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只螞蟻按概率函數選擇下一座城市,完成各自的周游
forj=2:n%所在城市不計算
fori=1:m
visited=Tabu(i,1:(j-1));%記錄已訪問的城市,避免重復訪問
J=zeros(1,(n-j+1));%待訪問的城市
P=J;%待訪問城市的選擇概率分布
Jc=1;
fork=1:n
iflength(find(visited==k))==0%開始時置0
J(Jc)=k;
Jc=Jc+1;%訪問的城市個數自加1
end
end
%下面計算待選城市的概率分布
fork=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
ifC>=2
Tabu(1,:)=R_best(C-1,:);
end
%%第四步:記錄本次迭代最佳路線
L=zeros(m,1);%開始距離為0,m*1的列向量
-.-word資料-
---
fori=1:m
R=Tabu(i,:);
forj=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(C)=min(L);%最佳距離取最小
pos=find(L==L_best(C));
R_best(C,:)=Tabu(pos(1),:);%此輪迭代后的最佳路線
L_ave(C)=mean(L);%此輪迭代后的平均距離
C=C+1;%迭代繼續
%%第五步:更新信息素
Delta_Tau=zeros(n,n);%開始時信息素為n*n的0矩陣
fori=1:m
forj=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;%考慮信息素揮發,更新后的信息素
%%第六步:禁忌表清零
Tabu=zeros(m,n);%%直到最大迭代次數
end
%%第七步:輸出結果
Pos=find(L_best==min(L_best));%到最佳路徑(非0為真)
Shortest_Route=R_best(Pos(1),:)%最大迭代次數后最佳路徑
Shortest_Length=L_best(Pos(1))%最大迭代次數后最短距離
subplot(1,2,1);%繪制第一個子圖形
DrawRoute(C,Shortest_Route);%畫路線圖的子函數
subplot(1,2,2);%繪制第二個子圖形
plot(L_best);
holdon%保持圖形
plot(L_ave,'r');
title('平均距離和最短距離')%標題
functionDrawRoute(C,R)
%%=========================================================================
%%DrawRoute.m
%%畫路線圖的子函數
%%-------------------------------------------------------------------------
%%CCoordinate節點坐標,由一個×2的矩陣存儲
%%RRoute路線
-.-word資料-
---
%%=========================================================================
=length(R);
scatter(C(:,1),C(:,2));
holdon
plot([C(R(1),1),C(R(),1)],[C(R(1),2),C(R(),2)],'g');
holdon
forii=2:
plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'g');
holdon
end
title('旅行商問題優化結果')
-.-word資料-
本文發布于:2022-08-01 17:12:24,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/falv/fa/82/50995.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
| 留言與評論(共有 0 條評論) |