一、 TSP问题介绍
旅行商问题(Travelingsalesman problem),简称为TSP问题,即在一个具有n个城市的完全图中,旅行者希望进行一次巡回旅行,或经历一次哈密顿回路,可以恰好访问每一个城市一次,并且最终回到出发城市。而这次巡回旅行的总费用为访问各个城市费用的总和,故旅行者同时希望整个行程的费用是最低的,求这个路线的排列策略。
详细介绍见blog:LocalSearch之爬山算法
二、 模拟退火算法介绍
2.1 简介
模拟退火算法(SimulatedAnnealing,简称SA)是基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法是一种对简单爬山算法进行改进的优化策略算法。
2.2 物理退火原理
物理上将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据Metropolis准则,粒子在温度T时趋于平衡的概率为e(-ΔE/(kT)),其中E为温度T时的内能,ΔE为其改变量,k为Boltzmann常数。
2.3 模拟退火原理
模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优[1]。
2.4 模拟退火算法伪代码
【注:i为初始可行解,k为总迭代次数。ck为初始温度参数。Lk为当前温度下迭代次数。】
伪代码含义如下:
1. 初始化参数,赋予i一个初始可行解istart,总迭代次数k赋初始值0,初始温度参数ck赋初始值c0,当前温度下迭代次数Lk赋初始值L0;
2. 循环退火过程,直到满足当前温度接近0或已达到最大迭代次数;
3. 满足循环条件时,即温度不接近于0且没有到达最大迭代次数时;
(1) 在当前解i的邻域Si产生一个新的解j;
(2) 如果新解j优于解i,更新当前解i的值;
(3) 如果新解j劣于解i,根据退火概率决定是否接受当前解;
4. 总迭代次数加一;
5. 根据降温函数,计算当前温度;
6. 直到温度ck接近于0停止循环计算。
三、用模拟退火算法解决TSP问题
3.1 TSP问题(详见前文LocalSearch之爬山算法3.2节)
1)解的表示:对城市进行编号,编号序列表示城市的访问顺序,不同的编号序列即表示TSP问题不同的解。
2)初始解的生成方式:随机生成编号序列
3)邻域算子:swap/insert/2-opt
4)邻居解的选择策略:bestImprove/firstImprove【在SA中,是随机选择当前解的邻居解,无需遍历整个邻域,所以无需考虑邻居解的选择问题。】
3.2 解决思路
1)设置参数:初始温度c0、降温系数alpha、某温度下的迭代次数L0、最大迭代次数maxIter,最低温度MY_EPSILON;
2)设置用于记录的局部变量:当前温度ck,某一温度下当前迭代次数Lk,总迭代次数/降温次数it,Bestsol记录每个温度下的最优解(Bestsol.Cost初始值为无穷大);
3)随机生成一个初始解sol作为当前解,并计算其路径长度Cost;
4)通过算子swap/insert/2opt随机生成当前解的一个邻居解newsol;
5)判断新解是否可以接受;
a) 若新解newsol优于当前解sol,则一定更新当前解sol;
b) 若新解newsol劣于当前解sol,则根据退火概率exp((sol.Cost-newsol.Cost)/ck)判断是否更新当前解;
6)判断是否更新最优解Bestsol;
7)若该温度下迭代次数Lk小于L0,返回第3步;
8)根据降温函数降温,总迭代次数it加一;
9)若温度未降至最低温,且总迭代次数小于最大迭代次数,返回第3步;
若已满足终止条件,则Bestsol为SA算法得到的最优解。
3.3 Matlab代码实现(代码见文末链接)
本文借助Matlab,对TSP问题中经典的Berlin52算例做了分析。参数设定初始温度c0=350,降温系数alpha=0.995,每次温度下迭代次数L0=20,最大总迭代次数maxIter=1000。为保证结果可复现,以rng函数确定随机种子,以下为6种不同初始解情况下,运用2opt/swap/insert三种算子得到的实验结果:
结合实验结果及TSP问题的特征可知,2opt算子更适合TSP问题的求解,通常能够得到质量更好的最终解。
四、实验分析
4.1 降温函数对最终目标值的影响
因作者能力限制且精准结论需要庞大数据支撑,所以本篇实验分析参考其他学者研究的结论进行概述。降温函数对最终目标值的影响根据卢宇婷(2015)实验研究显示[2]降温函数常用类型分别为Tk=Ts/k,Tk=Ts*0.99k以及Tk=Ts /ln(k)。
图1 不同降温函数解的质量对比图
由图1可知,降温函数Tk=Ts/k受初始温度影响较大,而降温函数Tk=Ts*0.99k的解受温度影响比较小,在初始温度足够高的情况下,两种降温函数都可以达到相似的最优解。降温函数Tk=Ts /ln(k)因为一般运行时间较长,很少使用在解决复杂的实际问题中。
4.2 初始温度对最终目标值的影响
图2 Tk=Ts/k的解的质量与运行时间图
图3 Tk=Ts*0.99k的解的质量与运行时间图
由图2可知,降温函数Tk=Ts/k随着初始温度升高,解的质量越来越好,但运行时间随着初始温度直线上升。由图3可知,降温函数Tk=Ts*0.99k在初始温度较低时,解的质量呈现不稳定的状态。随着初始温度升高到一定程度,解的质量逐渐变好,运行时间则随着初始温度升高增速减缓。
4.3 降温系数对最终目标值的影响
图4 降温系数对迭代次数的影响图
根据高尚(2002)研究显示[3],图4的四条曲线的降温系数依次增加。可以看出降温系数越接近于1,模拟退火算法搜索越充分,越有可能找到全局最优解。
五 、小结
5.1 参数确定方法
模拟退火算法是求解组合优化问题的一个有效方法,但算法中各个参数值(初始温度、降温系数、内层循环次数、终止温度等)的选择和设置对运行的结果和效果有较大影响。下面介绍两种确定算法中参数值的方法:
1)预实验
将参数作为变量,在保证其他参数值不变情况下调整单个参数的值,对测试样本在一个参数值下进行多次实验,记录实验结果并计算均值,作为该参数值的实验结果,最后比较得出最优参数组合。
2)运用调参软件【后续将发布blog专门介绍该部分】
Iracepackage[4]:在irace运行的开始,⽤户需要为其配置测试环境,包括测试集、参数空间(也就是参数的取值范围)以及初始参数等,然后irace会使⽤这些配置进⾏迭代计算⽤户的程序,同时⽤户程序必须返回⼀个⽤以评估使用该参数获得效果的好坏,这些都是targetRunner的任务。通过几次迭代,irace最终会得到⼀个相对较好的参数取值反馈给⽤户。
irace运行的基本流程图(运行机制):
irace运行过程会输出每次迭代已经计算出来的合适参数,所有实验完成后,会降序输出三个最优参数结果,即为想要的结果。
5.2 内容总结
本文首先介绍了模拟退火算法(SA)的原理,并结合实例,在Matlab中运用模拟退火算法解决TSP问题,展示了不同参数对于实验结果的影响,并介绍了确定算法参数的方法。
【囿于作者的学术水平,本文的诸多表述或许不够严谨,用途仅限于优化算法入门者的非正式学术交流,不足之处还望各位读者指正。】
参考文献
[1]Gendreau M,Potvin JY. Handbook ofMetaheuristics[M].Switzerland: SpringerNature, 2019.
[2]卢宇婷,林禹攸,彭乔姿,et al.模拟退火算法改进综述及参数探究[J].大学数学,2015,31(06):96-103.
[3]高尚.模拟退火算法中的退货策略研究[J].航空计算技术,2002,(04):20-22+26.
[4]irace官网链接:https://iridia.ulb.ac.be/irace/
相关资料
作者:丁子千 黄可馨
校对:陈慧敏