模擬退火、禁忌搜索、迭代局部搜索求解TSP問題Python代碼分享


本文來源於公眾號【程序猿聲】,作者舟寒丶

寫在前面

眾所周知,python是近幾年來最火的語言之一,也因為容易上手、代碼簡潔深受各位剛剛接觸編程的同學的喜愛。小編這學期也有一門python的課程。

然而,公眾號內代碼基本通過C++、Java編寫,很少有python。但是還是有部分童鞋想要python代碼。

還有同學發出疑問:為什么不用python

為了熟悉python,同時本着造-福-人-類的目的,小編特地選取了公眾號內幾個相對簡單的代碼,改編成python,供各位童鞋學習~

做個預告哦,相信看完這期,你就不會想用python寫啟發式算法了

代碼分享

小編這次准備了三段代碼,分別是Tabu Search禁忌搜索算法SA模擬退火算法ILS迭代局部搜索算法求解TSP問題的代碼。

其中禁忌搜索代碼改編自此文代碼,去除了對比所用的GUROBI,保留了純粹的禁忌搜索:

干貨 | 到底是什么算法,能讓人們如此絕望?

SA代碼改編自此文:

【算法進階】用模擬退火(SA, Simulated Annealing)算法解決旅行商問題

ILS代碼改編自此文:

【優化算法】迭代局部搜索算法(Iterated local search)探幽(附C++代碼及注釋)

同時,關於SA、ILS求解TSP的代碼小編也有改編成Java:

模擬退火算法(SA)和迭代局部搜索(ILS)求解TSP的Java代碼分享

在公眾號中輸入【PYTSP】不帶【】即可下載相關代碼!

為什么不用python

公眾號內運籌學相關代碼一直采用C++和Java編寫,沒有用過python。關於這一點,之前也曾提到過:

關於為什么選擇C++和java,而不是Python或者matlab,小編已經解釋很多遍了。那只學C++或者java一門可以嗎?小編之所以建議兩手抓,是因為C++和java都有着非常顯著的優點。

對於C++而言,速度相當快,快到你懷疑人生。可能此時會有讀者有疑問,小編騙人,有時候明明感覺C++慢的離譜。那是因為你IDE的編譯模式用的是debug,編譯也沒有開優化之類的。>對於java而言,最大的優點是兼顧速度和易用性。速度總體上和C++是一個量級的,但終究還是比不過變態的C++。

對於java而言,最大的優點是兼顧速度和易用性。速度總體上和C++是一個量級的,但終究還是比不過變態的C++。

但java用起來非常方便,比如調用cplex,只需要導入一個jar包配置好dll就可以隨心所欲了。而C++又要導入頭了,又要鏈接庫了,對小白而言簡直是噩夢. 而且java一個類一個文件,不像C++一個類有一個頭文件一個CPP文件我真是頭大。

與python相比,運行速度是C++和Java最重要的有點。python的運行速度遠不如C++和Java。

為了對比三種語言的速度,小編特地在修改代碼時保留了代碼的大部分處理方式(雖然由於年代久遠,現在看來有些不太好),對三段內容相同的代碼做了一個小實驗:

語言 C++ Java python
滿意解 11060 11370 11102
時間(秒) 1.0 2.0 39.4
時間(比例) 1 2 39

可以看出,調整編譯模式最快的C++代碼速度最優,Java其次,而python與前者差距巨大。

而運籌學問題,要處理的數據量通常很大,因此用C++或Java編寫更好。不然絞盡腦汁想出的優化方法,還不如別人換種語言效果更好

image

所以,小編以后也不會考慮再拓展啟發式算法的python版本了。

還是老老實實學好C++和Java吧!

在公眾號中輸入【PYTSP】不帶【】即可下載相關代碼!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM