求解货郎担问题的认识和实践
TSP问题求解实验报告

TSP问题求解(一)实验目的熟悉和掌握遗传算法的原理,流程和编码策略,并利用遗传求解函数优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。
(二)实验原理巡回旅行商问题给定一组n个城市和俩俩之间的直达距离,寻找一条闭合的旅程,使得每个城市刚好经过一次且总的旅行距离最短。
TSP问题也称为货郎担问题,是一个古老的问题。
最早可以追溯到1759年Euler提出的骑士旅行的问题。
1948年,由美国兰德公司推动,TSP成为近代组合优化领域的典型难题。
TSP是一个具有广泛的应用背景和重要理论价值的组合优化问题。
近年来,有很多解决该问题的较为有效的算法不断被推出,例如Hopfield神经网络方法,模拟退火方法以及遗传算法方法等。
TSP搜索空间随着城市数n的增加而增大,所有的旅程路线组合数为(n-1)!/2。
在如此庞大的搜索空间中寻求最优解,对于常规方法和现有的计算工具而言,存在着诸多计算困难。
借助遗传算法的搜索能力解决TSP问题,是很自然的想法。
基本遗传算法可定义为一个8元组:(SGA)=(C,E,P0,M,Φ,Г,Ψ,Τ)C ——个体的编码方法,SGA使用固定长度二进制符号串编码方法;E ——个体的适应度评价函数;P0——初始群体;M ——群体大小,一般取20—100;Ф——选择算子,SGA使用比例算子;Г——交叉算子,SGA使用单点交叉算子;Ψ——变异算子,SGA使用基本位变异算子;Т——算法终止条件,一般终止进化代数为100—500;问题的表示对于一个实际的待优化问题,首先需要将其表示为适合于遗传算法操作的形式。
用遗传算法解决TSP,一个旅程很自然的表示为n个城市的排列,但基于二进制编码的交叉和变异操作不能适用。
路径表示是表示旅程对应的基因编码的最自然,最简单的表示方法。
它在编码,解码,存储过程中相对容易理解和实现。
例如:旅程(5-1-7-8-9-4-6-2-3)可以直接表示为(5 1 7 8 9 4 6 2 3)(三)实验内容N>=8。
TSP实验报告

TSP实验报告(实验报告、研究报告)考核科⽬:算法分析与复杂性理论学⽣所在学院:计算机科学与技术学院学⽣所在学科:计算机应⽤技术姓名:学号:学⽣类别:研究⽣⼀、实验⽬的1.通过TSP算法的具体实现,加深对算法复杂分析的理解。
2.通过TSP算法的具体实现,提⾼对NP完全问题的认识。
3.通过TSP算法的具体实现,理解不确定性算法。
4.通过TSP算法的具体实现,理解不确定性算法。
⼆、实验环境实验平台:Visual C++编程语⾔:C++编程电脑配置:三、实验内容描述TSP(Travelling Salesman Problem)⼜称货郎担或巡回售货员问题,在运筹学、管理科学及⼯程实际中具有⼴泛的⽤途。
及⼯程实际中具有⼴泛的⽤途。
TSP问题是组合优化中的著名难题,⼀直受到⼈们的极⼤关注。
由于其NP难题性质,⾄今尚未完全解决。
此问题可以抽象描述为:给出⼀个n个顶点⽹络(有向或⽆向),要求找出⼀个包含所有n个顶点的具有最⼩耗费的环路。
其中,任何⼀个包含所有n个顶点的环路被称作⼀个旅⾏。
对于旅⾏商问题,顶点表⽰旅⾏商所要旅⾏的城市(包括起点)。
边上权值给出了在两个城市旅⾏所需的路程。
旅⾏表⽰当旅⾏商游览了所有城市后再回到出发点时所⾛的路线。
四、实验原理许多研究表明,应⽤蚁群优化算法求解TSP问题优于模拟退⽕法、遗传算法、神经⽹络算法、禁忌算法等多种优化⽅法。
为说明该算法,引⼈如下的标记: m表⽰蚁群中蚂蚁的数量;表⽰城市i和城市j之间的距离;表⽰t时刻位于城市i的蚂蚁数,显然应满⾜,表⽰t时刻在ij连线上的信息数量。
在算法的初始时刻,将m只蚂蚁随机地放到n座城市上,此时各路径上的信息量相等,设。
每只蚂蚁根据路径上保留的信息量独⽴地选择下⼀个城市。
在时刻t,蚂蚁k从城市i转移到城市j 的概率为其中,表⽰蚂蚁⾛下⼀步允许选择的所有城市,列表纪录了当前蚂蚁k所⾛过的城市,当所有n个城市都加⼊到中时,蚂蚁k便完成了⼀次循环,此时蚂蚁⾛所⾛过的路径便是问题的⼀个解。
求解货郎担问题的量子进化算法

