求解TSP的改进模拟退火算法研究

304 篇文章 189 订阅
13 篇文章 8 订阅

一、理论基础

1、传统模拟退火算法

(1)模拟退火算法基本原理

请参考这里

(2)模拟退火算法模型流程

模拟退火算法模型包括编码方式、目标函数、 冷却进度表、扰动机制、内循环机制、外循环机制等,其中最基础的是编码方式、目标函数和冷却进度表。

<1> 编码方式

求解TSP问题的各种编码中,多数以遍历城市的次序排列进行编码,即整数编码。这种方法简单、自然、容易理解。如城市编号为 [ 3 , 2 , 5 , 4 , 7 , 1 , 6 , 9 , 8 ] [3,2,5,4,7,1,6,9,8] [3,2,5,4,7,1,6,9,8]表示从3号城市出发,经过 2、5、4、7、1、6、9、 8后,最终又回到了城市3。

<2> 目标函数

TSP问题的一个个体为 C = { C ( 1 ) , C ( 2 ) , ⋯   , C ( N ) } C=\{C(1),C(2),\cdots,C(N)\} C={C(1),C(2),,C(N)},其目标函数定义为个体所代表路径确切距离的长度,即 O : f ( C ) = ∑ i = 1 N − 1 d [ C ( i ) , C ( i + 1 ) ] + d [ C ( N ) , C ( 1 ) ] (1) O:f(C)=\sum_{i=1}^{N-1}d[C(i),C(i+1)]+d[C(N),C(1)]\tag{1} O:f(C)=i=1N1d[C(i),C(i+1)]+d[C(N),C(1)](1)其中, C ( i ) C(i) C(i)为路径 C C C的第 i i i个城市, d [ C ( i ) , C ( j ) ] d[C(i),C(j)] d[C(i),C(j)]为两城市间的距离,且 d [ C ( i ) , C ( j ) ] = d [ C ( j ) , C ( i ) ] d[C(i),C(j)]=d[C(j),C(i)] d[C(i),C(j)]=d[C(j),C(i)]。在后面的运行过程中,算法试图使适应度函数 f ( C ) f(C) f(C)最小化并认为使得该函数取得较小值的解为较优解。

<3> 冷却进度表

传统冷却进度表包括初始温度 T 0 T_0 T0、衰减函数 g ( T 0 ) g(T_0) g(T0),以及当前温度 T T T下内循环迭代次数 L L L
初始温度 T 0 T_0 T0针对不同的问题可以有不同的取值方法,一般TSP常用的方法为:随机产生 N N N个个体,分别计算其目标函数值 f ( C k ) , k = 1 , 2 , ⋯   , N f(C^k),k=1,2,\cdots,N f(Ck),k=1,2,,N T 0 T_0 T0有如下两种取值方式: W 1 : T 0 = max ⁡ [ f ( C k ) ] − min ⁡ [ f ( C k ) ] W 2 : T 0 = m a x [ f ( C k ) ] . \begin{aligned}&W1:T_0=\max[f(C^k)]-\min[f(C^k)] \\ &W2:T_0=max[f(C^k)].\end{aligned} W1:T0=max[f(Ck)]min[f(Ck)]W2:T0=max[f(Ck)].温度衰减函数 g ( T 0 ) g(T_0) g(T0)根据不同问题的需要,可以设置不同的衰减速度,常见的有三种: G 1 : g ( T 0 ) = T 0 / ( 1 + i ) ; G 2 : g ( T 0 ) = T 0 / lg ⁡ ( 1 + i ) ; G 3 : g ( T 0 ) = [ l g ( i / T 0 + 1 ) ] − 1 \begin{aligned}&G1:g(T_0)=T_0/(1+i);\\&G2:g(T_0)=T_0/\lg(1+i);\\&G3:g(T_0)=[lg(i/T_0+1)]^{-1}\end{aligned} G1:g(T0)=T0/(1+i);G2:g(T0)=T0/lg(1+i);G3:g(T0)=[lg(i/T0+1)]1当前温度 T T T下内循环迭代次数 L L L通常取常数定值。

<4> 模型流程

