基于模拟退火算法的TSP算法
基于模拟退火算法的TSP问题研究报告附MATLAB程序
minL(T ) dtiti1
i 1
• 解的邻域:随机产生2个位置,让序列T上对应的 两个位置上的城市顺序对换。
max{ dij | j i, j 1, n} min{dij | j i, j 1, n}
i 1 i 1 n n
4.模拟退火算法求TSP问题
岗位职责三工作总结项目运维项目实施银青高速视频监控东毛隧道停车场项目全面实施ip设置贵州独平高速项目全面实施监控室机柜布线四心得体会在这段时间的学习过程中我对部门很多产品从零学起刚到公司的时候感觉压力很大经过这些时间的认真学习和实际操作调整心态现已完全能融入公司的各项岗位职责和管理制度中
TSP问题的模拟退火算法
3. 参数选取
•
t0
优。
tk+1=α*tk maxstep=maxstep+a
t0太大,计算时间增加;t0太小,会过早陷入局部最
4.模拟退火算法求TSP问题
• 解的表示:用一个访问序列T=(t1,t2,t3…,tn,t1)来表示 经过n个城市的顺序。 • 距离矩阵:D=(dij)是由城市i和城市j之间的距离所 组成的距离矩阵。 n • 数学模型:
如需程序,点击上传者,见“我的文档”。
1. 模拟退火简介
1.1 问题讨论
2. 模拟退火算法步骤 3. 参数选取 4. 模拟退火算法求解TSP问题
1模拟退火简介
• 物理解释:材料中的原子原来会停留在使内能 有局部最小值的位置,加热使能量变大,原子 会离开原来位置,而随机在其他位置中移动。 退火冷却时速度较慢,使得原子有较多可能可 以找到内能比原先更低的位置。 • 统计学解释:我们将热力学的理论套用到统计 学上,将搜寻空间内每一点想像成空气内的分 子;搜寻空间内的每一点,也像空气分子一样 带有“动能”,以表示该点对命题的合适程度。 算法先以搜寻空间内一个任意点作起始:每一 步先选择一个“邻居”,然后再计算从现有位 置到达“邻居”的概率。
用模拟退火方法解决TSP问题
用模拟退火方法解决TSP 问题
一、 退火原理
退火是一种物理过程,金属物体在加热到一定温度后,他的分子状态在状态空间D 中自由运动。
随着温度的降低,这些分子停留在低能量状态的概率逐渐增大,当温度趋进于0时,分子停留在低能量状态的概率趋向于1。
二、
退火原理运用于组合优化问题
组合优化问题
金属物体 解
状态
最优解 能量最低状态
目标函数
能量
三、 模拟退火算法
步骤 1 任选一个初始解i ,初始温度t ,给定降温比例系数α,以及一个纪录最优解的变量bi 和其函数值best=+∞;
步骤2 若1t <,则停止计算,输出最优解best ;否则执行3;
步骤 3 从i 的邻域中随机选择一个j , ()()ij f f j f i ∆=-;若0ij f ∆<,则令
i j =,执行4;否则若exp(/)(0,1)ij f t rand -∆>时,i j =,执行4;否则执行
3;
步骤4 若()f i best <,则bi i =,()best f i =,t t α=,执行2;否则t t α=,执行2; 四、
实验结果和分析
通过五个城市节点的TSP 问题的求解,其城市间的距离矩阵为:
01015621008139158020156132005291550⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭
模拟退火找到的最优路径为A C B D E →→→→,总路程为43;
由实验结果我们发现,对于小规模的TSP 问题,用模拟退火方法找到的解和用禁忌搜索方法找到的解不谋而合,都能够找到很好的解。
用模拟退火算法解决TSP问题
用模拟退火算法解决TSP问题旅行商问题(Traveling Salesman Problem,TSP)是指一个旅行商要在不重复地经过全部的指定城市之后回到起点,所需要走的最短路径长度是多少。
由于TSP问题具有NP难度,因此传统的精确算法要花费大量的计算资源,得到的结果往往也只能是近似最优解。
而模拟退火算法是一种集合随机性和概率思想的启发式方法,可以快速地在解空间中搜索到一个较优的解。
一、模拟退火算法的原理及过程模拟退火算法是一种以概率为基础的全局优化算法,它的基本思想是利用随机性来逃离局部最优解,让搜索过程在解空间中跳跃,最终逐渐接近全局最优解。
模拟退火算法的过程可以分为三个阶段:初始化阶段、搜索阶段和收敛阶段。
初始化阶段:首先需要对问题进行建模,将问题转化为算法可处理的形式。
在TSP问题中,需要建立一个城市间距离矩阵。
然后随机生成一个初始解,通常是一个随机序列,表示旅行商经过城市的顺序。
搜索阶段:对生成的初始解进行扰动,得到一个新的解,并计算新解的目标函数值。
如果新解比原解更优,则直接接受该解。
如果新解比原解更劣,则有一定的概率接受该解,概率随着时间的推移逐渐降低。
收敛阶段:在搜索过程中,随着温度的不断下降,概率接受劣解的概率越来越小,这时算法逐渐收敛到一个局部最优解,也可能是全局最优解。
二、TSP问题的建模及求解TSP问题可以建立一张城市距离矩阵,然后用随机序列来表示旅行商经过城市的顺序。
目标函数可以定义为旅行商经过所有城市的总路径长度。
假设有n个城市,城市之间的距离矩阵为D,表示第i个城市和第j个城市之间的距离。
而旅行商经过城市的顺序可以用一个长度为n的序列{1,2,...,n}来表示,表示旅行商先经过第1个城市,然后是第2个城市,一直到第n个城市,然后再回到原点。
设目前的解序列为s={s1,s2,...,sn},则其总路径长度为:L(s) = ∑i=1n D(si,si+1) + D(sn,1)其中D(si,si+1)表示城市si和si+1之间的距离,D(sn,1)表示最后回到起点的距离。
基于模拟退火算法的TSP研究
本文 是基于模拟 退火算 法的 T P的研 究 ,使 用模拟 退 S 火 算法解 决 T P。了解 T P和模拟 退火算 法 的国内外研 究 S S 现状, 实现模 拟退 火算法 , 并使 该算 法应用 于 T P中 , 终 S 最
个 具有代 表性 的问题 ,它经常被 用来测 试很 多新型算 法 的 性 能, 优化技术 一种成 功的体现 。 是 在优 化算法及 其启发式 搜 索 中, S T P已经成 为 了一种标 准 。研 究 T P 加 深对 T P S, S
算 法的理解 , 我 们继续 学习优化理 论知识有很 大帮助 。 对
解 ; 二 , 针 对 某 些 具 体 问题 , 出 了模 拟 退 火 算 法 的 很 其 是 给
多成功应 用 。事 实上 ,正 是 由于专 家和 学者对 该算 法 的钻 研 ,才使 该算法 从经典 的模拟退火 算法走 到 了今天 的 多样
1 8 ,对 于 3 8座城 市 的 T P问题是 ~个难 题 , 9 0年 1 S 但
是传 统 的动态规 划 、 枝定 界法 、 分 贪婪 法等 方法 , 还是 在 近 些年 的研 究过程 中采用 的各种 智能优 化算法如 : 模拟 退火 、 遗 传算法 、 工神经 网络 、 人 蚁群 算法 等都存在 解 的质量 不 高 或者需要 的时空开销 太大等 问题 圆 。 2 2 模拟 退火算法 的研 究现状 . 在 理论上 ,受到广 大学者 与专家 青睐 的模拟 退火 算法
1 1 意 义 .
pa 3 1 l 8 0的一个次优 解 ,当时使用 了 LnKe g  ̄ 3 i— mih n启 发和 a
路 径 融 合 的变 种 相 结 合 的 方 法 。之 后 , 由 Ke l an在 l Hes u d g
模拟退火算法解决TSP问题
模拟退火算法解决TSP问题本文主要使用模拟退火算法解决旅行商(TSP)问题,并成功的在Matlab中仿真并得到优化结果。
下面的算法程序中有详细的注释以方便大家了解。
1 算法仿真的收敛曲线2 路径规划结果图模拟退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis[1]等人于1953年提出。
1983 年,S. Kirkpatrick 等成功地将退火思想引入到组合优化领域。
它是基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。
模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。
模拟退火算法是一种通用的优化算法,理论上算法具有概率的全局优化性能,目前已在工程中得到了广泛应用,诸如VLSI、生产调度、控制工程、机器学习、神经网络、信号处理等领域。
算法程序:程序分为五部分,下面第一部分是主程序,每个function函数用虚线分开,大家在使用时需要放在不同的.m文件中。
主程序:---------------------------------------------------------------------------------------------------------------------------------- function saclearCityNum=50; %城市个数可分别选30,50,70[dislist,Clist]=tsp(CityNum); %tsp函数中包含城市坐标,dislist是距离矩阵,clist是城市坐标tf=0.01;%最后的温度alpha=0.80;%温度参数L=100*CityNum; %马尔可夫链的长度for i=1:100route=randperm(CityNum);%随机城市序列,即将citynum个城市序列打乱fval0(i)=CalDist(dislist,route);%城市距离之和最优endt0=-(max(fval0)-min(fval0))/log(0.9);%初始温度fval=fval0(100);route_best=route;%最优城市序列fval_best=fval;%城市距离之和最优t=t0;ii=0;%% 搜索开始while t>tf %tf最终温度是while循环的结束条件for i=1:L[fval_after,route_after]=exchange(route,dislist);if fval_after<fvalroute=route_after;fval=fval_after;elseif exp((fval-fval_after)/t)>randroute=route_after;fval=fval_after;endendii=ii+1;drawTSP(Clist,route,fval,ii,0);%作图程序if fval<fval_bestroute_best=route;fval_best=fval;endt=alpha*t;fval_sequence(ii)=fval;enddrawTSP(Clist,route_best,fval_best,ii,1);%作图程序figure(2);plot(1:ii,fval_sequence);%plot the convergence figuretitle('搜索过程');string1=['最短距离',num2str(fval_best)];gtext(string1);end----------------------------------------------------------------------------------------------------------------------------------function [DLn,cityn]=tsp(n)%坐标函数,可根据自己需要修改if n==10city10=[0.4 0.4439;0.2439 0.1463;0.1707 0.2293;0.2293 0.761;0.5171 0.9414;0.8732 0.6536;0.6878 0.5219;0.8488 0.3609;0.6683 0.2536;0.6195 0.2634];%10 cities d'=2.691for i=1:10for j=1:10DL10(i,j)=((city10(i,1)-city10(j,1))^2+(city10(i,2)-city10(j,2))^2)^0.5;endendDLn=DL10;cityn=city10;endif n==30city30=[41 94;37 84;54 67;25 62;7 64;2 99;68 58;71 44;54 62;83 69;64 60;18 54;22 60;83 46;91 38;25 38;24 42;58 69;71 71;74 78;87 76;18 40;13 40;82 7;62 32;58 35;45 21;41 26;44 35;4 50];%30 cities d'=423.741 by D B Fogelfor i=1:30for j=1:30DL30(i,j)=((city30(i,1)-city30(j,1))^2+(city30(i,2)-city30(j,2))^2)^0.5;endendDLn=DL30;cityn=city30;endif n==50city50=[31 32;32 39;40 30;37 69;27 68;37 52;38 46;31 62;30 48;21 47;25 55;16 57;17 63;42 41;17 33;25 32;5 64;8 52;12 42;7 38;5 25; 10 77;45 35;42 57;32 22;27 23;56 37;52 41;49 49;58 48;57 58;39 10;46 10;59 15;51 21;48 28;52 33;58 27;61 33;62 63;20 26;5 6;13 13;21 10;30 15;36 16;62 42;63 69;52 64;43 67];%50 cities d'=427.855 by D B Fogelfor i=1:50for j=1:50DL50(i,j)=((city50(i,1)-city50(j,1))^2+(city50(i,2)-city50(j,2))^2)^0.5; DL50(i,j)=((city50(i,1)-city50(j,1))^2+(city50(i,2)-city50(j,2))^2)^0.5;endendDLn=DL50;cityn=city50;endif n==75city75=[48 21;52 26;55 50;50 50;41 46;51 42;55 45;38 33;33 34;45 35;40 37;50 30;55 34;54 38;26 13;15 5;21 48;29 39;33 44;15 19;16 19;12 17;50 40;22 53;21 36;20 30;26 29;40 20;36 26;62 48;67 41;62 35;65 27;62 24;55 20;35 51;30 50;45 42;21 45;36 6;6 25;11 28;26 59;30 60;22 22;27 24;30 20;35 16;54 10;50 15;44 13;35 60;40 60;40 66;31 76;47 66;50 70;57 72;55 65;2 38;7 43;9 56;15 56;10 70;17 64;55 57;62 57;70 64;64 4;59 5;50 4;60 15;66 14;66 8;43 26];%75 cities d'=549.18 by D B Fogelfor i=1:75for j=1:75DL75(i,j)=((city75(i,1)-city75(j,1))^2+(city75(i,2)-city75(j,2))^2)^0.5; DL75(i,j)=((city75(i,1)-city75(j,1))^2+(city75(i,2)-city75(j,2))^2)^0.5;endendDLn=DL75;cityn=city75;end----------------------------------------------------------------------------------------------------------------------------------function F=CalDist(dislist,s)DistanV=0;n=size(s,2);for i=1:(n-1)DistanV=DistanV+dislist(s(i),s(i+1));endDistanV=DistanV+dislist(s(n),s(1));F=DistanV;-----------------------------------------------------------------------------------function [fval_after,route_after]=exchange(route,d)n=length(d);location1=ceil(n*rand);location2=location1;while location2==location1location2=ceil(n*rand);%the location of two exchanged numberendloc1=min(location1,location2);loc2=max(location1,location2);middle_route=fliplr(route(loc1:loc2));%the part route which has been exchangedroute_after=[route(1:loc1-1) middle_route route(loc2+1:n)];%the after traveling route fval_after=CalDist(d,route_after);end----------------------------------------------------------------------------------function m=drawTSP(Clist,BSF,bsf,p,f)CityNum=size(Clist,1);for i=1:CityNum-1plot([Clist(BSF(i),1),Clist(BSF(i+1),1)],[Clist(BSF(i),2),Clist(BSF(i+1),2)],'ms-', 'LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');hold on;endplot([Clist(BSF(CityNum),1),Clist(BSF(1),1)],[Clist(BSF(CityNum),2),Clist(BSF(1),2) ],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');title([num2str(CityNum),'城市TSP']);if f==0text(5,5,['第 ',int2str(p),' 步',' 最短距离为 ',num2str(bsf)]);elsetext(5,5,['最终搜索结果:最短距离 ',num2str(bsf)]);endhold off;pause(0.05);----------------------------------------------------------------------------------- 结束。
基于并行模拟退火算法的TSP问题求解
郏宣耀:基于并行模拟退火算法的 TSP 问题求解
准则六部分。 从理论上分析,为了使算法最终得到全局最优,应把初始温度设置尽量大,温度下降尽量缓慢。但这导致算法收敛速度 过慢,优化效率降低。实际应用中,通常随机产生一组解,计算其目标函数值的方差作为初始温度。鉴于计算的方便,温度 更新函数一般取指数退温,即 Ti 1 Ti , (0,1) 。为使温度下降不至过快,λ取值一般接近于 1。 状态产生函数的功能是产生一新解,它应尽可能使产生的候选解遍布整个解空间。候选解通常在当前状态的邻域结构内 以一定概率方式产生。其中领域函数与概率方式由问题的性质决定。候选解产生之后若优于当前解则接受其并取代当前解, 若劣于当前解,则由状态接受函数决定是否接受。通常采用 min[1, exp( C / t )] 作为状态接受函数。可见,随着温度的降低, 接受劣解的概率也随之降低以使算法最终收敛到全局最优。 内循环终止准则亦即 Metropolis 抽样稳定准则,它决定当前温度下抽样的次数。理论上每个温度下应使相应的 Markov 链达到平稳概率分布, 但实际应用时显然是无法实现的。 因此, 通常以其它条件代替。 如判断是否达到局部平衡, 控制 Markov 链长等。外循环终止准则即算法终止准则,它决定算法何时结束,理论上要求终止温度趋于 0,但实际上是不实用的。一般 可以设置终止温度的阈值、设置外循环迭代次数、检验系统熵是否稳定等。 基此,模拟退火算法的基本流程可以描述如图 1:
本文首先用一个 20 个城市 TSP 实例进行数值实验, 该 20 个城市的坐标信息如表 1。 文献[8]利用改进遗传算法得到路径 长度为 24.38 的最优解。本文利用多种群并行模拟退火算法运行 20 次,所有 20 次运行中均得到该最优路径,平均 4.218 秒 得到该最优解。 而对该实例使用传统模拟退火算法时平均消耗 6.298 秒才得到最优解, 因此该并行算法显示出了良好的效果。 同时,本文对 35-TSP 实例与 70-TSP 实例分别应用传统模拟退火算法和并行模拟退火算法进行求解,结果如表 2。 表 1 20 个城市的坐标信息 城市序号 表 2 并行 SA 与 SA 算法性能对比
用模拟退火算法求解TSP
经 ,解 可 以表 示 为 f , ., n ,wl .w wl w2, .w } . … , n是 1 , . , ., 2 .n
/ 果 新 路径 长 于 当前 路 径 ,但 ep一 f > / 如 x( r A o r d m(,) ! n a o O1, I J 仍然替换 当前路径
3 .产 生 新 解 S
N C 计算 复杂性 。因此 ,任 何能使该问题的求解得 以简化 P 的方法 ,都将 受到高度 的评价和关注 。 一个最容易想到 的ห้องสมุดไป่ตู้
法是利用排列组合 的方法把所有 的路径都计 算出来 , 并逐一
比较,选 出最小的路径 。虽然该方法在理论上是可行 的,但
路径的个数与城市的个数成指数增长 ,当城 市个数较 大时,
该方法的求解时 间是难 以忍受 的,甚至是不可能完成的 。以
4 .计算增 量 △t C ( ). ( ) = S C S ,其 中 C ( )为 S 评 价函数
每秒 1 亿次 的计算速度来估算 ,如果 T P问题包含 2 S 0个城 市时,求解时间长达 3 0年;如果要处理 3 5 0个城市 ,则求 解 时间更长达 l 1e 6年 。 + 01 如此长 的时间,在实际中完成是
第 3 卷 第 9期 1 21 0 1年 9月
湖 北 广 播 电视 大 掌 掌 报
J u n l f Be Un v ri o r a o Hu i TV i e st y
Vo . 1 No 9 1 , . 3
S pe e. 0 1 1 9 1 0 e t mb r 2 1 , 5  ̄ 6
( 二)模拟退火算法的模型
左 边 的 路 程 l ,、 右 边 的 ・ |J千 -
基于模拟退火算法的TSP问题求解算法研究
基于模拟退火算法的TSP问题求解算法研究旅行商问题(Traveling Salesman Problem,TSP)是运筹学中一个经典的问题,它是一个非常著名的NP难题。
该问题的简化版本就是,给定一些城市和每对城市之间的距离,求解访问每个城市一次且仅一次,并回到起点所需要的最短路径。
这个问题在实际生产和科学研究中具有重要的应用价值,例如供应链物流、电路设计等领域。
由于该问题是NP难问题,传统的精确求解算法在处理较大的实例时会遇到很大的困难。
因此,研究者们通常选择利用启发式算法来求解TSP问题。
其中一种较为经典的启发式算法是模拟退火算法(Simulated Annealing Algorithm,SAA)。
模拟退火算法的基本原理是模拟物质的固化过程,从一个高温状态开始,利用概率方法在状态空间中随机漫步,降低温度,直至固化为止。
在求解TSP问题中,SAA的核心思想是通过迭代寻找更优解,它的求解过程类似于热力学中的退火过程。
SAA解决TSP问题的具体步骤如下:1.建立初始解:随机生成一条回路2.设定初始温度T,以一定的步长降温3.在当前解的邻域内,随机产生一个新解4.计算ΔE = Enew - Eold,其中Enew为新解的目标函数值,Eold为当前解的目标函数值5.当ΔE < 0,接受新解。
当ΔE > 0,计算概率P = exp(-ΔE/T),如果P > rand(0, 1),则接受新解。
6.重复3-5步,直至温度降至指定值在应用SAA求解TSP问题时,邻域搜索空间的大小和搜索速度是需要考虑的两个重要因素。
为了提高算法的效率,改进SAA算法成为了许多研究的重点。
一些常见的SAA改进方法包括:1.使用启发式算子,如2-opt算子和3-opt算子,来生成新解,避免了随机产生新解的盲目性。
2.设置合适的退火迭代次数,可以在短时间内获得较好的解,同时提高搜索速度。
3.采用并行计算的方式,多个线程同时搜索,并将较优解合并,可以进一步提高搜索效率。
基于模拟退火算法的TSP算法
专业综合设计报告课程名称:电子专业综合设计设计名称:基于模拟退火算法的TSP算法姓名:学号:班级:电子0903指导教师:***起止日期:2012.11.1-2012.12.30专业综合设计任务书学生班级:电子0903 学生:学号:20095830设计名称:基于模拟退火算法的TSP算法起止日期:2012.11.1-2012.12.30指导教师专业综合设计学生日志专业综合设计考勤表专业综合设计评语表一设计目的和意义 (5)二设计原理 (5)2.1 模拟退火算法的基本原理 (5)2.2 TSP问题介绍 (6)三详细设计步骤 (8)3.1.算法流程 (8)3.2模拟退火算法实现步骤.................................................................................... 错误!未定义书签。
四设计结果及分析 (9)4.1 MATLAB程序实现及主函数 (9)4.1.1计算距离矩阵 (9)4.1.2 初始解 (10)4.1.3 生成新解 (10)4.1.4 Metropolis 准则函数................................................................................................ (10)4.1.5 画路线轨迹图 (11)4.1.6 输出路径函数 (12)4.1.7 可行解路线长度函数 (12)4.1.8 模拟退火算法的主函数 (13)4.2.仿真结果 (15)五体会 (18)六参考文献 (18)基于模拟退火算法的TSP算法一、设计目的和意义旅行商问题是组合优化领域里的一个典型的、易于描述却难以处理的NP难题,其可能的路径数目与城市数目是呈指数型增长的,求解非常困难。
首先介绍了旅行商问题,给出了其数学描述以及实际应用,进而给出解决TSP的一种比较精确的算法——模拟退火算法。
模拟退火算法解决TSP问题
图 1-1 顶点带权图
图 1-2 TSP 问题的解空间树
1.模拟退火是什么? 首先,让我们看看模拟退火是如何工作的,以及为什么它是善于解决旅行商 问题。模拟退火(Simulated Annealing,简称 monituihuo)是一种通用概率 算法,用来在一个大的搜寻空间内找寻命题的最优解。该算法是源于对热力学 中退火过程的模拟,在某一给定初温下,通过缓慢下降温度参数,使算法能够 在多项式时间内给出一个近似最优解。退火与冶金学上的“退火”相似,而与 冶金学的淬火有很大区别,前者是温度缓慢下降,后者是温度迅速下降。我们 将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子; 分子的能量,就是它本身的动能;而搜寻空间内的每一点,也像空气分子一样 带有“能量”,以表示该点对命题的合适程度。算法先以搜寻空间内一个任意 点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居” 的概率。 2.模拟退火的优点 先来说下爬山算法:爬山算法是一种简单的贪心搜索算法,该算法每次从当 前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。爬 山算法实现很简单, 其主要缺点是会陷入局部最优解,而不一定能搜索到全局最 优解。如图 1-3 所示:假设 C 点为当前解,爬山算法搜索到 A 点这个局部最优解 就会停止搜索, 因为在 A 点无论向那个方向小幅度移动都不能得到更优的解。爬 山法是完完全全的贪心法, 每次都鼠目寸光的选择一个当前最优解,因此只能子信息科学与技术 12-3 班 课题名称: 模拟退火算法解决 TSP 问题 指导教师: 学生姓名: 学 号: 姚 睿
蒋文斌 08123453
(课题设计时间:2015 年 3 月 28 日——2015 年 4 月 13 日) 中国矿业大学计算机学院
用模拟退火算法求解TSP
用模拟退火算法求解TSP
TSP问题(旅行商问题)是一个NP难问题。
模拟退火算法是一种解决复杂问题的启发式优化算法,被广泛应用于求解TSP问题。
下面是使用模拟退火算法求解TSP1650的步骤:
1. 初始化:随机生成一个初始解集,即随机生成一个城市序列,并计算其路径长度。
2. 降温:将系统温度下降,即通过调节温度参数来控制搜索范围,随着时间的推移,温度逐渐下降。
3. 移动:通过移动城市序列来扰动当前解集,得到新的解集。
比如,随机选择两个城市交换其顺序,得到新的城市序列。
4. 计算路径长度:计算新的城市序列的路径长度。
5. 判断是否接受新的解集:按照一定概率接受新的解集,比如如果新解集的路径长度更短,则接受新解集,否则以一定概率接受新解集,以避免陷入局部最优解。
6. 重复以上步骤,直到温度降至最低,或者找到满足要求的解。
7. 输出最优解:得到满足要求的解后,输出路径长度和城市序列。
求解TSP1650很困难,需要大量的计算资源和时间,运行时间可能需要数小时或数天。
模拟退火之TSP问题
(货郎担问题:Travelling Salesman Problem ,简记为TSP) TSP 问题描述如下:设有n 个城市,用数码1, ,n 代表.城市i 和城市j 之间的距离为(,),.1,2,,d i j i j n = .TSP 问题是要找遍访每个域市恰好一次的一条回路,且其路径总长度为最短.求解TSP 的模拟退火算法模型可描述如下: (1)解空间解空间S 是遍访每个城市恰好一次的所有回路,是{1, ,n}的所有循环排列的集合,即11{(,,)/(,,)n n S ππππ= 为(1,2,,)n 的排列}.j i π=表示在第I 次访问第j 个城市,并记11n ππ+=以及初始解可选为(1, ,n) .(2)目标函数目标函数即为访问所有城市的路径总长度或称为代价函数的最小值,即求解12121(,,,)1min(,,,)(,)n nn i i Si f d ππππππππ+∈==∑(6.1.1)其中11n ππ+=. (6.1.1)的求解通过迭代来完成,每一次迭代,需要完成下面三个任务:(3) 产生新解新解一般按照某种规则对序号实现变换得到,下面介绍分别或交替采用的三种变换过程.①2变换法随机生成两个序号,()i j i j <,交换上述序号之间的访问顺序,此时新路径变为11111i j i j i j n ππππππππ-+-+ (6.1.2) ② 3变换法随机生成三个序号,,()i j k i j k <<,将,i j 之间的序号插入到序号k 之后再来访问,对应的新路径为111i k i j k n πππππππ-+ (6.1.3)③ 逆转中间或者逆转两端变换法随机产生两个序号,i j ,若i j <,则对应新的路径为111k k i i n ππππππ-+ (6.1.4)如果是i j >,则对应的新路径为1111j j j i i n πππππππ-+- (6.1.5)也可以采用其他的变换方法,有些变换有独特的优越性,有时也将它们交替使用,得到一种更好方法.(4) 代价函数差设将路径12n πππ 变为新路径12n v v v ,则代价函数差为111[(,)(,)]ni i i i i f d d v v ππ++=∆=-∑(6.1.6)例如,相应于(6.1.2)的代价函数差为11111111((,)(,)(,)))((,)(,)(,)))ni j i j kk k i ni i j j k k k i f d d d d d d ππππππππππππ-+-=+-+-=+∆=++-++∑∑ (6.1.7)特别地,当问题具有对称性时,对应矩阵[(,)]D d i j =为对称矩阵,此时,(,)(,)d i j d j i =,(6.1.7)可以简化为1111((,)(,))((,)(,))i j i j i i j j F d d d d ππππππππ-+-+∆=+-+ (5)接受准则1,0exp{/},0f P f bT f ∆<⎧=⎨-∆∆≥⎩ (6.1.8)为简单计,讨论二维平面上的TSP 问题,其距离矩阵满足对称性以及三角不等式:(,)(,),(,)(,)(,)d i j d j i d i k d k j d i j =+≥ 当退火过程完成以后,由变量形参p 输出的数值即为近似最短路径,而f 为对应的最短路长度。
模拟退火算法解决TSP问题要点
智能优化方法课题报告专业班级:电子信息科学与技术12-3班课题名称:模拟退火算法解决TSP问题指导教师:姚睿学生姓名:蒋文斌学号: 08123453(课题设计时间:2015年3月28日——2015年 4月13日)中国矿业大学计算机学院一、问题描述旅行商问题(Traveling monituihuolesman Problem ,简称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)。
并设1,i j 0{ij X =边(,)在最优线路上, 其他G 的一条巡回路线是经过V 中的每个顶点恰好一次的回路。
一条巡回路线的耗费是这条路线上所有边的权值之和。
TSP 问题就是要找出G 的最小耗费回路。
人们在考虑解决这个问题时,一般首先想到的最原始的一种方法就是:列出每一条可供选择的路线(即对给定的城市进行排列组合),计算出每条路线的总里程,最后从中选出一条最短的路线。
假设现在给定的4个城市分别为A 、B 、C 和D ,各城市之间的耗费为己知数,如图1-1所示。
我们可以通过一个组合的状态空间图来表示所有的组合,如图1-2所示。
(1-1)图1-1 顶点带权图图1-2 TSP问题的解空间树1.模拟退火是什么?首先,让我们看看模拟退火是如何工作的,以及为什么它是善于解决旅行商问题。
模拟退火算法在TSP求解中的应用
模拟退火算法在TSP求解中的应用摘要:模拟退火算法(Simulated Annealing,SA)是一种适合解大规模组合优化问题,特别是解NP完全问题的通用有效近似算法。
它与以往的近似算法相比,具有描述简单、使用灵活、运用广泛、运行效率高等优点,而且特别适合并行计算。
TSP问题即旅行商问题是一个组合优化问题,该问题被证明具有NPC计算复杂性。
因此,研究模拟退化算法的基本原理及其在TSP问题求解中的应用受到高度的关注。
本文首先分析了SA的基本原理,针对TSP问题我们将SA应用到TSP上,并建立了TSP的数学模型,阐述了利用模拟退火算法解TSP 的方法。
最后通过实验证明了模拟退火算法的高效性。
关键词:模拟退火; 组合优化; TSP问题1 引言模拟退火的概念最初是人们为了研究组合优化问题而提出的,用于解决组合优化问题,其原理是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性:通过设定一初始温度和初始状态,伴随温度的不断下降,结合概率突跳特性在解空间中通过邻域函数进行随机搜索,最终得到全局近似最优解。
SA算法在组合优化中取得了很好的效果,能解决传统的优化方法难于解决的许多问题。
SA算法具有较好的全局收敛性和适应性,并隐含着较好的并行性。
SA算法的一些变形方法还表明:利用Metropolis过程并适当地控制温度下降过程的SA算法,在连续变量和混合变量的全局优化问题中具有很强的竞争力。
TSP(Traveling salesman Problem,旅行商问题)是一个组合优化问题。
具有NPC 计算复杂性。
因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。
一个最容易想到的方法是利用排列组合的方法把所有的路径都计算出来,并逐一比较,选出最小的路径。
虽然该方法在理论上是可行的,但路径的个数与城市的个数成指数增长,当城市个数较大时,该方法的求解时间是难以忍受的,甚至是不可能完成的。
以每秒 1 亿次的计算速度来估算,如果 TSP 问题包含 20 个城市时,求解时间长达 350 年;如果要处理 30 个城市,则求解时间更长达 1+10e16 年。
模拟退火算法(SA)求解TSP问题(C语言实现)
模拟退⽕算法(SA)求解TSP问题(C语⾔实现) 这篇⽂章是之前写的智能算法(遗传算法(GA)、粒⼦群算法(PSO))的补充。
其实代码我⽼早之前就写完了,今天恰好重新翻到了,就拿出来给⼤家分享⼀下,也当是回顾与总结了。
⾸先介绍⼀下模拟退⽕算法(SA)。
模拟退⽕算法(simulated annealing,SA)算法最早是由Metropolis等⼈提出的。
其出发点是基于物理中固体物质的退⽕过程与⼀般组合优化问题之间的相似性。
模拟退⽕算法是⼀种通⽤的优化算法,其物理退⽕过程由以下三部分组成: (1)加温过程 (2)等温过程 (3)冷却过程 其中加温过程对应算法设定的初始温度,等温过程对应算法的Metropolis抽样过程,冷却过程对应控制参数的下降。
这⾥能量的变化就是⽬标函数,要得到的最优解就是能量最低状态。
Metropolis准则是SA算法收敛于全局最优解的关键所在,Metropolis准则以⼀定的概率接受恶化解,这样就使得算法可以跳离局部最优解的陷阱。
模拟退⽕算法为求解传统⽅法难以处理的TSP问题提供了⼀个有效的途径和通⽤的处理框架,并逐渐发展成为⼀种迭代⾃适应启发式概率搜索算法。
模拟退⽕算法可以⽤于求解不同的⾮线性问题,对于不可微甚⾄不连续函数的优化,能以较⼤概率求得全局最优解,该算法还具有较强的鲁棒性、全局收敛性、隐含并⾏性以及⼴泛的适应性,对⽬标函数以及约束函数没有任何要求。
SA 算法实现的步骤如下:(下⾯以最⼩化问题为例) (1)初始化:取温度T0⾜够⼤,令T = T0,取任意解S1,确定每个T时的迭代次数,即 Metropolis链长L。
(2)对当前温度T和k=1,2,3,...,L,重复步骤(3)~(6) (3)对当前解S1随机产⽣⼀个扰动得到⼀个新解 S2. (4)计算S2的增量df = f(S2) - f(S1),其中f(S1)为S1的代价函数。
(5)若df < 0,接受S2作为新的当前解,即S1 = S2;否则S2的接受概率为 exp(-df/T),即随机产⽣(0,1)上的均匀分布的随机数rand,若 exp(-df/T)>rand,则接受S2作为新的当前解,S1 = S2;否则保留当前解。
1.1通俗解释matlab之模拟退火求TSP问题
1.初识模拟退火算法说起模拟退火算法,不管哪个地方讲反正都有那么一段历史来源,模拟退火据说就是根据物理学上物质分子在温度较高的时候运动剧烈,很容易从一个转台转到另一个状态,而在温度较低的时候运动缓慢,状态也就基本上固定而不宜发生转变。
明不明白这个具体的物理过程无所谓,理解后面算法流程后就明白了什么是退火降温。
说白了,如果和算法结合起来的话,就是高温的时候问题的解很容易发生改变,从一个解很容易变化到另外的一个解,随着温度的降低,解的这种改变性越来越低。
而在每一次降温的过程中,算法都会记录上在本次温度下的所有改变的解中的优秀解,并传递到下一次的降温过程中。
这样,你想一想,开始解的变化范围很大,并一直在寻找优解,慢慢的变化范围变小,就变成了锁定前一次寻找到的最优解。
其实基本上所有的算法都是这样的一个过程,先广度搜索,在集中寻找等等,不同的是不同的算法他们的搜索速度、搜索的准确率不同而已。
2.我要解决的问题既然是优化算法,那就用它来解决一个常见的问题---旅行商问题,也叫TSP问题。
问题是什么样子的呢,就是随机给你不同的地点,要你每个地点走一次的话,怎么走这个地点的顺序才能使得你走的总路程最短呢,像这类问题最好的验证实例就是邮递员了吧,他会想怎么邮递所有的包裹才能使得他要走的总路线最少吧。
好了下面我随便给出30个不同的点代表不同的位置吧,点的左边都在0~1之间,如下:cities1=[0.6606,0.9695,0.5906,0.2124,0.0398,0.1367,0.9536,0.6091,0.8767,0.8148,0.38 76,0.7041,0.0213,0.3429,0.7471,0.4606,0.7695,0.5006,0.3124,0.0098,0.3637,0.5336,0.2 091,0.4767,0.4148,0.5876,0.6041,0.3213,0.6429,0.7471;0.9500,0.6740,0.5029,0.8274,0.9697,0.5979,0.2184,0.7148,0.2395,0.2867,0.8200,0.329 6,0.1649,0.3025,0.8192,0.6500,0.7420,0.0229,0.7274,0.4697,0.0979,0.2684,0.7948,0.43 95,0.8867,0.3200,0.5296,0.3649,0.7025,0.9192];注意了,这就是30对(x,y)的值,在matlab下画出来就如图所示:plot(cities1(1,:),cities1(2,:),'*')现在问题就是怎么首尾相连这些点才能是他们点之间的距离最小。
模拟退火算法解决TSP问题-代码【范本模板】
模拟退火算法解决TSP问题一、算法说明:模拟退火算法求解TSP问题的流程框图如图所示二、结果分析蓝色字表示输出结果运行时间表示算法复杂度1)数据集一:模式城市数量为5时输入模式城市数量5为了方便查看,数据和结果保存在文件中〈<<<邻接矩阵保存在文件模拟退火算法—随机产生数据.txt 中〈<<<访问顺序保存在文件模拟退火算法-结果数据.txt 中模拟节点个数 5运行时间: 10 ms邻接矩阵0 1 57 20 811 0 59 49 3657 59 0 90 8220 49 90 0 7581 36 82 75 0访问节点顺序3 5 24 12)数据集二:模式城市数量为10时输入模式城市数量10为了方便查看,数据和结果保存在文件中〈<<<邻接矩阵保存在文件模拟退火算法—随机产生数据.txt 中〈<<〈访问顺序保存在文件模拟退火算法-结果数据。
txt 中模拟节点个数 10运行时间: 15 ms邻接矩阵0 1 57 20 81 59 49 36 90 821 0 75 18 86 71 52 31 2 1057 75 0 37 16 17 99 45 13 120 18 37 0 2 38 54 58 61 6181 86 16 2 0 17 67 46 36 759 71 17 38 17 0 61 79 80 5249 52 99 54 67 61 0 31 88 7336 31 45 58 46 79 31 0 96 9390 2 13 61 36 80 88 96 0 5482 10 1 61 7 52 73 93 54 0访问节点顺序1 7 6 10 82 9 4 5 33)数据集三:模式城市数量为20时输入模式城市数量20为了方便查看,数据和结果保存在文件中〈〈〈〈邻接矩阵保存在文件模拟退火算法-随机产生数据.txt 中<〈〈〈访问顺序保存在文件模拟退火算法-结果数据。
模拟退火算法求解TSP问题C++
模拟退火算法求解TSP问题C++预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制模拟退火算法的应用—Travelling Salesman Problem 作为模拟退火算法应用,讨论货郎担问题(Travelling Salesman Problem,简记为TSP):设有n个城市,用数码1,…,n代表。
城市i和城市j之间的距离为d(i,j) i, j=1,…,n.TSP问题是要找遍访每个域市恰好一次的一条回路,且其路径总长度为最短.。
将城市编号及其对应的坐标信息放入TSP.txt文件中,由程序读出,进行模拟退火算法的计算,找到最优解并且保存在.txt文本中,涉及到的TSP.txt文本信息格式如下:主要程序变量定义及其功能函数如下://///////////////////////////////////////////////////////////////// ///////////////////#include#include#include#include#include#include/////////////////////////////////////////////////////////////////// /////////////////////// 模板输出函数templatevoid Print(const T *pData, int nsize){for (int i=0; i<="" p="">{cout << *(pData++) << " ";}cout << endl;}/////////////////////////////////////////////////////////////////// /////////////////////#define TSPN 60 // TSP中的城市数目#define T_CONST 10 // 初始化温度时给定的常数温度#define T_INIT 500 // 初始化温度时给定的初始温度#define R_CONST 0.9 // 初始化温度时给定的常数#define R_MIN 0.05 // 初始化温度时的终止条件#define STEPN 400 // 初始化温度时退火的迭代步数#define K_T 0.9 // 降温时的降温参数#define R_ACCEPT 0.3 // 内循环的接受比率指标#define T_ZERO 0.5 // 零度法中的最小温度// 解状态,根据不同问题设定struct ANSWER{int *pAnswer;double *pData;};/************************************************************** ******** * 函数名称:TSPRead()* 输入参数:*pfile -文件名TSPN* 返回值:double* -指向坐标文件的一维数组* 说明:读取TSP坐标文件*************************************************************** ********/ double* TSPRead(char *pfile){double *pBuf, dData, *pData;pBuf = new double[TSPN*2];if (pBuf == NULL){cout << "分配内存出错!" << endl;exit(1);}memset(pBuf, 0, TSPN*2);// 读文件ifstream infile(pfile, ios::in|ios::nocreate);if (!infile){cout << "不能打开文件" << endl;exit(1);}pData = pBuf;for (int i=0; i<="" p="">{infile >> dData; // 读出城市序号for (int j=0; j<2; j++){if (!(infile >> dData)) break;*(pData++) = dData;}}infile.close();return pBuf;}/********************************************************************** * 函数名称:TSPDistance()* 输入参数:x y -城市序号0开始,*pData -城市坐标数组* 返回值:double -两城市间的距离* 说明:计算两个城市间的距离*************************************************************** ********/ double TSPDistance(int x, int y, const double *pData) {double distance;distance = sqrt((*(pData+x*2) - *(pData+y*2)) * (*(pData+x*2) - *(pData+y*2)) + (*(pData+x*2+1) - *(pData+y*2+1)) * (*(pData+x*2+1) - *(pData+y*2+1)));return distance;}/************************************************************** ******** * 函数名称:TSPDeta()* 输入参数:*pfile -文件名* 返回值:double -最大距离与最小距离的估计值* 说明:计算TSP中的最大距离与最小距离的估计值*************************************************************** ********/ double TSPDeta(char *pfile){double *pFile = TSPRead(pfile);Print(pFile, 2*TSPN);double dTmp, dMax, dMin, dSum;dSum = 0.0;for (int i=0; i<="" p="">{dMax = TSPDistance(i, (i+1)%TSPN, pFile);dMin = TSPDistance(i, (i+1)%TSPN, pFile);for (int j=1; j<="" p="">dTmp = TSPDistance(i, (i+1+j)%TSPN, pFile);if (dTmp > dMax) dMax = dTmp;if (dTmp < dMin) dMin = dTmp;}dSum += dMax - dMin;}delete [] pFile;pFile = NULL;return dSum;}/************************************************************** ******** * 函数名称:Equal()* 输入参数:s0 -源目标解s1 -目的解* 返回值:* 说明:两个解之间的复制*************************************************************** ********/ void Equal(ANSWER s1, ANSWER s0){memcpy(s1.pAnswer, s0.pAnswer, TSPN * sizeof(int));memcpy(s1.pData, s0.pData, TSPN * 2 * sizeof(double));}/************************************************************** ******** * 函数名称:Function()* 输入参数:s0 -解* 返回值:double -解的函数值* 说明:求解的函数值*************************************************************** ********/ double Function(ANSWER s0)double dFunc;dFunc = 0.0;for (int i=0; i<="" p="">{// 距离求和dFunc += TSPDistance(*(s0.pAnswer), *(s0.pAnswer + 1), s0.pData);s0.pAnswer++;}return dFunc;}/************************************************************** ******** * 函数名称:InitAnswer()* 输入参数:pfilename -文件名* 返回值:ANSWER -解* 说明:随机产生一个解*************************************************************** ********/ ANSWER InitAnswer(char *pfilename){ANSWER s0;s0.pData = TSPRead(pfilename);s0.pAnswer = new int[TSPN];if (s0.pAnswer == NULL){cout << "分配内存出错!" << endl;exit(1);}memset(s0.pAnswer, 0, TSPN);int *p, *q, num = 0, nflag = 0;p = s0.pAnswer;while (true){int nRand;nRand = rand() % TSPN;q = s0.pAnswer;while (q < p){if (*(q++) == nRand) { nflag = 1; break; }}if (nflag == 1) { nflag = 0; continue; }*(p++) = nRand;num++;if (num >= TSPN) break;}return s0;}/************************************************************** ******** * 函数名称:FindNextAnswer()* 输入参数:s0 -解* 返回值:ANSWER -解* 说明:在解得邻域找到另一个随机的解*************************************************************** ********/ ANSWER FindNextAnswer(ANSWER s0){ANSWER answer;answer.pAnswer = new int[TSPN];memset(answer.pAnswer, 0, sizeof(int)*TSPN);。
模拟退火算法求解TSP问题 朱健炽
模拟退火算法解决TSP问题班级:信息10-4姓名:朱健炽学号:10124010440指导老师:王世华成绩:问题:通过模拟退火算法解决TSP问题一、问题描述旅行商问题,即TSP问题(Travelling Salesman Problem)是数学领域中著名问题之一。
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
路径的选择目标是要求得的路径路程为所有路径之中的最小值。
图1 TSP问题的示意图二、遍历算法一个最容易想到的方法是利用排列组合的方法把所有的路径都计算出来,并逐一比较,选出最小的路径。
虽然该方法在理论上是可行的,但路径的个数与城市的个数成指数增长,当城市个数较大时,该方法的求解时间是难以忍受的,甚至是不可能完成的。
以每秒1亿次的计算速度来估算,如果TSP问题包含20个城市时,求解时间长达350年;如果要处理30个城市,则求解时间更长达1+10e16年。
如此长的时间,在实际中完成是难以想象的。
三、模拟退火算法模拟退火算法是解决TSP问题的有效方法之一,其最初的思想由Metropolis在1953年提出,Kirkpatrick在1983年成功地将其应用在组合最优化问题中。
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。
用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。
求解TSP的模拟退火算法模型可描述如下:解空间:解空间S是遍访每个城市恰好一次的所有路经,解可以表示为{w1,w2 ,……, wn},w1, ……, wn是1,2,……,n的一个排列,表明w1城市出发,依次经过w2, ……, wn城市,再返回w1城市。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业综合设计报告课程名称:电子专业综合设计设计名称:基于模拟退火算法的TSP算法姓名:学号:班级:电子0903指导教师:朱正为起止日期:2012.11.1-2012.12.30专业综合设计任务书学生班级:电子0903 学生姓名:学号:20095830 设计名称:基于模拟退火算法的TSP算法起止日期:2012.11.1-2012.12.30 指导教师专业综合设计学生日志专业综合设计考勤表专业综合设计评语表一设计目的和意义 (7)二设计原理 (7)2.1 模拟退火算法的基本原理 (5)2.2 TSP问题介绍 (6)三详细设计步骤 (10)3.1.算法流程 (8)3.2模拟退火算法实现步骤................................................................................................. 错误!未定义书签。
四设计结果及分析 (9)4.1 MATLAB程序实现及主函数 (9)4.1.1 计算距离矩阵 (9)4.1.2 初始解 (10)4.1.3 生成新解 (10)4.1.4 Metropolis 准则函数................................................................................................ (10)4.1.5 画路线轨迹图 (11)4.1.6 输出路径函数 (12)4.1.7 可行解路线长度函数 (12)4.1.8 模拟退火算法的主函数 (13)4.2.仿真结果 (15)五体会 (24)六参考文献 (24)基于模拟退火算法的TSP算法一、设计目的和意义旅行商问题是组合优化领域里的一个典型的、易于描述却难以处理的NP难题,其可能的路径数目与城市数目是呈指数型增长的,求解非常困难。
首先介绍了旅行商问题,给出了其数学描述以及实际应用,进而给出解决TSP的一种比较精确的算法——模拟退火算法。
然后阐述了模拟退火算法的基本原理,重点说明了其基本思想及关键技术。
最后运用MATLAB语言实现了该算法,并将其运用到解决旅行商问题的优化之中。
数值仿真的结果表明了该方法能够对数据进行全局寻优,有效克服了基于导数的优化算法容易陷入局部最优的问题。
了解模拟退火算法的TSP算法的基本思路及原理,并应用MATLAB实现仿真,熟练掌握MATLAB的操作方式及应用,能正确书写报告。
二、设计原理2.1 模拟退火算法的基本原理模拟退火算法足2O世纪8O年代初提出的一种基于蒙特卡罗(Mente Carlo)迭代求解策略的启发式随机优化算法。
它通过Metropolis接受准则概率接受劣化解并以此跳出局部最优,通过温度更新函数的退温过程进行趋化式搜索并最终进入全局最优解集。
其出发点是基于物理中固体物质的退火过程与一搬的组合优化问题之间的相似性。
模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成。
(1)加温过程。
其目的是增强粒子的热运动,使其偏离平衡位置。
当温度足够高时,固体将熔为液体,从而消除系统原先存在的非均匀状态。
(2)等温过程。
对于与周围环境交换热量而温度不变的密封系统,系统状态的自发变化总是朝自由能减少的方向进行的,当自由能达到最小时,系统达到平衡状态。
(3)冷却过程。
使粒子热运动减弱,系统能量下降,得到晶体结构。
其中,加热过程对应算法的设定初温,等温过程对应算法的Metropolis 抽样过程,冷却过程对应控制参数的下降。
这里能量的变化就是目标函数,要得到的最优解就是能量最低态。
Metropolis 准则是SA算法收敛于全局最优解的关键所在,Metropolis 准则以一定的概率接受恶化解,这样就使算法跳离局部最优的陷阱。
模拟退火算法为求解传统方法难处理的TSP问题提供了一个有效的途径和通用框架,并逐渐发展成一种迭代自适应启发式概率性搜索算法。
模拟退火算法可以用以求解不同的非线性问题,对不可微甚至不连续的函数优化,能以较大的概率求的全局有化解,该算法还具有较强的鲁棒性、全局收敛性、隐含并行性及广泛的适应性,并且能处理不同类型的优化设计变量(离散的、连续的和混合型的),不需要任何的辅助信息,对目标函数和约束函数没有任何要求。
利用Metropolis 算法并适当的控制温度下降过程,在优化问题中具有很强的竞争力,此设计即为基于模拟退火算法的TSP算法。
SA算法实现过程如下(以最小化问题为例):(1)初始化:取初始温度T0足够大,令T=T0,任取初始解S1,确定每个T时的迭代次数,即Metropolis 链长L。
(2)对当前温度T和k=1,2,……,l,重复步骤(3)~(6)。
(3)对当前S1随机扰动产生一个新解S2。
(4)计算S2的增量df=f(S2)-f(S1)其中f为S1的代价函数。
(5)若df<0 ,则接受S2作为新的当前解,即S1=S2;否则计算S2的接受概率exp (-df/T),即随机产生(0,1)区间上均匀分布的随机数rand,若exp(-df/T)>rand也接受S2作为新的当前解,S1=S2;否则保留当前解S1。
(6)如果满足终止条件Stop,则输出当前解s1为最优解,结束程序。
终止条件Stop 通常为:在连续若干个Metropolis 链中新解s2都没有被接受时终止算法,或是设定结束温度。
否则按衰减函数衰减T 后返回步骤(2)。
以上步骤成为Metropolis 过程。
逐渐降低控制温度,重复Metropolis 过程,直至满足结束准则Stop,求出最优解。
2.2 TSP问题介绍旅行商问题(Traveling Salesman Problem,简称TSP)又名货郎担问题,是威廉·哈密尔顿爵士和英国数学家克克曼(T.P.Kirkman)于19世纪初提出的一个数学问题,也是著名的组合优化问题。
问题是这样描述的:一名商人要到若干城市去推销商品,已知城市个数和各城市间的路程(或旅费),要求找到一条从城市1出发,经过所有城市且每个城市只能访问一次,最后回到城市1的路线,使总的路程(或旅费)最小。
TSP刚提出时,不少人认为这个问题很简单。
后来人们才逐步意识到这个问题只是表述简单,易于为人们所理解,而其计算复杂性却是问题的输入规模的指数函数,属于相当难解的问题。
这个问题数学描述为:假设有n个城市,并分别编号,给定一个完全无向图G=(V,E),V={1,2,…,n},n>1。
其每一边(i,j)∈E有一非负整数耗费C i,j(即上的权记为C i,j,i,j∈V)。
G的一条巡回路线是经过V中的每个顶点恰好一次的回路。
一条巡回路线的耗费是这条路线上所有边的权值之和。
TSP问题就是要找出G的最小耗费回路。
人们在考虑解决这个问题时,一般首先想到的最原始的一种方法就是:列出每一条可供选择的路线(即对给定的城市进行排列组合),计算出每条路线的总里程,最后从中选(1-1)出一条最短的路线。
假设现在给定的4个城市分别为A、B、C和D,各城市之间的耗费为己知数,如图1所示。
我们可以通过一个组合的状态空间图来表示所有的组合,如图图1 顶点带权图图2 TSP问题的解空间树从图中不难看出,可供选择的路线共有6条,从中很快可以选出一条总耗费最短的路线:顶点序列为(A,C,B,D,A)。
由此推算,若设城市数目为n时,那么组合路径数则为(n-1)!。
很显然,当城市数目不多时要找到最短距离的路线并不难,但随着城市数目的不断增大,组合路线数将呈指数级数规律急剧增长,以至达到无法计算的地步,这就是所谓的“组合爆炸问题”。
假设现在城市的数目增为20个,组合路径数则为(20-1)!≈1.216×1017,如此庞大的组合数目,若计算机以每秒检索1000万条路线的速度计算,也需要花上386年的时间[6]。
三、详细设计步骤3.1算法流程模拟退火算法求解流程框图如图1所示。
图3 模拟退火算法求解流程框图3.2模拟退火算法实现步骤如下:(1)控制参数的设置需要设置的主要控制参数有降温速率q、初始温度T0、结束温度T end以及链长L。
(2)初始解对于n个城市TSP问题,得到的解就是对1~n的一个排序,其中每个数字为对应城市的编号,如对10个城市的TSP问题{1,2,3,4,5,6,7,8,9,10},则|1|10|2|4|5|6|8|7|9|3就是一个合法的解,采用产生随机排列的方法产生一个初始解S 。
(3)解变换生成新解通过对当前解S 1进行变换,产生新的路径数组即新解,这里采用的变换是产生随机数的方法来产生将要交换的两个城市,用二邻域变换法产生新的路径,即新的可行解S 2。
例如n=10时,产生两个[1,10]围的随机整数r 1和r 2,确定两个位置,将其对换位置,如r 1=4,r 2=79 5 1 6 3 8 7 10 4 2得到的新解为9 5 1 7 3 8 6 10 4 2(4)Metropolis 准则若路径长度函数为f (S ),新解的路径为f (S 2),路径差为d f =f (S 2)-f (S 1),则Metropolis 准则为 {1,0= exp(),0df P df df T <≥如果df<0,则以概率1接受新路线,否则以概率exp (-df/T )接受新路线。
(5)降温利用降温速率q 进行降温,即T=qT,若T 小于结束温度,则停止迭代输出当前状态,否则继续迭代。
四 、设计结果及分析4.1 MATLAB 程序实现及主函数4.1.1 计算距离矩阵利用给出的N 个城市的坐标,算出N 个城市的两两之间的距离,得到距离矩阵(N ⨯N )。
计算函数为Distance ,得到初始群种。
程序如下4.1.2 初始解初始解的产生直接使用MATLAB自带的函数randperm,如城市格式为N个,则产生初始解:4.1.3 生成新解解变换生成新解函数为NewAnswer,程序代码如下:4.1.4 Metropolis 准则函数Metropolis 准则函数为Metropolis,程序代码如下:4.1.5 画路线轨迹图画出给的路线的轨迹图函数为DrawPath,程序代码如下:4.1.6 输出路径函数将得到的路径输出显示在Command Window 中,函数名为OutputPath。
4.1.7 可行解路线长度函数计算可行解的路线长度函数为PathLength ,程序代码如下:4.1.8 模拟退火算法的主函数模拟退火算法参数设置如表一所列。
表一参数设定主函数代码如下:4.2仿真结果及分析优化前的一个随机路线图如图4所示:图4 总路线距离约为57.00优化以后的最优解路线如下图5:图5该优化路径的总路程近似为30.00,已为最优解。