( 甘肃民族师范学院计算机科学系
.
甘肃 合作 7 4 7 0 0 0 )
摘 要
货 郎担 问题属于 N P完全 问题 , 对 它的近似求解方法 主要是智 能算法及线性规划 , 但其 中的基本量 子进 化算法 易陷于局
.
部最优解。为此 , 提 出一种新 的量子进化算法 , 结合 乡村货 郎运输 问题 , 对算法进行测试 。结果表 明, 该 算法在全 局寻优 能力及 种群
0 引 言 Biblioteka 传统 的“ 货郎担” 问题 属于典 型的 N P完全 问题 , 最早 由德
国著名数 学家卡尔 ・ 门格 尔 ( K . Me n g e r ) 于1 9 3 2年提 出。对 该 问题的基 本描述是 : 某售货员要到若 干个 村庄售 货 , 各村 庄之 间的路程 是已知的 , 售货员从他所在的商 店 ( 始 发地 ) 出发 , 到 各村庄售货一次然后返回商店 ( 原地 ) , 为 了提 高效率 ,求 出他
E x p e i r me n t l a r e s u l t d e mo n s t r a t e s t h a t t h e n e w a l g o r i t h m i s i mp r o v e d i n p o p u l a t i o n d i v e r s i t y a n d g l o b a l s e a r c h c a p a c i t y c o mp a r e d w i t h t h e c o n — v e n t i o n a l lg a o r i t h ms ,a n d i s e f f e c t i v e i n s o l v i n g t h e T S P.
货郎问题

