写在前面
众所周知,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代码分享
为什么不用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吧!