模拟退火算法可以分解为解空间、目标函数和初始解三部分。其模型的具体流程如下:
(1)初始化:初始温度 T 0 T_0 T0(充分大),初始解 C C C( C C C表示城市序列,是算法迭代的起点),每个 t t t值的迭代次数 L L L
(2)对 k = 1 , 2 , ⋯   , L k=1,2,\cdots,L k=1,2,,L执行第(3)至第(5)步。
(3)随机产生扰动,得到新解 C ′ C' C
(4)计算增量 Δ f = f ( C ′ ) − f ( C ) \Delta f=f(C')-f(C) Δf=f(C)f(C),其中 f ( C ) f(C) f(C)为目标函数。
(5)若 Δ f < 0 \Delta f<0 Δf<0,则接受新解,否则以概率 p ( Δ f ) = exp ⁡ ( − Δ f / T ) p(\Delta f)=\exp(-\Delta f/T) p(Δf)=exp(Δf/T)接受新解,以概率 1 − p ( Δ f ) 1-p(\Delta f) 1p(Δf)接受原解,并以接受的解作为下一次模拟的初始解。
(6)温度 T T T按一定的规律逐渐减少。
(7)如果满足终止条件则输出当前解作为最优解,结束程序;如果不满足则转第(2)步。

2、改进模拟退火算法

分析SA算法可以发现,虽然SA算法存在有限度地接受劣解、可以跳出局部最优解原理简单、使用灵活、适合求解出优化问题的全局最优或近似全局最优解等优点;但它存在以下三点主要问 题:①退火速度问题。同一温度下的充分搜索是相当必要的,在变量多、目标函数复杂时,为了得到一个好的近似解,温度 T T T需要从一个较大的值开始,并在每一个温度值 T T T执行多次Metropolis算法,迭代运算速度慢。②扰动机制种类繁多,灵活性大,每一种的收敛速度和寻优能力不易估计,选择时难以抉择。③搜索过程中由于执行概率接受环节而遗失当前遇到的最优解。针对以上三个问题,提出以下三点改进。

(1)内循环改进

虽然传统的SA方法设置了内循环,在同一温度值 T T T执行多次Metropolis算法,保证全局搜索能力。但是实践表明,将温度 T T T下执行Metropolis算法的次数设置为定值往往不够灵活,次数过多造成时间的浪费,次数过少则损失解的质量。改进之处即设置采样稳定条件,使得采样次数可以根据当前所得解的情况灵活处理,在保证解质量的前提下,尽量避免时间的浪费。
采样稳定条件定义为:同一温度 T T T下局部解未被提高的次数 L L L。具体操作是在每个温度 T T T开始时设置一个局部解未被提高次数计数器 n u m = 0 num = 0 num=0,然后每执行一次Metropolis算法之后进行判断,如果局部解被提高了就将 n u m num num重新置于0,否则就将 n u m num num加1;这样直到 n u m num num达到上限 L L L时跳出当前温度 T T T的内循环。

(2)扰动机制改进

传统的SA算法选用单一的扰动机制,而且没有证明这种单一的扰动机制就是最优的,因此造成解被改进的可能性不大。改进之处在于提供了6种 扰动机制,给它们以同等机会被采用,这样就增大了解被改进的可能性。扰动机制如图1所示。
在这里插入图片描述

图1 扰动机制示意图

其中M5还有一个变种,即城市子排列双向反序,如图2 所示:
在这里插入图片描述

图2 城市子排序双向反序

(3)记忆功能改进

传统SA算法“依概率接受”思想,使得当前状态可能要比搜索过程中某些中间状态差,在仿真实验中已经发现最终得到的近似最优解有时候比中间经历的最好解差,这样就浪费了搜索时间,影响了搜索效果。为了不损失搜索过程中遇到的当前最优解,并提高搜索效果,加快搜索速度,文章的改进之处在于增加了记忆功能。
记忆功能是指在搜索过程中记住当前最优解,并及时更新使之能记住搜索过程中遇到的最好解,避免了由于执行概率接受环节而遗失当前遇到的 最优解,增加了这种记忆能力的模拟退火算法已成为一种智能化的算法。

(4)改进后的模型流程

在传统SA算法的基础上,加入以上三种改进,实现后的模型流程为如下:
(1)运用公式 W 1 W1 W1 W 2 W2 W2产生初始温度 T 0 T_0 T0,随机产生初始解 C C C,定义记忆器 b e s t = C best = C best=C,定义局部最大无更优解产生次数 L L L、全局最大无更优解产生次数 M M M、局部最优解未更新次数 n u m = 0 num = 0 num=0、全局最优解未更新次数 a i m = 0 aim = 0 aim=0、退火代数 k = 0 k = 0 k=0
(2) k = k + 1 k=k+1 k=k+1,运用公式 G 1 、 G 2 G1、G2 G1G2 G 3 G3 G3更新温度 T k T_k Tk
(3)对个体 C C C以同等概率执行6种扰动机制的一种,产生新解 C ′ C' C
(4)按公式(1)计算增量 Δ f = f ( C ′ ) − f ( C ) \Delta f=f(C')-f(C) Δf=f(C)f(C),如果 Δ f < 0 \Delta f<0 Δf<0,则 C = C ′ , n u m = 0 C=C',num=0 C=C,num=0,转第(7)步。
(5)计算概率值 p ( Δ f ) = exp ⁡ ( − Δ f / T k ) p(\Delta f)=\exp(-\Delta f / T_k) p(Δf)=exp(Δf/Tk),产生伪随机数 r r r,如果 r < p ( Δ f ) r<p(\Delta f) rp(Δf),则 C = C ′ C = C' C=C n u m = n u m + 1 num = num + 1 num=num+1,转第(7)步。
(6) n u m = n u m + 1 num=num+1 num=num+1,转第(7)步。
(7)如果 n u m ≤ L num≤L numL,则转第(3)步,否则转第(8)步。
(8)如果 f ( C ) < f ( b e s t ) f(C)<f(best) f(C)<f(best),则 b e s t = C , a i m = 0 best=C,aim=0 best=C,aim=0,否则 a i m = a i m + 1 aim=aim+1 aim=aim+1
(9)如果 a i m ≤ M aim ≤ M aimM,则转第(2)步,否则以 b e s t best best为最终解输出,算法结束。

二、仿真实验与结果分析

改进SA算法(ISA)设置:采用记忆功能;以公式 W 2 W2 W2确定初始温度 T 0 T_0 T0;温度衰减函数选择公式 G 1 G1 G1;全局最大无更优解产生次数 M = 300 M = 300 M=300;局部最大无更优解产生次数 L = 500 L = 500 L=500;扰动机制为 M 7 M7 M7(同等概率采用6种扰动机制的一种)。传统SA设置:链长 L = 200 L=200 L=200,其余设置与改进SA一样。种群规模 N = 30 N=30 N=30,最大迭代次数 M a x _ I t e r a t i o n = 1000 Max\_Iteration=1000 Max_Iteration=1000,独立运算10次,取平均值。以att48、eil51和eil76数据集为例。

1、att48

图3为计算att48问题的收敛曲线图。
在这里插入图片描述

图3 两种算法计算att48问题的收敛曲线图

图4和图5分别为传统SA算法和改进SA算法计算att48得到的最优路径。
在这里插入图片描述

图4 传统SA算法计算att48得到的最优路径(38160.8755)

在这里插入图片描述

图5 改进SA算法计算att48得到的最优路径(33523.7085)

仿真实验结果显示如下:

数据集:att48
SA:最优值: 38160.8755,最差值:42228.3728,平均值:39863.4797,标准差:1633.3982
改进SA:最优值: 33523.7085,最差值:34655.1337,平均值:34106.2754,标准差:377.044

2、eil51

图6为计算eil51问题的收敛曲线图。
在这里插入图片描述

图6 两种算法计算eil51问题的收敛曲线图

图7和图8分别为传统SA算法和改进SA算法计算eil51得到的最优路径。
在这里插入图片描述

图7 传统SA算法计算eil51得到的最优路径(483.3962)

在这里插入图片描述

图8 改进SA算法计算eil51得到的最优路径(429.4841)

仿真实验结果显示如下:

数据集:eil51
SA:最优值: 483.3962,最差值:530.0365,平均值:504.1775,标准差:14.4904
改进SA:最优值: 429.4841,最差值:447.2196,平均值:439.4177,标准差:5.0037

3、eil76

图9为计算eil76问题的收敛曲线图。
在这里插入图片描述

图9 两种算法计算eil76问题的收敛曲线图

图10和图11分别为传统SA算法和改进SA算法计算eil76得到的最优路径。
在这里插入图片描述

图10 SA算法计算eil76得到的最优路径(673.5709)

在这里插入图片描述
图11 改进SA算法计算eil76得到的最优路径(555.1528)

仿真实验结果显示如下:

数据集:eil76
SA:最优值: 673.5709,最差值:724.3029,平均值:689.8244,标准差:15.7341
改进SA:最优值: 555.1528,最差值:571.5858,平均值:564.9661,标准差:5.552

由以上结果看出改进的SA算法和传统SA算法相比,运算结果不仅平均值有很大改进,而且每10次计算都能够算到最优解,同时结果的方差也相对较小,结果比较稳定,可以说明改进是成功的。

代码下载链接:https://download.csdn.net/download/weixin_43821559/85439166

三、参考文献

[1] 李鼎, 孟杰, 黄生俊, 等. 求解TSP的改进模拟退火算法研究[J]. 科学技术与工程, 2013, 13(25): 7552-7556+7572.

  • 16
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心️升明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值