干货 | 用模拟退火(SA, Simulated Annealing)算法解决旅行商问题

最近这个春节又快到了,虽然说什么有钱没钱回家过年。但也有部分小伙伴早已经备好了盘缠和干粮,准备在这个难得的假期来一场说走就走的旅行了。毕竟世界这么大我想去看看呵……等等,醒醒吧各位

但是,作为21世纪的新一代青年,即使咱穷,梦想还是要有的,对吧。那么,问题来了,如何用最少的钱,环绕中国各大城市走一波?咳咳,今天小编就是为解决此问题而来的。顺带提一波,最近天冷了。小编在这里给大家送上最真切的关心……

内容提要:

*旅行商问题介绍

*模拟退火算法

*旅行商问题的解决

我想用最少的钱环游中国一圈

01. 什么是旅行商问题(TSP)?

TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出。问题描述如下:

有若干个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只在一个城市逗留一次,最后回到出发的城市,问如何事先确定一条最短的线路已保证其旅行的费用最少?

如下图所示:

好啦,是不是跟咱们的旅游问题很像呢?为了解决这个问题,小编又要开一波科普三连了。各位淡定淡定哈。

02. 模拟退火算法

2.1. 什么是模拟退火算法(简介)?

模拟退火算法是一种通用概率演算法,用来在一个大的搜寻空间内找寻命题的最优解。它是基于Monte-Carlo迭代求解策略的一种随机寻优算法。模拟退火算法是解决TSP问题的有效方法之一。

2.2. 模拟退火算法的来源

模拟退火算法来源于固体退火原理。

物理退火: 材料中的原子原来会停留在使内能有局部最小值的位置,加热使能量变大,原子会离开原来位置,而随机在其他位置中移动。退火冷却时速度较慢,使得原子有较多可能可以找到内能比原先更低的位置。

模拟退火: 其原理也和固体退火的原理近似。模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。

2.3. 模拟退火算法思想

在介绍模拟退火算法之前,有必要给大家科普(我也科普得很累啊)一下爬山算法 (Hill Climbing Algorithm)。

爬山算法

爬山算法是一种简单的贪心搜索算法,也可以被称为局部搜索算法(local search algorithm),该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。这种算法思想很单纯,但是也存在一个很大的缺陷。在搜索选择的过程中有可能会陷入局部最优解,而这个局部最优解不一定是全局最优解。比如下面这个问题:

假设A是当前解,爬山算法往前继续搜索,当搜索到B这个局部最优解时就会停止搜索了。因为此时在B点无论是往哪边走都不会得到更优的解了。但是,聪明的同学已经发现了,全局最优解在C点。

模拟退火算法

爬山法是完完全全的贪心法(greedy algorithm),这种贪心是很鼠目寸光的,只把眼光放在局部最优解上,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,只不过与爬山法不同的是,模拟退火算法在搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。

从上图来说,模拟退火算法在搜索到局部最优解B后,会以一定的概率接受向右的移动。也许经过几次这样的不是局部最优的移动后会到达BC之间的峰点D,这样一来便跳出了局部最优解B,继续往右移动就有可能获得全局最优解C。如下图:

关于普通Greedy算法与模拟退火,这里也有一个有趣的比喻:

普通贪心算法:兔子朝着比现在低的地方跳去。它找到了不远处的最低的山谷。但是这座山谷不一定最低的。

模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向低处,也可能踏入平地。但是,它渐渐清醒了并朝最低的方向跳去。

如此一来,大家对模拟退火算法有了一定的认识,但是这还是不够的。对比上面两种算法,对于模拟退火算法我们提到了一个很important的概念--一定的概率,关于这个一定的概率是如何计算的。这里还是参考了固体的物理退火过程。

高能预警:下面的介绍可能有那么一点点难懂,但是耐心仔细看是不成问题的。大家坚持一下哈!

根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:

P(dE) = exp( dE/(kT) )

其中k是一个常数,exp表示自然指数,且dE<0(温度总是降低的)。这条公式指明了:

1) 温度越高,出现一次能量差为dE的降温的概率就越大。

2) 温度越低,则出现降温的概率就越小。又由于dE总是小于0(不然怎么叫退火),因此dE/kT < 0 ,exp(dE/kT)取值是(0,1),那么P(dE)的函数取值范围是(0,1) 。

随着温度T的降低,P(dE)会逐渐降低。我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。也就是说,在用固体退火模拟组合优化问题,将内能E模拟为目标函数值 f,温度T演化成控制参数 t,即得到解组合优化问题的模拟退火演算法:

由初始解 i 和控制参数初值 t 开始,对当前解重复“产生新解→计算目标函数差→接受或丢弃”的迭代,并逐步衰减 t 值,算法终止时的当前解即为所得近似最优解。

因此我们归结起来就是以下几点:

1) 若f( Y(i+1) ) <= f( Y(i) ) (即移动后得到更优解),则总是接受该移动。

2) 若f( Y(i+1) ) > f( Y(i) ) (即移动后的解比当前解要差),则以一定的概率接受移动,而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定)。

