![482a9da0149d43dc54736bb231ddb966.png](https://i-blog.csdnimg.cn/blog_migrate/cb8158eb8b585159bb3ed441dc37797c.jpeg)
干货 | 变邻域搜索算法(VNS)求解TSP(附C++详细代码及注释)
文章发表于微信公众号【数据魔术师】同名文章干货 | 变邻域搜索算法(VNS)求解TSP(附C++详细代码及注释)mp.weixin.qq.com
![fb27e10fbd34789a00b6e89ad20796d4.png](https://i-blog.csdnimg.cn/blog_migrate/c92af80f61f29e5eadb81928e712a800.jpeg)
上次变邻域搜索的文章发出来以后,看过的小伙伴纷纷叫好。小编大受鼓舞,连夜赶工,完成了手头上的一份关于变邻域搜索算法解TSP问题的代码。今天,就在此给大家双手奉上啦,希望大家能ENJOY哦!
代码说明
本次代码还是基于求解TSP旅行商问题的。至于什么是TSP问题,小编这实在是不想科普啦……
![04158515a3db8b473244018097d68968.png](https://i-blog.csdnimg.cn/blog_migrate/a3b518e32266213c17f9bcb968632139.jpeg)
代码是基于迭代搜索那个代码魔改过来的。其实看了这么多启发式算法解TSP问题的代码。想必各位都有了一个比较清晰的认识,其实呀。之前介绍的模拟退火、遗传算法、迭代搜索和现在的变邻域等等,是十分相似滴。最大的不同在于算法框架的不同而已,像什么扰动啦,邻域动作啦。代码基本是不变的。所以大家可以多联想,多思考,学习就是一个探求事物本质的过程嘛!
至于算法框架什么的概念,大家看我们之前发的关于VNS的推文啦。
干货 | 变邻域搜索算法(Variable Neighborhood Search,VNS)超详细一看就懂mp.weixin.qq.com![a921883e491b01b0d7b92ac3b9ba3210.png](https://i-blog.csdnimg.cn/blog_migrate/bebc5aaf011de37e8ffe85ce506509ab.jpeg)
这里就不做过多介绍了。再次贴一下伪代码。代码是基于伪代码写的。不过本文的代码只做了一个shaking的邻域,vnd的邻域做了两个。这里给大家说明一下。
![00c38a1f21bebb419997f8d519451d70.png](https://i-blog.csdnimg.cn/blog_migrate/cb5058543af67bc4685fdab078d53c75.jpeg)
简要说说算法vnd里面两个邻域使用的算子:
1. two_opt_swap
选定两个点,将这两个点之间的区间反转。直接上图:
![ddcd5d3d44d620c6c7025b975c227316.png](https://i-blog.csdnimg.cn/blog_migrate/663aa5484639086e7f673d4ac6e7306b.jpeg)
two_h_opt_swap
还是要说一下,随机产生两点,塞进新排列头部。其余的按顺序往后逐个塞进去。嗯,来看图片~
![d0969c46ae74d7cfa3ca3dc1eedea5d2.png](https://i-blog.csdnimg.cn/blog_migrate/508ee3a5c73c30e52576f5c42097c793.jpeg)