本文來源於公眾號【程序猿聲】,作者舟寒丶
寫在前面
眾所周知,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編寫更好。不然絞盡腦汁想出的優化方法,還不如別人換種語言效果更好。
所以,小編以后也不會考慮再拓展啟發式算法的python版本了。
還是老老實實學好C++和Java吧!
在公眾號中輸入【PYTSP】不帶【】即可下載相關代碼!