相当于上图中,从B移向BC之间的小波峰D时,每次右移(即接受一个更糟糕值)的概率在逐渐降低。如果这个坡特别长,那么很有可能最终我们并不会翻过这个坡。如果它不太长,这很有可能会翻过它,这取决于衰减 t 值的设定。

2.4 模拟退火算法伪代码

相信通过上面的讲解,大家已经对模拟退火算法认识得差不多了。下面我们来看看它的伪代码是怎么实现的。

03. 使用模拟退火算法解决旅行商问题

TSP是经典的NP完全问题。精确的解决TSP的算法的时间复杂度是O(2^N), 其中N是节点的个数 。而使用模拟退火算法则可以快速地获得一条近似最优路径。大体的思路如下:

1) 产生一条新的遍历路径P(i+1),计算路径P(i+1)的长度L( P(i+1) )。

2) 若L(P(i+1)) < L(P(i)),则接受P(i+1)为新的路径否则以模拟退火的那个概率接受P(i+1) ,然后降温。

3) 重复步骤1,2直到满足退出条件。

好了多说无益,下面大家一起看代码吧。代码是以中国31个城市为例跑的。

【代码下载请戳原文链接】

代码运行结果:

04 小结

算法小结

从上面的过程我们可以看出,模拟退火算法是一种随机算法,它有一定的概率能求得全局最优解,但不一定。用模拟退火算法可以较快速地找出问题的近似最优解。

不过,在小编不成熟的眼光看来,人生亦有相似之处。有时候可能放弃眼前短浅的利益,最终才可能获得更好的未来。现在失去的,在未来会以另一种方式归来。

1

END

-The End-

文案 / 邓发珩(大一)

排版 / 邓发珩(大一)

指导老师 / 秦时明岳

如对文中内容有疑问,欢迎交流。PS:部分资料来自网络。

邓发珩(华中科技大学管理学院本科一年级、2638512393@qq.com、个人公众号:程序猿声)

原文发布于微信公众号 - 数据魔术师(gh_39567a079597)

原文发表时间:2018-02-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

最全NLP反作弊攻略,从马蜂窝注水事件说起

10月21日,朋友圈被一篇名为《估值175亿的旅游独角兽,是一座僵尸和水军构成的鬼城?》的文章刷屏。文章作者小声比比指控在线旅游网站马蜂窝存在点评大量造假的情况...

2403
来自专栏AI研习社

李开复让非专业人士也能完全理解深度学习

去年开始,工作中需要做许多有关 AI 科普的事情。很长时间里一直在想,该如何给一个没有 CS 背景的人讲解什么是深度学习,以便让一个非技术的投资人、企业管理者、...

4747
来自专栏数据魔术师

机器学习|刘博士谈机器学习--机器的“是非观”

我开始写这篇公众号的时候已经是凌晨,希望我的头脑还能在写作过程中保持足够的清醒。在前两篇清谈型的文章后(没看过的还是要看一下),今天我终于要进入到机器学习的正题...

1144
来自专栏量子位

如何给非专业人士讲解什么是深度学习?

本文转载自王咏刚微信:半轻人,点击左下角阅读原文,可直达原文链接。 去年开始,工作中需要做许多有关 AI 科普的事情。很长时间里一直在想,该如何给一个没有 CS...

3488
来自专栏机器之心

从Yoav Goldberg与Yann LeCun争论,看当今的深度学习、NLP与arXiv风气

选自Medium、Facebook 机器之心编译 作者:Yoav Goldberg、Yann LeCun 参与:黄小天、吴攀、晏奇 最近,来自以色列 Bar ...

2897
来自专栏机器之心

深度 | Vicarious详解新型图式网络:赋予强化学习泛化能力

选自Vicarious 机器之心编译 近日,人工智能初创公司 Vicarious 在官网了发表了一篇名为《General Game Playing with S...

3877
来自专栏新智元

解密 NIPS2016 论文评议内幕(附 DeepMind 8 篇论文下载)

【新智元导读】备受推崇的顶级会议NIPS预计12月举行,但从4月起议论就没有停,尤其是围绕论文。今天,组织方公开了NIPS 2016论文评议过程,本文就从这届会...

38715
来自专栏计算机视觉战队

视觉的深度学习与网络的构建,训练及测试

已经很久没有更新平台的内容,今天抽空来给大家分享一些关于计算机视觉领域的一个重点,那就是“深度学习”,接下来就来详细聊聊深度学习(为什么要深度学习特征???)...

3588
来自专栏AI科技大本营的专栏

这三个普通程序员,几个月就成功转型AI,他们的经验是...

动辄50万的毕业生年薪,动辄100万起步价的海归AI高级人才,普通员到底应不应该转型AI工程师,普通程序员到底应该如何转型AI工程师? 以下,AI科技大本营精选...

4366
来自专栏机器之心

前沿 | 3D打印的深度神经网络,光速执行AI运算

如今,机器学习无处不在,但多数机器学习系统是隐形的:它们在「黑箱」里优化音频或识别图像中的人脸。但最近 UCLA 的研究人员研发出了一个 3D 打印 AI 分析...

1250

扫码关注云+社区

领取腾讯云代金券