1. 程式人生 > 其它 >c遺傳演算法的終止條件一般_遺傳演算法求解旅行商問題

c遺傳演算法的終止條件一般_遺傳演算法求解旅行商問題

技術標籤:c遺傳演算法的終止條件一般

3fb276d77ab7b3258b5ddccbdad29147.png

導語:旅行商問題(Traveling Saleman Problem,TSP)是比較經典的運籌學優化問題,在離散組合優化中研究較多,具有較為廣泛的工程應用和現實生活背景,如飛機航線的安排、公路網路的建設、物流貨物配送等, 所有這些實際應用問題均可以轉變為 TSP 問題來解決。該問題是在尋求單一旅行商由某一城市出發,經過所有給定的城市之後,最後再回到出發城市的最短路徑,屬於車輛路徑問題(Vehicle Routing Problem,VRP)的一個特例,當1輛貨車由物流中心出發,在滿足載貨量約束及路程約束前提下,依次通過各客戶點,最後返回物流中心,此時該問題就轉化為旅行商問題。該問題規則雖然簡單,但在城市數目增多後可行解的數量呈幾何級增長,出現組合爆炸現象,難以在合理時間內求出精確最優解。本文從最基本的旅行商問題入手,學習如何使用遺傳演算法求解旅行商問題。

1、概述

旅行商問題(Traveling Saleman Problem,TSP)是指單一的旅行商需要到n個城市去推銷商品,要求從某一城市出發,經過n-1個城市,旅行商在途徑的n-1個城市能且僅能經過一次,再回到出發城市,使得旅行商的路程最短。本文以中國知網發表的高引用文章作參考,以旅行商的路徑最短為目標函式,約束條件為:除出發城市外,其餘城市必須經過且只能經過1次。

2、遺傳演算法

遺傳演算法(Genetic Algorithm, GA)是一種較為經典的智慧優化演算法,經大量的研究表明,其在求解離散組合優化問題中有著優異的表現。遺傳演算法的思想為優勝劣汰,通過交叉操作、變異操作獲得多樣性的解,在下一代中保留目標函式最優的解,並通過輪盤賭方式選擇下一代個體,不斷迴圈迭代,從而不斷優化問題的解。遺傳演算法求解旅行商問題的步驟與求解車輛路徑問題相同,僅在解碼操作和計算目標值方面不同,因兩個問題採用的編碼方式相同(染色體均為互不相同的一組整數排列),所以遺傳演算法的交叉操作、變異操作、選擇操作可不發生變化(遺傳操作詳見文章《遺傳演算法》:https://zhuanlan.zhihu.com/p/125779424)。

2.1 編碼

旅行商問題為離散優化問題,根據約束條件除出發城市外,其餘城市必須經過且只能經過1次,採用城市編號的排列作為編碼方式,並預設一組排列的第1個城市為出發城市。例如城市規模為8,根據編碼規則,一組染色體為2-4-1-6-8-3-5-7,表示旅行商從城市2出發,依次經過城市4、1、6、8、3、5、7,最後回到城市2。

2.2 計算目標值

旅行商問題的解為一組遍歷所有城市的路徑,一般我們可以得到各城市的座標(xi,yi)(xj,yj),將其轉換為城市間的距離D:

b9240393fbeddb3edb590baa9b4c51fb.png
%% 計算兩兩城市之間的距離
%輸入 a  各城市的位置座標
%輸出 D  兩兩城市之間的距離
function D=Distanse(a)
row=size(a,1);
D=zeros(row,row);
for i=1:row
    for j=i+1:row
        D(i,j)=((a(i,1),a(j,1))^2+(a(i,2),a(j,2))^2)^0.5;
        D(j,i)=D(i,j);
    end
end

根據編碼方式,目標值等於旅行商行駛路徑上相鄰城市間的距離加上最後到達城市與出發城市間的距離和。該編碼方式下的旅行商路徑均為可行解,且只有1條路徑,因此無須進行解碼操作。

2.3 遺傳操作

遺傳演算法包括三個遺傳操作:交叉、變異、選擇。遺傳操作的設計是遺傳策略的主要組成部分,也是調控和控制進化的重要工具。交叉操作、變異操作主要是根據父代的基因資訊來產生新解,新解中包含了父代的部分資訊,其中交叉操作從單個父代遺傳下來的片段較少,新解的變化程度較大,變異操作從父代遺傳下來的片段較多,新解的變化程度較小,分別對應了遺傳演算法的廣度搜索和深度搜索策略,通過交叉概率和變異概率來達到廣度搜索與深度搜索的平衡,既能搜尋到較優的區域性最優解,又能以一定概率跳出區域性最優解;選擇操作則是根據目標值大小來判斷解的優劣,在最小化優化問題中,目標值較小的解更加優秀,根據選擇操作從種群中淘汰掉較劣的解,並挑選優秀的解作為下一代的種群。

2.4 演算法驗證

採用 Matlab 2010b編寫求解 TSP 問題的遺傳演算法,並選用 TSPLIB測試庫例項dantzig42進行測試,該例項中的城市數量為42個,要求規劃旅行商的城市路線,最後回到出發城市,使旅行商行駛路程最短。

首先在遺傳演算法中載入問題資料,並設定遺傳演算法的引數,通過GA_TSP求得最優解【8,3,4,7,6,5,2,1,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,21,20,19,18,15,14,13,16,17,22,23,12,11,24,27,26,25,10,9,8】。GA_TSP求解例項dantzig42的最短距離為【691.5183】,TSPLIB測試庫提供的最短距離為【699】,本文演算法求得了比測試庫提供的更優的解,驗證了演算法的正確性。

9746b497f4f784e97cbfcd8392ca5798.png
圖1:旅行商路程優化迭代圖

5e88b0a4afa6677bedbd4cdfa315afe1.png
圖2:最優解對應的旅行商軌跡圖

本文采用matlab實現了求解旅行商問題的遺傳演算法,因時間和精力有限,該演算法還有很大的進步空間,比如可以採用多種交叉、變異操作來提高解的質量,可以優化演算法結構,縮短執行時間,在大規模問題上的求解質量還有待提高。【以上內容僅供交流,於2020年4月29日

如有疑問請及時交流,後面我也會將大家的疑問整理出來,或者有更好的建議也請提給我,最後謝謝大家閱讀。歡迎大家關注公眾號:【智慧優化演算法】,也是希望能有一個平臺分享優化演算法,希望能得到大家的關注。有問題及時私信我,我儘可能及時回覆,謝謝大家。

附錄:

1、【遺傳演算法求解車輛路徑問題】

https://zhuanlan.zhihu.com/p/125779424

2、TSPLIB測試庫

詳見公眾號【智慧優化演算法】的同名文章。