基于模拟退火算法的旅行商问题求解.docx
- 文档编号:488038
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:23
- 大小:168.87KB
基于模拟退火算法的旅行商问题求解.docx
《基于模拟退火算法的旅行商问题求解.docx》由会员分享,可在线阅读,更多相关《基于模拟退火算法的旅行商问题求解.docx(23页珍藏版)》请在冰点文库上搜索。
基于模拟退火算法的旅行商问题求解
目录
摘要II
关键词II
AbstractII
KeywordsII
引言1
1旅行商问题和模拟退火算法2
1.1旅行商问题2
1.1.1旅行商问题的描述2
1.1.2旅行商问题的应用3
1.2模拟退火算法3
1.2.1基本思想3
1.2.2关键技术4
1.3小结4
2TSP模拟退火算法的实现5
2.1TSP算法实现5
2.1.1TSP算法描述5
2.1.2TSP算法流程5
2.2TSP的MATLAB实现6
2.2.1加载数据文件6
2.2.2计算总距离的函数7
2.2.3绘制路线的函数7
2.2.4交换城市的函数8
2.2.5执行模拟退火的函数8
2.3小结9
3仿真实例10
3.1仿真分析与评价10
3.2结论12
总结与展望12
致谢13
参考文献13
基于模拟退火算法的旅行商问题求解
光信息科学与技术董铸祥
指导教师张明强
摘要:
旅行商问题是组合优化领域里的一个典型的、易于描述却难以处理的NP难题,其可能的路径数目与城市数目是呈指数型增长的,求解非常困难。
首先介绍了旅行商问题,给出了其数学描述以及实际应用,进而给出解决TSP的一种比较精确的算法——模拟退火算法。
然后阐述了模拟退火算法的基本原理,重点说明了其基本思想及关键技术。
最后运用MATLAB语言实现了该算法,并将其运用到解决旅行商问题的优化之中。
数值仿真的结果表明了该方法能够对数据进行全局寻优,有效克服了基于导数的优化算法容易陷入局部最优的问题。
关键词:
模拟退火旅行商NP组合优化
SolutionofTravellingSalesmanProblemBacedonSimulatedAnnealingAlgorithm
OpticalInformationScienceandTechnologyDongZhuxiang
TutorZhangMingqiang
Abstract:
TravellingSalesmanProblemisoneofthetypicalNP-hardproblemsincombinatorialoptimization,whichiseasytobedescribedbuthardtobesolved.Itspossibleamountsofpathincreaseexponentiallywiththeamountsofcity,soitisverydifficulttosolveit.FirstthispaperintroducesTravellingSalesmanProblem,givesTSPmathematicaldescriptionandpracticalapplication.Inturn,aprecisealgorithm——simulatedannealingalgorithmthetotheaddressofTSPisgiven.Andthenthispaperdescribesthebasicprincipleofsimulatedannealing,highlightsthebasicideasandkeytechnology.Finally,weuseMATLABlanguagetoimplementthealgorithm,andappliedittosolvethetravelingsalesmanproblemintotheoptimization.Numericalsimulationresultsshowthatthismethodcangloballyoptimizesdata,effectivelyovercomestheproblemofderivative-basedoptimizationalgorithmwhichiseasyfallintolocaloptimum.
Keywords:
simulatedannealing;travellingsalesmanproblem;Non-deterministicPolynomial;combinatorialoptimization
引言
旅行商问题(TravelingSalesmanProblem,TSP),也称为货郎担问题,是由爱尔兰数学家SirWilliamRowanHamilton和英国数学家ThomasPenyngtonKirkman在19世纪提出的数学问题,它是指给定n个城市并给出每两个城市之间的距离,旅行商必须以最短路径访问所有的城市一次且仅一次,并回到原出发地,现已证明它属于NP(Non-deterministicPolynomial---非确定多项式)难题[1]。
历史上的第一个正式用来解决TSP问题的算法诞生于1954年,它被用来计算49个城市的TSP问题。
到现在为止,运用目前最先进的计算机技术可解决找出游历24978个城市的TSP问题。
TSP的历史很久,最早的描述是1759年欧拉研究的骑士周游问题,即对于国际象棋棋盘中的64个方格,走访64个方格一次且仅一次,并且最终返回到起始点。
旅行商问题(TSP)由美国RAND公司于1948年引入,该公司的声誉以及线性规划这一新方法的出现使得TSP成为一个知名且流行的问题[2]。
旅行商问题是一个经典的图论问题:
设有n个城市,用Ci,j=1,2,…,n表示。
城市Ci,j之间的距离为di,j,i,j=1,2,…,n,设所有城市间两两连通,旅行商需要跑遍n个城市去推销他的商品,而这些城市之间的距离都不一样,这推销员需要从其中一个城市出发,而他老板规定他必须把所有城市跑一遍,则TSP问题就是寻找让旅行商遍访每个城市一次且恰好一次的一条回路,且要求其路径总长度为最短。
该问题也可以归结为:
有N个城市由公路相互连通,从任一城市到另外城市都要支付相应的费用,一个销售商从其中一城市出发,访问其他N-1个城市且仅一次,如何规划一条路径,使该旅行商的花费最少[3]。
当城市数量较小时,通过枚举法就可以找出最短的路径,然而随着问题规模的增加,很难找到一个多项式时间复杂度的算法来求解该问题。
TSP是一个典型的组合优化问题,是诸多领域内出现的多种复杂问题的集中概括和简化形式,并且已成为各种启发式的搜索、优化算法的间接比较标准。
因此,快速、有效地解决TSP有着重要的理论价值和极高的实际应用价值。
旅行商问题代表的一类组合优化问题,在物流配送、计算机网络、电子地图、交通诱导、电气布线、VLSI单元布局等方面都有重要的工程和理论价值,引起了许多学者的关注。
TSP是典型的组合优化问题,并且是一个NP-hard问题。
TSP描述起来很简单,早期的研究者使用精确算法求解该问题,TSP问题最简单的求解方法是枚举法。
它的解是多维的、多局部极值的、趋于无穷大的复杂解的空间,搜索空间是n个点的所有排列的集合,大小为(n-1)!
。
可以形象地把解空间看成是一个无穷大的丘陵地带,各山峰或山谷的高度即是问题的极值。
求解TSP,则是在此不能穷尽的丘陵地带中攀登以达到山顶或谷底的过程[2]。
常用的方法包括:
分枝定界法、线性规划法和动态规划法等,但可能的路径总数随城市数目n是成指数型增长的,所以当城市数目在100个以上一般很难精确的求出其全局最优解。
随着人工智能的发展,出现了许多独立于问题的智能优化算法,如蚁群算法、遗传算法、模拟退火、禁忌搜索、神经网络、粒子群优化算法、免疫算法等,通过模拟或解释某些自然现象或过程而得以发展,为解决复杂组合优化问题提供了新的思路和方法[4]。
模拟退火算法在迭代搜索过程以Boltzmann分布概率接受目标函数的“劣化解”,具有突出的具有脱离局域最优陷阱的能力,同时具有较强的局部搜索能力,从而可以获取目标函数的全局最优解。
因为模拟退火算法具有高效、通用、灵活的优点,将模拟退火算法引入TSP求解,可以避免在求解过程中陷入TSP的局部最优解[5]。
本文首先介绍传统的TSP问题,先对其进行数学描述,又列举TSP问题的应用。
之后介绍模拟退火算法,主要介绍其基本思想和关键技术,在此基础上将模拟退火的思想引入TSP的求解,设计出TSP的一种模拟退火算法并用MATLAB语言编程予以实现。
1旅行商问题和模拟退火算法
1.1旅行商问题
1.1.1旅行商问题的描述
旅行商问题(TravelingSalesmanProblem,简称TSP)又名货郎担问题,是威廉·哈密尔顿爵士和英国数学家克克曼(T.P.Kirkman)于19世纪初提出的一个数学问题,也是著名的组合优化问题。
问题是这样描述的:
一名商人要到若干城市去推销商品,已知城市个数和各城市间的路程(或旅费),要求找到一条从城市1出发,经过所有城市且每个城市只能访问一次,最后回到城市1的路线,使总的路程(或旅费)最小。
TSP刚提出时,不少人认为这个问题很简单。
后来人们才逐步意识到这个问题只是表述简单,易于为人们所理解,而其计算复杂性却是问题的输入规模的指数函数,属于相当难解的问题。
这个问题数学描述为:
假设有n个城市,并分别编号,给定一个完全无向图G=(V,E),V={1,2,…,n},n>1。
其每一边(i,j)
E有一非负整数耗费Ci,j(即上的权记为Ci,j,i,j
V)。
并设
G的一条巡回路线是经过V中的每个顶点恰好一次的回路。
一条巡回路线的耗费是这条路线上所有边的权值之和。
TSP问题就是要找出G的最小耗费回路。
人们在考虑解决这个问题时,一般首先想到的最原始的一种方法就是:
列出每一条可供选择的路线(即对给定的城市进行排列组合),计算出每条路线的总里程,最后从中选出一条最短的路线。
假设现在给定的4个城市分别为A、B、C和D,各城市之间的耗费为己知数,如图1所示。
我们可以通过一个组合的状态空间图来表示所有的组合,如图
图1-1顶点带权图图1-2TSP问题的解空间树
从图中不难看出,可供选择的路线共有6条,从中很快可以选出一条总耗费最短的路线:
顶点序列为(A,C,B,D,A)。
由此推算,若设城市数目为n时,那么组合路径数则为(n-1)!
。
很显然,当城市数目不多时要找到最短距离的路线并不难,但随着城市数目的不断增大,组合路线数将呈指数级数规律急剧增长,以至达到无法计算的地步,这就是所谓的“组合爆炸问题”。
假设现在城市的数目增为20个,组合路径数则为(20-1)!
≈1.216×1017,如此庞大的组合数目,若计算机以每秒检索1000万条路线的速度计算,也需要花上386年的时间[6]。
1.1.2旅行商问题的应用
TSP是最有代表性的优化组合问题之一,其应用已逐步渗透到各个技术领域和我们的日常生活中。
它一开始是为交通运输而提出的,比如飞机航线安排、送邮件、快递服务、设计校车行进路线等等。
实际上其应用范围扩展到了许多其他领域,如在VLSI芯片设计、电路板布局、机器人控制、车辆选路、物流配送等方面,下面举几个实例。
1.电路板钻孔进度的安排。
机器在电路板上钻孔的调度问题是TSP应用的经典例子,在一电路板上打成百上千个孔,转头在这些孔之间移动,相当于对所有的孔进行一次巡游。
把这个问题转化为TSP,孔相当于城市,转头从一个孔移到另一个孔所耗的时间相当于TSP中的旅费。
2.车辆选路。
一个经典的路由问题是在一个网络上发现从源节点到一个目的节点的最佳交通线路,使与距离成比例的流动费用降低到最小。
这个问题的关键是在交通网络上计算从源节点到目的节点之间的最短路径。
对这个最小费用流动问题进行扩展,就构成TSP问题,在这个问题中,车辆从源点出发访问多个目的地并且最后回到源点。
3.基因测序。
Cnoocdre是一种求解旅行商问题的程序。
美国国家卫生机构的研究人员利用这一程序来进行基因测序。
在这一应用中,DNA片断作为城市,它们之间的相似程度作为城市与城市的距离。
研究人员试图寻找一种可能性最高的连接方式把这些DNA片断合成为整张DNA。
更重要的是,TSP提供了一个研究组合优化问题的理想平台。
很多组合优化问题,比如背包问题、分配问题、车间调度问题,和TSP同属NP-Hard类,它们难度同等,如果其中一个能用多项式确定性算法解决,那么其他所有的NP-Hard类问题也能用多项式确定性算法解决。
很多方法都是从TSP发展起来的,后来推广到其他NP-Hard类问题上去。
1.2模拟退火算法
模拟退火算法由KirkPatrick于1982提出[7],他将退火思想引入到组合优化领域,提出一种求解大规模组合优化问题的方法,对于NP-完全组合优化问题尤其有效。
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其缓慢降温(即退火),使之达到能量最低点。
反之,如果急速降温(即淬火)则不能达到最低点。
加温时,固体内部粒子随温升变为无序状,内能增大,而缓慢降温时粒子渐趋有序,在每个温度上都达到平衡态,最后在常温时达到基态,内能减为最小。
根据Metropolis准则,粒子在温度T时趋于平衡的概率为exp(-E/(kT)),其中E为温度T时的内能
,
E为其改变量,k为Boltzmann常数。
用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:
由初始解i和控制参数初值t开始,对当前解重复产生“新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。
退火过程由冷却进度表(CoolingSchedule)控制,包括控制参数的初值t及其衰减因子a、每个t值时的迭代次数L和停止条件C。
1.2.1基本思想
模拟退火算法可以分解为解空间、目标函数和初始解3部分。
其基本思想是:
(1)初始化:
初始温度T(充分大),初始解状态s(是算法迭代的起点),每个T值的迭代次数L;
(2)对k=1,……,L做第(3)至第6步;
(3)产生新解s′;
(4)计算增量cost=cost(s′)-cost(s),其中cost(s)为评价函数;
(5)若t′
0则接受s′作为新的当前解,否则以概率exp(-t′/T)接受s′作为新的当前解;
(6)如果满足终止条件则输出当前解作为最优解,结束程序。
终止条件通常取为连续若干个新解都没有被接受时终止算法;
(7)T逐渐减少,且T趋于0,然后转第2步运算。
1.2.2关键技术
(1)新解的产生和接受
模拟退火算法新解的产生和接受可分为如下4个步骤:
①由一个函数从当前解产生一个位于解空间的新解。
为便于后续的计算和接受,减少算法耗时,常选择由当前新解经过简单地变换即可产生新解的方法,如对构成新解的全部或部分元素进行置换、互换等。
产生新解的变换方法决定了当前新解的邻域结构,因而对冷却进度表的选取有一定的影响。
②计算与新解所对应的目标函数差。
因为目标函数差仅由变换部分产生,所以目标函数差的计算最好按增量计算。
事实表明,对大多数应用而言,这是计算目标函数差的最快方法。
③判断新解是否被接受。
判断的依据是一个接受准则,最常用的接受准则是Metropo1is准则:
若t′
0则接受S′作为新的当前解S,否则以概率exp(-t′/T)接受S′作为新的当前解S。
④当新解被确定接受时,用新解代替当前解。
这只需将当前解中对应于产生新解时的变换部分予以实现,同时修正目标函数值即可。
此时,当前解实现了一次迭代,可在此基础上开始下一轮试验。
而当新解被判定为舍弃时,则在原当前解的基础上继续下一轮试验。
模拟退火算法与初始值无关,算法求得的解与初始解状态S(是算法迭代的起点)无关;模拟退火算法具有渐近收敛性,已在理论上被证明是一种以概率收敛于全局最优解的全局优化算法;模拟退火算法具有并行性。
(2)参数控制问题
模拟退火算法的应用很广泛,可以求解NP完全问题,但其参数难以控制,其主要问题有以下3点[7]:
①温度T的初始值设置。
温度T的初始值设置是影响模拟退火算法全局搜索性能的重要因素之一。
初始温度高,则搜索到全局最优解的可能性大,但因此要花费大量的计算时间;反之,则可节约计算时间,但全局搜索性能可能受到影响。
实际应用过程中,初始温度一般需要依据实验结果进行若干次调整。
②温度衰减函数的选取。
衰减函数用于控制温度的退火速度,一个常用的函数为:
式中是一个非常接近于1的常数,t为降温的次数。
③马尔可夫链长度L的选取。
通常的原则是:
在衰减参数T的衰减函数已选定的前提下,L的选取应遵循在控制参数的每一取值上都能恢复准平衡的原则。
1.3小结
本章而要的介绍了旅行商问题与模拟退火算法,首先对旅行商问题做了描述并举例其应用,然后介绍了模拟退火算法的来源,重点介绍了模拟退火算法的基本思想和关键技术。
通过本章的分析,使我们理解了模拟退火算法的基本原理并且知道了TSP问题的数学描述,为下面将该算法其应用于旅行商问题做了准备。
2TSP模拟退火算法的实现
TSP是典型的组合优化问题,模拟退火算法是一种随机性解决组合优化方法。
将TSP与模拟退火算法相结合,以实现对其求解。
2.1TSP算法实现
2.1.1TSP算法描述
(1)TSP问题的解空间和初始解
TSP的解空间S是遍访每个城市恰好一次的所有回路,是所有城市排列的集合。
TSP问题的解空间S可表示为{1,2,…,n}的所有排列的集合,即S={(c1,c2,…,cn)|((c1,c2,…,cn)为{1,2,…,n}的排列)},其中每一个排列Si表示遍访n个城市的一个路径,ci=j表示在第i次访问城市j。
模拟退火算法的最优解与初始状态无关,故初始解为随机函数生成一个{1,2,…,n}的随机排列作为S0。
(2)目标函数
TSP问题的目标函数即为访问所有城市的路径总长度,也可称为代价函数:
现在TSP问题的求解就是通过模拟退火算法求出目标函数C(c1,c2,…,cn)的最小值,相应地,s*=(c*1,c*2,…,c*n)即为TSP问题的最优解。
(3)新解产生
新解的产生对问题的求解非常重要。
新解可通过分别或者交替用以下2种方法产生:
①二变换法:
任选序号u,v(设u
v
n),交换u和v之间的访问顺序,若交换前的解为si=(c1,c2,…,cu,…,cv,…,cn),交换后的路径为新路径,即:
si′=(c1,…,cu-1,cv,cv-1,…,cu+1,cu,cv+1,…,cn)
②三变换法:
任选序号u,v和ω(u≤v
ω),将u和v之间的路径插到ω之后访问,若交换前的解为si=(c1,c2,…,cu,…,cv,…,cω,…,cn),交换后的路径为的新路径为:
si′=(c1,…,cu-1,cv+1,…,cω,cu,…,cv,cω+1,…,cn)
(4)目标函数差
计算变换前的解和变换后目标函数的差值:
Δc′=c(si′)-c(si)
(5)Metropolis接受准则
根据目标函数的差值和概率exp(-ΔC′/T)接受si′作为新的当前解si,接受准则:
2.1.2TSP算法流程
根据以上对TSP的算法描述,可以写出用模拟退火算法解TSP问题的流程图2-1所示:
图2-1TSP的模拟退火流程
2.2TSP的MATLAB实现
2.2.1加载数据文件
下面是加载数据文件的一个例子:
functiond=datafile()
cities=[0.6606,0.9695,0.5906,0.2124,0.0398,0.1367,0.9536,0.6091,0.8767,...
0.8148,0.3876,0.7041,0.0213,0.3429,0.7471,0.5449,0.9464,0.1247,0.1636,...
0.8668,;0.9500,0.6740,0.5029,0.8274,0.9697,0.5979,0.2184,0.7148,0.2395,...
0.2867,0.8200,0.3296,0.1649,0.3025,0.8192,0.9392,0.8191,0.4351,0.8646,...
0.6768];
savecities.matcities-V6;
当调用数据文件函数时,包含城市坐标信息的矩阵载入到cities.mat的文件中。
该数据文件的第一列通常是城市数量,之后两列为城市的坐标。
初始化函数,根据直角坐标生成城市距离矩阵。
2.2.2计算总距离的函数
这是一个城市间计算距离的函数,根据给定路径计算该路径对应总路程。
functiond=distance(inputcities)
%DISTANCE
%d=DISTANCE(inputcities)按照要求计算TSP问题中n个城市的距离。
%输入参数有两行和n列,其中n为城市的数目,列为对应城市的坐标。
d=0;
forn=1:
length(inputcities)
ifn==length(inputcities)
d=d+norm(inputcities(:
n)-inputcities(:
1));
else
d=d+norm(inputcities(:
n)-inputcities(:
n+1));
end
end
TSP问题的成本函数是城市之间的距离。
调用此函数将计算n个城市之间的距离。
2.2.3绘制路线的函数
这是一个绘制路线的函数,根据给定的城市坐标生成的城市矩阵绘制城市的坐标,根据给定的路线绘制线路。
functionf=plotcities(inputcities)
%PLOTCITIES
%PLOTCITIES(inputcities)从inputcities参数中绘制城市的位置。
%inputcities参数有两行和n列,其中n为城市的数量。
位置和对称路径都被绘制。
temp_1=plot(inputcities(1,:
),inputcities(2,:
),’b*’);
set(temp_1,’erasemode’,’none’);
temp_2=line(inputcities(1,:
),inputcities(2,:
),’Marker’,’*’);
set(temp_2,’color’,’r’);
x=[inputcities(1,1)inputcities(1,length(inputcities))];
y=[inputcities(2,1)inputcities(2,length(inputcities))];
x1=10*round(max(inputcities(1,:
))/10);
y1=10*round(max(inputcities(2,:
))/10);
ifx1==0
x1=1;
endify1==0
y1=1;
end
axis([0x10y1]);
temp_3=line(x,y);
set(temp_3,’color’,’r’);
dist=distance(inputcities);
distance_print=sprintf(...’T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 模拟 退火 算法 旅行 问题 求解