int main()
{
int i, j, k;
while(scanf("%d", &n) && n)
{
for(i = 1; i <= n; i++)
scanf("%d", d + i);
for(i = 0; i <= n; i++)
for(ห้องสมุดไป่ตู้ = 0; j <= n; j++)
{
ans = Min(ans, dp[n][i] + abs(d[i] - d[n]));
}
printf("%d\n", ans);
}
}
#include <stdio.h>
#include <stdlib.h>
const int inf = 1000000000;
int n;
int d[128];
int dp[128][128];
int Min(int a, int b)
{
return a < b ? a : b;
dp[i][j] = inf;
dp[0][0] = dp[1][0] = 0;
for(i = 2; i <= n; i++)
{
for(j = i - 1; j >= 0; j--)
dp[i][i - 1] = Min(dp[i][i - 1], dp[i - 1][j] + (j == 0 ? 0 : abs(d[j] - d[i])));
挑担游戏中的纠结

龙源期刊网 挑担游戏中的纠结作者:来源:《幼儿教育·教育教学版》2019年第10期一天,中班幼儿饶有兴致地聊起了在古镇游玩时看到的挑着担的货郎,他们还拿管子積木搭了一根“扁担”扛在肩上模仿了一番。
我想,如果设计一种挑担的游戏材料,幼儿一定会很喜欢玩的。
为此,我收集了大大小小多个饮料瓶、油壶,装满水,在瓶口或壶口系上绳子作为拎环,又找来竹竿,组合成了挑担的游戏材料,投放到户外运动区。
我设想,幼儿可以根据自己的能力将不同大小的饮料瓶或油壶挂到竹竿两头,尝试保持平衡并负重行走。
这不但可以发展幼儿的平衡能力,而且可以锻炼幼儿的体能。
同时,为了让幼儿自主探索,我没有演示玩法,而是告诉幼儿想怎么玩就怎么玩。
材料投放之后,幼儿果然很有兴趣,都来尝试挑担,还自发地加入了一些角色游戏情节。
他们往往从小一点的饮料瓶开始尝试,逐渐增加重量,挑战自己,有时还把大号油壶挂在竹竿中间,与同伴合作抬水。
当然,也有不少幼儿自创了新的玩法,比如,拿来练举重,或把竹竿架在两个瓶子上模拟跨栏、跳高等。
在此过程中,我也不断完善材料的设计,使之更适合幼儿使用。
比如,我把竹竿两头用布包起来拿绳子扎紧,以增加摩擦力,使瓶子或油壶的拎环没那么容易滑脱;我提供毛巾让幼儿挑担时垫在肩膀上,以免竹竿太硬、担子太沉弄疼幼儿。
过了一段时间,幼儿对这一材料的兴趣渐渐淡了下来,玩的人也越来越少了。
有一天,我看到冬冬挑着两瓶水到了小花园,然后拧开瓶盖把水倒在地上,说:“我把水运过来给大树浇浇水。
”我受到了启发:如果在挑担游戏中增加一些运水之类的任务情境,会不会让幼儿重新对游戏产生兴趣呢?考虑到户外场地上取水不太方便,我请保育员拿大水桶装上水,搬到场地边。
我又提供了水瓢和漏斗等,幼儿可以利用这些工具把水灌到瓶子、油壶里,然后挑到花园边上。
为了避免幼儿浇水过多把植物浇死,我在小花园边上也放置了一个大水桶,只让幼儿把水运过来倒进桶里,这样水就能循环利用,避免浪费。
动态规划求解TSP问题

f5(i, )=min{Cij+f6(1, )}=Ci1, d5(i, 1), i=2, 3, 4, 5 f5(i, )的值列表如下:
1
i 2
f5(i, ) 2
5 3
5 1 2 7
2
2 3 3
3
4 5
7
2 5
6
4 4
5
7
对于k=4, 有
f4(i, S4)=min{Cij+f5(j, S5)}, jS4, f4(i, S4。并且有 xn=(i, ), i=2, 3, …, n,
xn+1=(1, )
4
动态规划模型构造
决策变量:dk=(i, j), 其中i为当前所在的城市, j为下一站将要到达的城市。 状态转移方程:若当前的状态为 xk=(i, Sk) 采取的决策为 dk=(i, j) 则下一步到达的状态为 xk+1=T(xk, dk)=(j , Sk\{j})
9
(i, S3) (2, {3, 4}) (2, {3, 5})
J {3} {4} {3} {5}
Cij 3 5 3 1
S4 {4} {3} {5} {3}
Cij+f4(j, S4) 3+f4(3, {4})=3+6=9* 5+f4(4, {3})=5+11=16 3+f4(3, {5})=3+11=14* 1+f4(5, {3})=1+13=14*
(1, S1) (1, {2, 3, 4, 5})
J {2} {3} {4} {5}
Cij 2 7 2 5
S2 {3, 4, 5} {2, 4, 5} {2, 3, 5} {2, 3, 4}
TSP问题分析
太 原
南 昌
呼 和 浩 特
最短路程路线
为了得到任意两城市之间的路程,需 要34个城市的地理坐标,经纬度;
得到了,经纬度,知道了地球半径, 通过球面距离公式:
Dis(i,j)=2Rarcsin{sin[ Lat(i) Lat( j)]2 2
+sin[
Lon(i)
Lon(
j)
]2
1
cos[Lat(j)cos(Lat(j))]}2
5.End Do 6. 输出当前最优解,计算结束
1)产生一个初始路径X=randperm(34)
23 14 ........ 19 18 34 26 1;
2)计算初始路径总长D(X);
3)设置始末温度T0,Te ,降温率Decay; 4)对初始路径经行局部扰动,得到新路径Xn ,
计算D(Xn); 5)T=T0 * Decay Te ,如果T<= Te ,继续循环,
2
算出任意两个城市之间的球面距离
最经济路线
价格来源: ,中国票价网 价格组合: 全部乘火车、全部乘飞机、火车飞机两种混 合
模型的假设
假设两个城市间的旅行距离就为两个目标点 的球面距离; 假设选最短路线时,在前一阶段决策路线时 不受下一阶 段距离的影响,两者相互独立; 假设交通工具的票价在周先生旅行的近三个 月间保持不变。
LINGO求解:
决策变量是 xij 0 或1(0表示不连接,1表示连接)
目标函数与约束条件:
min s
D1(i , j ) xij
i , jV
xij 1
jV
s.t
xij 1iVຫໍສະໝຸດ (i V ), (i V ),
xi
,
旅行商问题——模拟退火算法实现
旅⾏商问题——模拟退⽕算法实现1.问题描述旅⾏商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设有n个城市和距离矩阵D=[d ij],其中d ij表⽰城市i到城市j的距离(i,j=1,2 … n),则问题是要找出遍访每个城市恰好⼀次的⼀条回路并使其路径长度为最短。
2.算法设计对原问题进⾏分析,TSP的⼀个解可表述为⼀个循环排列:Π= (Π1,Π2,Π3… Πn),即Π1→Π2→ … →Πn→Π1有(n-1)!/2 种不同⽅案,若使⽤穷举法,当n很⼤时计算量是不可接受的。
旅⾏商问题综合了⼀⼤类组合优化问题的典型特征,属于NP 难题,不能在多项式时间内进⾏检验。
若使⽤动态规划的⽅法时间复杂性和空间复杂性都保持为n的指数函数。
本次实验利⽤模拟退⽕算法(Simulated Annealing)求解TSP问题。
模拟退⽕算法最早由N.Metropolis等⼈于1953年提出,基于物理中固体物质的退⽕过程与⼀般组合优化问题之间的相似性。
该算法从某⼀较⾼初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间随机寻找全局最优解。
退⽕是将固体加热到⾜够⾼的温度,使分⼦呈随机排列态,然后逐步降温冷却,最后分⼦以低能状态排列,得到稳定状态的固体。
退⽕的过程有:(1)加温过程:增强粒⼦运动,消除系统原本可能存在的⾮均匀态;(2)等温过程:对于与环境换热⽽温度不变的封闭系统,系统状态的⾃发变化总是朝向⾃由能减少的⽅向进⾏,当⾃由能达到最⼩时,系统平衡;(3)冷却过程:使粒⼦热运动减弱并逐渐趋于有序,系统能量逐渐下降,从⽽得到低能的晶体结构。
其中,固体在恒温下达到热平衡的过程采⽤Metropolis⽅法进⾏模拟:温度恒定为T时,当前状态i转为新状态j,如果j状态的能量⼩于i,则接受状态j为当前状态;否则,如果概率p=exp{-(E j-E i)/(k*T)}⼤于[0,1)区间的随机数,则仍接受状态j为当前状态;若不成⽴则保留状态i为当前状态。
货郎担问题
以一个例题来加以说明
设有5个工件需要在机床A,B上加工,加工的顺序是先A后 B,每个工件所需加工时间(单位:小时) 如下表. 问如何安 排加工顺序可使机床连续加工完所有的加工总时间最少?
机床 加工时间 工件号码
A 3 7 4 5
B 6 2 7 3
1 2 3 4
5
7
4
(2) 在工时矩阵M中找到最小的元素(若最 小的不止一个,可任选其一);若它在上行, 则将相应的工件排在最前面的位置;若它在 下行,则将相应的工件排在最后面的位置.
这是因为:1,各城市之间可能是复线2,两地之间可能会 使用不同的交通工具从而费用不同。
实际中很多问题都可以归结为货郎担这类问题. 如: 1,物资运输路线中,汽车应该走怎样的路线使路程 最短; 2,工厂里在钢板上要挖一些小圆孔,自动焊接机的 割咀应走怎样的路线使路程最短; 3,城市里有一些地方铺设管道时,管子应走怎样 的路线才能使管子耗费最少,等等 比如说,前面曾经遇到的排序问题,以前我们 是用0-1整数规划来解决这类问题的。 在这里,我们同样可以使用动态规划的方法。 而且相对简单了很多。
排序问题 一,问题的提出:设有n个工件要在机床A,B上加 工,每个工件都必须经过先A后B的两道加工工序,
以ai,bi分别表示工件i(1<=i<=n) 在A,B上的加工 时间.问应如何在两机床上安排工件加工的顺序,
使在机床A上加工第一个工件开始到在机床B上
将最后一个工件加工完为止,所用的加工时间 最 少?
Vj 距离 Vi
1 2 3 4
1 0
8 5 6
2 6
0 8 5
3 7
9 0 5
4 9
7 8 0
解:K=0 由边界条件知: f0(2,空集)=d12=6 f0(3,空集)=d13=7 f0(4,空集)=d14=9
【算法复习二】货郎担(旅行售货商)动态规划
【算法复习二】货郎担(旅行售货商)动态规划一,问题由来货郎担问题也叫旅行商问题,即TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。
二,问题描述1)货郎担问题提法:有n个城市,用1,2,…,n表示,城i,j之间的距离为dij,有一个货郎从城1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线使总路程最短?2)旅行商问题的提法:假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
路径的选择目标是要求得的路径路程为所有路径之中的最小值。
三,问题求解1)动态规划解例题:设v1,v2,……..,vn是已知的n个城镇,城镇vi到城镇vj的距离为dij,现求从v1出发,经各城镇一次且仅一次返回v1的最短路程。
分析:设S表示从v1到vi中间所可能经过的城市集合,S实际上是包含除v1和vi两个点之外的其余点的集合,但S中的点的个数要随阶段数改变。
建模:状态变量(i,S)表示:从v1点出发,经过S集合中所有点一次最后到达vi。
最优指标函数fk(i,S)为从v1出发,经过S集合中所有点一次最后到达vi。
决策变量Pk(i,S)表示:从v1经k个中间城镇的S集合到vi 城镇的最短路线上邻接vi的前一个城镇,则动态规划的顺序递推关系为:fk(i,S)= min{ fk-1(j,S、{ j }+dji} j属于Sf0(i,空集)=d1i (k=1,2,…,n-1,i=2,3,…n)求解:K=0f0(2,空集)=d12=6f0(3,空集)=d13=7f0(4,空集)=d14=9当k=1时:从城市V1出发,经过1个城镇到达Vi的最短距离为:f1(2,{ 3 }) = f0 (3,空)+d 32 =7+8=15f1(2,{ 4 }) = f0 (4,空)+d 42 =9+8=14f1(3,{ 2 }) = f0 (2,空)+d 23 =6+9=15f1(3,{ 4 }) = f0 (4,空)+d 43 =9+5=14f1(4,{ 2 }) = f0 (2,空)+d 24 =6+7=13f1(4,{ 3 }) = f0 (3,空)+d 34 =7+8=15当k=2时,从城市V1出发,中间经过2个城镇到达Vi的最短距离.f2(2,{ 3,4 }) = min[ f1(3,{4})+d32, f1(4,{3})+ d42] =min[14+8,15+5]=20P2(2,{3,4})=4f2(3,{ 2,4 })= min[14+9,13+5]=18P2(3,{2,4})=4f2(4,{ 2,3})= min[15+7,15+8]=22P2(4,{2,3})=2当k=3时:从城市V1出发,中间经过3个城镇最终回到Vi的最短距离.f3(1,{ 2,3,4 })= min[f2(2,{ 3,4 }) + d 21,f2(3,{ 2,4})+ d31,f2(4,{ 2,3 }) + d41]=min[20+8,18+5,22+6]=23P3(1,{2,3,4})=3逆推回去,货郎的最短路线是1 2 4 3 1,最短距离为23.四,源码[html] view plaincopyprint?1.#include<iostream>2.#include<iomanip>ing namespace std;4.5.int n;6.int cost[20][20]={};7.bool done[20]={1};8.int start = 0; //从城市0开始9.10.int imin(int num, int cur)11.{12.if(num==1) //递归调用的出口13.return cost[cur][start]; //所有节点的最后一个节点,最后返回最后一个节点到起点的路径14.15.int mincost = 10000;16.for(int i=0; i<n; i++)17.{18.cout<<i<<" i:"<<done[i]<<endl;19.if(!done[i] && i!=start) //该结点没加入且非起始点20.{21.if(mincost <= cost[cur][i]+cost[i][start])22.{23.continue; //其作用为结束本次循环。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1997年9月Jour nal o f Guangx i U niver sity(N at Sci Ed)Sept.1997 求解货郎担问题的认识和实践卢怀山 黄宁恩(广西中医学院微机室,南宁,530001;第一作者43岁,男,讲师)摘 要 分析货郎担问题的解空间,用简捷的交换插入算法求解货郎担问题,并提出用求多个局部最优解的方法,然后再从中得出全局最优解.关键词 交换插入算法;多局部最优解;货郎担问题分类号 TP301.6;T P311.1货郎担问题(又称旅行商问题T raveling Salesman Problem,T SP)是一个NP难题,n城市的T SP的解有(n-1)!/2个,解空间非常的大.常用的近似算法的基本思想是从一给定解开始,构造一个产生新解的机制和一个评价函数,以控制新解的产生向着较优的方向发展,可求出局部的最优解.1 T SP的解空间及基本求解过程分析TSP的解空间,发现它是一个多维的、多局部极值的、趋于无穷大的复杂问题空间.可以形象地认为这是一个无穷大的丘陵地带,各山峰或山谷的高度即是问题的解值.而求解TSP,则是在此不能穷尽的丘陵地带中攀登以达到山峰顶或山谷底的过程.根据评价函数不同的构造方式,本质上有下列两种方法.盲目爬山法(评价函数只参考有限个邻近点) 在每一个当前步中,探索周围邻近的环境,引导搜索向着较高的方向前进,最后到达某个山顶而停止搜索.这应是与出发点相关的“附近”的山顶,但不能保证是全局最高的山顶.明目爬山法(评价函数与相当多的点有关) 首先考查有限的一大片地区,从而或隐或现地“看清”该地区的地形结构,然后控制搜索过程从出发点导向这地区的最高峰.由于上述方法中登山的路线只有一条,且不可能穷尽整个多山地区,所以只能找到与初始态及新解产生控制机制有关的局部最高点,不一定能找到全局最高点.2 多点分区搜索T SP的解空间既然只能搜索到TSP解空间某一区域的最高点,那么,如果分别搜索多个不同的区域,扩大搜索范围,能否从中得到全局最优解呢?关键是算法搜索到某个区域的最高点后,能够摆脱这个区域极值的束缚,跳到新的区域进行搜索,可以采用如下两种方法来进行多点分区搜索.遗传搜索 当搜索到一个区域最高点后,可沿原搜索路径后退一步,转向另一个方向重新搜索以期到达新的区域最高点,如此不断搜索有限个不同的区域,直至触发停止机制.然后从收稿日期:1997240广西大学学报(自然科学版)第22卷 诸个最高点中得出一个“最高”的最高点.算法的实质为单一深度优先搜索结合回溯广度优先搜索多个点的过程.但“遗传”搜索比较偏于原来的区域一隅,区域分布不够广泛.突变搜索 当搜索到一个区域最高点后,随机“突变”地跳到新的区域重新搜索.使搜索尽可能广泛地分布于整个解空间.算法的实质为初始态不同的并行单一深度优先搜索过程.也可以使用并行算法,以提高运行速度.在基本算法的基础上用提高一个数量级的办法求解多个不同的最优解,虽然也不能保证得到全局最优解,但使得到全局最优解的几率极大地增加.3 交换插入算法我们采用简单的交换插入算法求在我国31个城市之间巡游的TSP解的实践.其中的城市间距离数据取自文献[1].3.1 插入算法 在初始排列的一条城市巡游回路中,任取一个城市出来,随意地插入到序列中的另一个位置,得到一条新的巡游回路.比较这两个回路的长短,保留其中较优的回路.接着循环重复进行上述步骤,使回路序列逐渐地向优化的方向发展.具体地,取I城市出来插入到J城市后,这两个排列不同的地方在于…,I-1,I,I+1,…,J,J+1,…,…,I-1,I+1,…,J,I,J+1,….因此,只要计算城市I-1到I,I到I+1,J到J+1的三个城市距离之和,再计算城市I-1到I+1,J到I,I到J+1的另三个城市距离之和,比较这两个距离和的大小,就可以相应比较出这两条回路的长短,而不必要把两条回路的总长度都计算出来以进行比较.此算法计算量很小,每一步只须计算6个加法和1个比较,即用3个加法代替了31个加法,若巡游的城市越增多,代替的优势越明显.3.2 交换算法 在已经排列好的一条城市巡游回路中任取两个城市出来,交换它们的位置后插入回原序列中去,得到一条新的巡游回路.然后判断比较这两条回路,保留其中较优者.接着循环重复上述步骤,直至达到局部最优的巡游回路为止.这两个排列不同的地方在于…,I-1,I,I+1,…,J-1,J,J+1,…,…,I-1,J,I+1,…,J-1,I,J+1,….可见,交换算法的每一步只须计算与交换城市相关的8个加法及1个比较.在12种初始排列不同的巡游回路实验中,我们发现用插入算法运算量较少,收敛速度较快,最终得到的局部最优解好于交换算法.下面给出插入算法的T URBO BASIC程序,算法时间复杂性为O(N2)次加法、比较和O(N3)次交换排列.fo r i=1to n-1 ’循环使得插入有序,循环N2/2次fo r j=i+1to ns o=d(c(i-1),c(i))+d(c(i),c(i+1))+d(c(j),c(j+1))s n=d(c(i-1),c(i+1))+d(c(j),c(i))+d(c(i),c(j+1))if s n<s o thent=c(i) ’交换较优的排列fo r k=i to j-1: c(k)=c(k+1): nex tc (j )=t ’交换的算法时间复杂性O (N )end if nex t nex t从实验中可知,一个循环的计算往往不够,而且逆方向上的循环“插入”还可以进一步加快收敛的速度.但有限个循环以后交换就停止下来,达到局部最优解.其算法复杂性为O (N 3)次加法和比较、O (N 4)次交换排列.交换插入算法虽然简单,但实验结果很好.平均约进行4700多次比较、不到40次交换,12条巡游回路中就有2条巡游回路出现了全局最佳值15404km.而最长的巡游回路为17225km ,相差12%.可见初始态的不同,会收敛到不同的解(见表1).表1 插入算法结果初始态/km 停止解/km 交换次数 比较次数 218241540431418544273163938355803113616925586975241781646329418521628158583765105546916452795115383941648473790515904*156258372015492**154043232118318172257186019614160872432552063817156315580 *引自文献[1],**引自文献[2].全局最佳值比优化了的神经网络法和几何法求得的回路分别缩短了500km 和88km .具体的巡游回路如下:北京401呼和浩特341太原171石家庄376郑州437西安521银川346兰州192西宁1440乌鲁木齐1592拉萨1257成都641昆明434贵阳449南宁373海口455广州563长沙299武汉270南昌441福州252台北596杭州160上海269南京141合肥537济南271天津605沈阳281长春232哈尔滨1061北京4 多点搜索算法4.1 遗传多点搜索算法 以插入算法为多点搜索实验的基础,每优化前进一步,作一个标记.当搜索停止到局部最优点后,再回溯到最近标记点附近重新搜索新的局部最优点.实验中,曾发生运行陷入死循环的状况,原因为当运行到达某一局部最佳点后,退回到最近标记点附近重新搜索,经过若干次搜索又可能回到这一最佳点,好比陷入了沼泽地里.当增加跳出死循环的机制后,搜索能够正常进行.在平均进行106次比较、考查约500个局部最佳点后,有6条回路得到全局最优值.4.2 突变多点搜索算法 以插入算法为基础,当搜索到达局部最优点后.随机运行上述插入241第3期卢怀山等:求解货郎担问题的认识和实践242广西大学学报(自然科学版)第22卷 算法一次,得到一个“遗传突变”的新的巡游回路,重新运用插入算法进行新的搜索.在平均进行约5×105次比较、考查约800个左右的局部最佳点后,所有回路都达到全局最优(见表2).在“奔腾”90微机上运行时间均不超过1min.由于是有限个“多点搜索”,增加了一个数量级的运算量,算法时间复杂性为O(N4)次加法和比较.由实验可知,突变产生的“多点搜索”较遗传产生的“多点搜索”为优.表2 突变(随机产生)多点搜索结果初始态/km新解数目*最终解/km交换次数 比较次数 44273 6 15404 159 32841311361298154042057817456241785721540411264259732162817515404259953345546917161540428039859363839498515404157459948615904**90715404188174806618318148115404225094306419614691540425144562206381657154042926981366 *每条回路均进行5次试验,数据为平均值.**引自文献[1].一般的算法求解货郎担问题,不能保证得到全局最优解.本文在允许增加一个数量级运算量的条件下,尽量均匀地在整个解空间中求多个局部最优解,然后再从中得到全局最优解.参 考 文 献1 靳 蕃,范俊波,谭永东.神经网络与神经计算机.成都:西南交通大学出版社,19912 周培德.几何算法求解货郎担问题.计算机研究与发展,1995(10)3 卢怀山.交换插入算法简捷求解货郎担问题.广西民族学院学报,1996(2)Practice of Searching for a Solution tothe Travel Salesman ProblemLu Huaishan Huang Ningen(Sectio n of Computer,G uang xi Colleg e of T raditional Chinese M edicine,Na nning,530001)Abstract By using mo re superior alg orithm of interchange insertion method the Travel Salesman Problem is solved simply and directly.T he idea that is easier to find o ut the glo bal optim um solution by the w ay o f seeking out the partial optimum solutio n fro m solution gr oups is put forw ard.Key words algo rithm of interchang ing and inserting;partial optimum solution o f multiple so lution g roups;T ravel Salesm an Problem(责任编辑 刘海涛)。