2.旅行商TSP问题(1.1)
智能优化-TSP-旅行商问题
智能优化实验报告基于遗传算法的TSP问题求解研究一、问题描述1、TSP问题的概述旅行商问题 (Traveling Salesman Problem,简称 TSP) 是一个经典的组合化问题。
它可以描述为:一个商品推销员要去若干个城市推销商品,从一个城出发需要经过所有城市后回到出发地,应如何选择行进路线以使总行程短。
从图论的角度看,该问题实质是在一个带权完全无向图中找一个权值最的小回路。
在寻找最短路径问题上,有时不仅要知道两个指定顶点间的最短路径,还需要知道某个顶点到其他任意顶点间的最短路径。
旅行商问题也是经典的组合数学的问题,生活中随处可见这类组合数学问题。
例如,计算下列赛制下的总的比赛次数:n个球队比赛,每队只和其他队比赛一次。
在纸上画一个网络,用铅笔沿着网络的线路走,在笔不离开纸面且不重复线路的条件下,一笔画出网络图。
一个邮递员从邮局出发,要走完他所管辖的街道,他应该选择什么样的路径,这就是著名的“中国邮递员问题”。
一个通调网络怎样布局最节省?美国的贝尔实验室和IBM公司都有世界一流的组合数学家在研究这个问题,这个问题直接关系到巨大的经济利益。
库房和运输的管理也是典型的组合数学问题,怎样安排运输使得库房充分发挥作用,进一步来说,货物放在什么地方最便于存取。
上述的这些例子中,其中一部分就和旅行商问题有关系。
2、TSP问题研究意义解决旅行商问题有着极其重要的理论和现实意义。
从理论层面来讲,解TSP不仅为其他算法提供了思想方法平台,使这些算法广泛地应用于各种组合优化问题;而且经常被用来测试算法的优劣,如模拟退火算法、禁忌搜索、神经网络、进化算法等,都可用旅行商问题来测试。
从实际应用层面来讲,旅行商问题作为一个理想化的问题,尽管多数的研究成果不是为了直接的应用,但却被广泛地转化为许多组合优化问题,最直接的就是其在交通、物流和大规模生产中的应用。
3、TSP问题的解决TSP问题是诸多领域内出现的多种复杂问题的集中概括和简化形式。
TSP的几种求解方法及其优缺点
TSP的几种求解方法及其优缺点一、什么是TSP问题旅行商问题,简称TSP,即给定n个城市和两两城市之间的距离,要求确定一条经过各城市当且仅当一次的最短路线。
其图论描述为:给定图G=(V,A),其中V为顶点集,A 为各顶点相互连接组成的边集,设D=(dij)是由顶点i和顶点j之间的距离所组成的距离矩阵,要求确定一条长度最短的Hamilton回路,即遍历所有顶点当且仅当一次的最短距离。
旅行商问题可分为如下两类:1)对称旅行商问题(dij=dji,Πi,j=1,2,3,⋯,n);2)非对称旅行商问题(dij≠dji,ϖi,j=1,2,3,⋯,n)。
非对称旅行商问题较难求解,我们一般是探讨对称旅行商问题的求解。
若对于城市V={v1,v2,v3,⋯,v n}的一个访问顺序为T={t1,t2,t3,⋯,t i,⋯,t n},其中t i∈V(i=1,2,3,⋯,n),且记t n+1=t1,则旅行商问题的数学模型为:minL=。
TSP是一个典型的组合优化问题,并且是一个NP完全难题,是诸多领域内出现的多种复杂问题的集中概括和简化形式,并且已成为各种启发式的搜索、优化算法的间接比较标准。
因此,快速、有效地解决TSP有着重要的理论价值和极高的实际应用价值。
二、主要求解方法基于TSP的问题特性,构造型算法成为最先开发的求解算法,如最近邻点、最近合并、最近插入、最远插入、最近添加、贪婪插入等。
但是,由于构造型算法优化质量较差,迄今为止已开发了许多性能较好的改进型搜索算法,主要有:1)模拟退火算法2)禁忌搜索算法3)Hopfield神经网络优化算法4)蚁群算法5)遗传算法6)混合优化策略2.1模拟退火算法方法1)编码选择:采用描述TSP解的最常用的一种策略——路径编码。
2)SA状态产生函数的设计:对于基于路径编码的SA状态产生函数操作,可将其设计为:①互换操作(SW AP);②逆序操作(INV);③插入操作(INS)。
3)SA状态接受函数的设计:min{1,exp(-△/t)}>random[0,1]准则是作为接受新状态的条件最常用的方案,其中△为新旧状态的目标值差,t为”温度”。
旅行商问题(TSP)
iS jS
除起点和终点外,各边不构成圈
xij
0, 1
(7 1) (7 2) (7 3)
5
0 8 5 9 12 14 12 16 17 22
8
0
9 15 17
8
11
18
14
22
5 9 0 7 9 11 7 12 12 17
9 15 7 0
lingo解决旅行商问题 model: sets: city/1..6/:u; link(city,city):dist,x; endsets data: dist=99999,702,454,842,2396,1196,
702,99999,324,1093,2136,764, 454,324,99999,1137,2180,798, 842,1093,1137,99999,1616,1857, 2396,2136,2180,1616,99999,2900, 1196,764,798,1857,2900,99999; enddata
C=v1,v2,…,vi,vj,…,vj-1,vi+1,vj+1,…,vm,v1 (3)C0C,重复步骤(2),直到条件不满足为止,最后得 到的C即为所求。
例对下图的K6,用二边逐次修正法求较优H圈.
较优H圈: 其权为W(C3)=192
分析: 这个解的近似程度可用最优H圈的权的下界与
其比较而得出.即利用最小生成树可得最优H圈的一个下界.
设C是G的一个最优H圈,则对G的任一顶点v, C-v是
G-v的生成树.如果T是G-v的最小生成树,且e1是e2与v关联
的边中权最小的两条边,则w(T)+w(e1)+w(e2)将是w(C)
基于分支限界法的旅行商问题(TSP)一
基于分⽀限界法的旅⾏商问题(TSP)⼀旅⾏推销员问题(英语:Travelling salesman problem, TSP)是这样⼀个问题:给定⼀系列城市和每对城市之间的距离,求解访问每⼀座城市⼀次并回到起始城市的最短回路。
它是组合优化中的⼀个NP困难问题,在运筹学和理论计算机科学中⾮常重要。
分⽀限界法在上⼀篇Blog中我有简单说明,并给出了,这篇⽂章⾥介绍⼀下基于分⽀限界法的TSP算法。
对于TSP,我们需要利⽤上界和下界来对BFS进⾏剪枝,通过不断更新上界和下界,尽可能的排除不符合需求的child,以实现剪枝。
最终,当上限和下限等同时,我们可以获得最优的BFS解,以解决TSP问题。
在第⼀篇中,我们⽤dfs获取上界,⽤每⾏矩阵最⼩值来获取下界。
代码如下,下⾯代码中,我采⽤贪⼼法(使⽤DFS暴⼒搜索到⼀个结果)来获取最初的上界,通过累加每⾏旅⾏商矩阵中的最⼩值来获取⼀个下界。
//分⽀限界法#include<iostream>#include<algorithm>#include<cstdio>#include<queue>const int INF = 100000;const int MAX_N = 22;using namespace std;//n*n的⼀个矩阵int n;int cost[MAX_N][MAX_N];//最少3个点,最多MAX_N个点struct Node{bool visited[MAX_N];//标记哪些点⾛了int s;//第⼀个点int s_p;//第⼀个点的邻接点int e;//最后⼀个点int e_p;//最后⼀个点的邻接点int k;//⾛过的点数int sumv;//经过路径的距离int lb;//⽬标函数的值(⽬标结果)bool operator <(const Node &p)const{return p.lb < lb;//⽬标函数值⼩的先出队列}};priority_queue<Node> pq;//创建⼀个优先队列int low, up;//下界和上界bool dfs_visited[MAX_N];//在dfs过程中搜索过//确定上界,利⽤dfs(属于贪⼼算法),贪⼼法的结果是⼀个⼤于实际值的估测结果int dfs(int u, int k, int l)//当前节点,⽬标节点,已经消耗的路径{if (k == n) return l + cost[u][1];//如果已经检查了n个节点,则直接返回路径消耗+第n个节点回归起点的消耗int minlen = INF, p;for (int i = 1; i <= n; i++){if (!dfs_visited[i] && minlen > cost[u][i])//取与所有点的连边中最⼩的边{minlen = cost[u][i];//找出对于每⼀个节点,其可达节点中最近的节点p = i;}}dfs_visited[p] = true;//以p为下⼀个节点继续搜索return dfs(p, k + 1, l + minlen);}void get_up(){dfs_visited[1] = true;//以第⼀个点作为起点up = dfs(1, 1, 0);}//⽤这种简单粗暴的⽅法获取必定⼩于结果的⼀个值void get_low(){//取每⾏最⼩值之和作为下界low = 0;for (int i = 1; i <= n; i++){//创建⼀个等同于map的临时数组,可⽤memcpyint tmpA[MAX_N];for (int j = 1; j <= n; j++){tmpA[j] = cost[i][j];}sort(tmpA + 1, tmpA + 1 + n);//对临时的数组进⾏排序low += tmpA[1];}}int get_lb(Node p){int ret = p.sumv * 2;//路径上的点的距离的⼆倍int min1 = INF, min2 = INF;//起点和终点连出来的边for (int i = 1; i <= n; i++){//cout << p.visited[i] << endl;if (!p.visited[i] && min1 > cost[i][p.s]){min1 = cost[i][p.s];}//cout << min1 << endl;}ret += min1;for (int i = 1; i <= n; i++){if (!p.visited[i] && min2 > cost[p.e][i]){min2 = cost[p.e][i];}//cout << min2 << endl;}ret += min2;for (int i = 1; i <= n; i++){if (!p.visited[i]){min1 = min2 = INF;for (int j = 1; j <= n; j++){if (min1 > cost[i][j])min1 = cost[i][j];}for (int j = 1; j <= n; j++){if (min2 > cost[j][i])min2 = cost[j][i];}ret += min1 + min2;}}return (ret + 1) / 2;}int solve(){//贪⼼法确定上界get_up();//取每⾏最⼩的边之和作为下界//cout << up << endl;//testget_low();//cout << low << endl;//test//设置初始点,默认从1开始Node star;star.s = 1;//起点为1star.e = 1;//终点为1star.k = 1;//⾛过了1个点for (int i = 1; i <= n; i++){star.visited[i] = false;}star.visited[1] = true;star.sumv = 0;//经过的路径距离初始化star.lb = low;//让⽬标值先等于下界int ret = INF;//ret为问题的解pq.push(star);//将起点加⼊队列while (pq.size()){Node tmp = pq.top();pq.pop();if (tmp.k == n - 1)//如果已经⾛过了n-1个点{//找最后⼀个没有⾛的点int p;for (int i = 1; i <= n; i++){if (!tmp.visited[i]){p = i;//让没有⾛的那个点为最后点能⾛的点break;}}int ans = tmp.sumv + cost[p][tmp.s] + cost[tmp.e][p];//已消耗+回到开始消耗+⾛到P的消耗 //如果当前的路径和⽐所有的⽬标函数值都⼩则跳出if (ans <= tmp.lb){ret = min(ans, ret);break;}//否则继续求其他可能的路径和,并更新上界else{up = min(up, ans);//上界更新为更接近⽬标的ans值ret = min(ret, ans);continue;}}//当前点可以向下扩展的点⼊优先级队列Node next;for (int i = 1; i <= n; i++){if (!tmp.visited[i]){//cout << "test" << endl;next.s = tmp.s;//沿着tmp⾛到next,起点不变next.sumv = tmp.sumv + cost[tmp.e][i];//更新路径和next.e = i;//更新最后⼀个点next.k = tmp.k + 1;//更新⾛过的顶点数for (int j = 1; j <= n; j++) next.visited[j] = tmp.visited[j];//tmp经过的点也是next经过的点 next.visited[i] = true;//⾃然也要更新当前点//cout << next.visited[i] << endl;next.lb = get_lb(next);//求⽬标函数//cout << next.lb << endl;if (next.lb > up) continue;//如果⼤于上界就不加⼊队列pq.push(next);//否则加⼊队列//cout << "test" << endl;}}//cout << pq.size() << endl;BUG:测试为0}return ret;}int main(){cin >> n;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){cin >> cost[i][j];if (i == j){cost[i][j] = INF;}}}cout << solve() << endl;return0;}/*测试5100000 5 61 34 1257 100000 43 20 739 42 100000 8 216 50 42 100000 841 26 10 35 10000036请按任意键继续. . .*/。
旅行商问题毕业论文
摘要旅行商问题(Travelling Salesman Problem,简称TSP)是一个典型的组合优化问题,并且是一个NP难题,其可能的路径总数与城市数目n 是成指数型增长的,所以一般很难精确地求出其最优解,因而寻找出有效的近似求解算法就具有重要的意义。
遗传算法(GA)是求解旅行商问题(TSP)的常用方法之一。
针对中国旅行商问题(CTSP),本文利用遗传算法的全局搜索能力进行组合优化问题求解,设计一种大比例的优秀个体保护的大变异遗传算法,并使用MATLAB语言进行了实际的编程求解,编程中的各个模块分别实现了选择、交叉、变异等关键环节。
用编制的程序快速求解出了满足的结果,用本文设计的遗传算法的思路和编程程序是正确的。
用该策略迅速找到了CTSP最优解,该路径长度为15378km,比目前已知CTSP解更优。
对遗传算法迅速求解TSP最优解提供了可行解决方案。
关键词:遗传算法;CTSP;最短路径;MATLABAbstractThe traveling salesman problem (TSP) is a well-known NP complete problem, It’s increased by exponential n. So, it is hard to find a precision result, and it is very important to search for the near result.The genetic algorithm (GA) is one of the ideal methods in solving it. For CTSP,According to genetic algorithm’s globa l searching proterty, a kind of big probability variation’s genetic algorithm is put forward, which copies big proportion of fittest. In MATLAB, the typical Chinese traveling salesman problem is computed and the result shows the thought and program is correct. The best path for CTSP is found quickly through the algorithm. The best path 15378km is get, the result is the best so far.Key words: The Genetic Algorithm (GA); Chinese Traveling Salesman Problem (CTSP); The Shortest Path; MATLAB目录摘要 (I)Abstract (II)绪论 (1)1 CTSP数学模型及常用算法 (2)1.1 TSP的数学模型 (2)1.2 TSP问题的常用求解方法 (2)1.2.1 遗传算法(GA) (2)1.2.2 模拟退火算法(SA) (3)1.2.3 蚁群算法(ACO) (3)1.2.4 禁忌搜索(TS) (4)1.2.5 粒子群优化算法(PSO) (4)1.3 CTSP问题的数学模型,目前最优解 (5)1.3.1 CTSP的数学建模 (5)1.3.2 CTSP目前最优解 (5)2 用遗传算法SGA求解CTSP问题 (7)2.1 遗传算法求解框架 (7)2.2 种群初始化和计算适应度 (8)2.2.1 种群初始化 (8)2.2.2 计算适应度 (8)2.3 遗传算子 (8)2.3.1 选择算子 (8)2.3.2 交叉算子 (8)2.3.3 变异算子 (9)2.3.4 终止判断 (9)3 MA TLAB简介与特点 (10)3.1 MA TLAB简介 (10)3.2 MA TLAB的特点 (10)4 用MA TLAB求解CSTP问题 (12)4.1 种群初始化 (12)4.2 计算适应度 (12)4.3选择算子 (12)4.3.1 计算选择算子的过程 (12)4.3.2选择算子计算的代码实现 (13)4.4 交叉算子 (15)4.4.1 交叉概率的选择 (15)4.4.2 交叉算法实现 (16)4.5 变异算子164.5.1 变异概率的选择 (16)4.5.2 变异算法实现 (17)4.6 路径输出 (17)5 实验结论及分析 (19)5.1 实验结论 (19)5.2 需要进一步解决的问题 (20)致谢 (21)主要参考文献 (22)绪论旅行商问题(Travelling Salesman Problem,简称TSP)是一个典型的组合优化问题,并且是一个NP难题,遗传算法(GA)、模拟退火算法(SA)等算法是求解这类问题的常用方法。
TSP的几种求解方法及其优缺点
TSP的几种求解方法及其优缺点一、什么是TSP问题旅行商问题,简称TSP,即给定n个城市和两两城市之间的距商,要求确定一条经过各城市当且仅当一次的是短路线。
其图论描述为:给定图G= (V, A),其中V为顶点集,A 为各顶点相互连接组成的边集,设(dij)是由顶点i和顶点j之间的距离所组成的距离矩阵,要求确定一条长度最短的Hamihon回路,即遍历所有顶点当且仅当一次的最短距离。
旅行商问题可分为如下两类:1)对称旅行商问题3j=dji, ni, j=l, 2, 3, - , n);2)非对称旅行商问题(dijHdji, Bi, j=1, 2, 3, - , n)o非对称旅行商问题较碓求解,我们一般是探讨对称旅行商问题的求解。
若对于城市V={V H V2, V n - , %}的一个访问顺序为T={l), b, tj, - , tj, - , tj,A其中衣v (i=l, 2, 3,・・・,□),且记t n+l=tl>则旅行商问题的数学模型为:血工Xzr-l TSP是一个典型的组台优化问题,并且是一个NP完全难题,是诸多领域内出现的多种复杂问题的集中槪括和简化形式,并且已成为各种启发式的搜索、优化算法的间接比较标准。
因此,快速、有效地解决TSP有着重要的理论价值和板高的实际应用价值。
二、主要求解方法基于TSP的问题特性,构造型算法成为最先开发的求解算法,如最近邻点、最近台并、最近插入、晨远插入、最近添加、贪婪插入等。
但是,由于构造型算法优化质長较差,迄今为止巳开发了许多性能较好的改迸型搜索算法,主要有:1)模拟退火算法2)禁忌搜索算法3)Hopficld神经网络优化算法4)蚁群算法5)遗传算法6)混合优化策路2.1模拟退火算法方法1)编码选择:采用描述TSP解的臺常用的一种策略——路径编码。
2)SA状态产生函数的设计:对于基于站径编码的SA状态产生函数操作,可将其设计为:①互换操作(SV7AP);②逆序操作(INV);③插入操作仃NS)。
TSP的几种求解方法及其优缺点
一、什么是TSP问题旅行商问题,简称TSP,即给定n个城市和两两城市之间的距离,要求确定一条经过各城市当且仅当一次的最短路线。
其图论描述为:给定图G=(V,A),其中V为顶点集,A为各顶点相互连接组成的边集,设D=(dij)是由顶点i和顶点j之间的距离所组成的距离矩阵,要求确定一条长度最短的Hamilton回路,即遍历所有顶点当且仅当一次的最短距离。
旅行商问题可分为如下两类:1)对称旅行商问题(dij=dji,Πi,j=1,2,3,⋯,n);2)非对称旅行商问题(dij≠dji,ϖi,j=1,2,3,⋯,n)。
非对称旅行商问题较难求解,我们一般是探讨对称旅行商问题的求解。
若对于城市V={v1,v2,v3,⋯,v n}的一个访问顺序为T={t1,t2,t3,⋯,t i,⋯,t n},其中t i∈V(i=1,2,3,⋯,n),且记t n+1=t1,则旅行商问题的数学模型为:minL=。
TSP是一个典型的组合优化问题,并且是一个NP完全难题,是诸多领域内出现的多种复杂问题的集中概括和简化形式,并且已成为各种启发式的搜索、优化算法的间接比较标准。
因此,快速、有效地解决TSP有着重要的理论价值和极高的实际应用价值。
二、主要求解方法基于TSP的问题特性,构造型算法成为最先开发的求解算法,如最近邻点、最近合并、最近插入、最远插入、最近添加、贪婪插入等。
但是,由于构造型算法优化质量较差,迄今为止已开发了许多性能较好的改进型搜索算法,主要有:1)模拟退火算法2)禁忌搜索算法3)Hopfield神经网络优化算法4)蚁群算法5)遗传算法6)混合优化策略模拟退火算法方法1)编码选择:采用描述TSP解的最常用的一种策略——路径编码。
2)SA状态产生函数的设计:对于基于路径编码的SA状态产生函数操作,可将其设计为:①互换操作(SWAP);②逆序操作(INV);③插入操作(INS)。
3)SA状态接受函数的设计:min{1,exp(-△/t)}>random[0,1]准则是作为接受新状态的条件最常用的方案,其中△为新旧状态的目标值差,t为”温度”。
旅行商问题
旅行商问题旅行商问题(Traveling Saleman Problem,TSP)又译为、,简称为,是最基本的路线问题,该问题是在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。
最早的旅行商问题的数学规划是由Dantzig(1959)等人提出。
目录1简介“旅行商问题”常被称为“”,是指一名推销员要拜访多个地点时,如何找到在拜访每个地点一次后再回到起点的最短路径。
规则虽然简单,但在地点数目增多后求解却极为复杂。
以42个地点为例,如果要列举所有路径后再确定最佳行程,那么总路径数量之大,几乎难以计算出来。
多年来全球数学家绞尽脑汁,试图找到一个高效的TSP问题在物流中的描述是对应一个物流配送公司,欲将n个客户的订货沿最短路线全部送到。
如何确定最短路线。
TSP问题最简单的求解方法是。
它的解是多维的、多局部极值的、趋于无穷大的复杂解的空间,搜索空间是n个点的所有排列的集合,大小为(n-1)。
可以形象地把看成是一个无穷大的丘陵地带,各山峰或山谷的高度即是问题的极值。
求解TSP,则是在此不能穷尽的丘陵地带中攀登以达到山顶或谷底的过程。
2研究历史旅行商问题字面上的理解是:有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的具有最短路程的环路。
TSP的历史很久,最早的描述是1759年欧拉研究的骑士周游问题,即对于棋盘中的64个方格,走访64个方格一次且仅一次,并且最终返回到起始点。
TSP由RAND公司于1948年引入,该公司的声誉以及线性规划这一新方法的出现使得TSP成为一个知名且流行的问题。
3问题解法旅行推销员的问题,我们称之为巡行(Tour),此种问题属于的问题,1、途程建构法(Tour Construction Procedures)从中产生一个近似最佳解的途径,有以下几种解法:2、途程改善法(Tour Improvement Procedure)先给定一个可行途程,然后进行改善,一直到不能改善为止。
TSP的几种求解方法及其优缺点
TSP的⼏种求解⽅法及其优缺点TSP的⼏种求解⽅法及其优缺点⼀、什么是TSP问题旅⾏商问题,简称TSP,即给定n个城市和两两城市之间的距离,要求确定⼀条经过各城市当且仅当⼀次的最短路线。
其图论描述为:给定图G=(V,A),其中V为顶点集,A 为各顶点相互连接组成的边集,设D=(dij)是由顶点i和顶点j之间的距离所组成的距离矩阵,要求确定⼀条长度最短的Hamilton回路,即遍历所有顶点当且仅当⼀次的最短距离。
旅⾏商问题可分为如下两类:1)对称旅⾏商问题(dij=dji,Πi,j=1,2,3,?,n);2)⾮对称旅⾏商问题(dij≠dji,?i,j=1,2,3,?,n)。
⾮对称旅⾏商问题较难求解,我们⼀般是探讨对称旅⾏商问题的求解。
若对于城市V={v1,v2,v3,?,v n}的⼀个访问顺序为T={t1,t2,t3,?,t i,?,t n},其中t i∈V(i=1,2,3,?,n),且记t n+1=t1,则旅⾏商问题的数学模型为:minL=。
TSP是⼀个典型的组合优化问题,并且是⼀个NP完全难题,是诸多领域内出现的多种复杂问题的集中概括和简化形式,并且已成为各种启发式的搜索、优化算法的间接⽐较标准。
因此,快速、有效地解决TSP有着重要的理论价值和极⾼的实际应⽤价值。
⼆、主要求解⽅法基于TSP的问题特性,构造型算法成为最先开发的求解算法,如最近邻点、最近合并、最近插⼊、最远插⼊、最近添加、贪婪插⼊等。
但是,由于构造型算法优化质量较差,迄今为⽌已开发了许多性能较好的改进型搜索算法,主要有:1)模拟退⽕算法2)禁忌搜索算法3)Hopfield神经⽹络优化算法4)蚁群算法5)遗传算法6)混合优化策略2.1 模拟退⽕算法⽅法1)编码选择:采⽤描述TSP解的最常⽤的⼀种策略——路径编码。
2)SA状态产⽣函数的设计:对于基于路径编码的SA状态产⽣函数操作,可将其设计为:①互换操作(SWAP);②逆序操作(INV);③插⼊操作(INS)。
遗传算法(GeneticAlgorithms)
遗传算法(GeneticAlgorithms)遗传算法前引:1、TSP问题1.1 TSP问题定义旅⾏商问题(Traveling Salesman Problem,TSP)称之为货担郎问题,TSP问题是⼀个经典组合优化的NP完全问题,组合优化问题是对存在组合排序或者搭配优化问题的⼀个概括,也是现实诸多领域相似问题的简化形式。
1.2 TSP问题解法传统精确算法:穷举法,动态规划近似处理算法:贪⼼算法,改良圈算法,双⽣成树算法智能算法:模拟退⽕,粒⼦群算法,蚁群算法,遗传算法等遗传算法:性质:全局优化的⾃适应概率算法2.1 遗传算法简介遗传算法的实质是通过群体搜索技术,根据适者⽣存的原则逐代进化,最终得到最优解或准最优解。
它必须做以下操作:初始群体的产⽣、求每⼀个体的适应度、根据适者⽣存的原则选择优良个体、被选出的优良个体两两配对,通过随机交叉其染⾊体的基因并随机变异某些染⾊体的基因⽣成下⼀代群体,按此⽅法使群体逐代进化,直到满⾜进化终⽌条件。
2.2 实现⽅法根据具体问题确定可⾏解域,确定⼀种编码⽅法,能⽤数值串或字符串表⽰可⾏解域的每⼀解。
对每⼀解应有⼀个度量好坏的依据,它⽤⼀函数表⽰,叫做适应度函数,⼀般由⽬标函数构成。
确定进化参数群体规模、交叉概率、变异概率、进化终⽌条件。
案例实操我⽅有⼀个基地,经度和纬度为(70,40)。
假设我⽅飞机的速度为1000km/h。
我⽅派⼀架飞机从基地出发,侦察完所有⽬标,再返回原来的基地。
在每⼀⽬标点的侦察时间不计,求该架飞机所花费的时间(假设我⽅飞机巡航时间可以充分长)。
已知100个⽬标的经度、纬度如下表所列:3.2 模型及算法求解的遗传算法的参数设定如下:种群⼤⼩M=50;最⼤代数G=100;交叉率pc=1,交叉概率为1能保证种群的充分进化;变异概率pm=0.1,⼀般⽽⾔,变异发⽣的可能性较⼩。
编码策略:初始种群:⽬标函数:交叉操作:变异操作:选择:算法图:代码实现:clc,clear, close allsj0=load('data12_1.txt');x=sj0(:,1:2:8); x=x(:);y=sj0(:,2:2:8); y=y(:);sj=[x y]; d1=[70,40];xy=[d1;sj;d1]; sj=xy*pi/180; %单位化成弧度d=zeros(102); %距离矩阵d的初始值for i=1:101for j=i+1:102d(i,j)=6370*acos(cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*...cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2)));endendd=d+d'; w=50; g=100; %w为种群的个数,g为进化的代数for k=1:w %通过改良圈算法选取初始种群c=randperm(100); %产⽣1,...,100的⼀个全排列c1=[1,c+1,102]; %⽣成初始解for t=1:102 %该层循环是修改圈flag=0; %修改圈退出标志for m=1:100for n=m+2:101if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<...d(c1(m),c1(m+1))+d(c1(n),c1(n+1))c1(m+1:n)=c1(n:-1:m+1); flag=1; %修改圈endendendif flag==0J(k,c1)=1:102; break %记录下较好的解并退出当前层循环endendendJ(:,1)=0; J=J/102; %把整数序列转换成[0,1]区间上实数即染⾊体编码for k=1:g %该层循环进⾏遗传算法的操作for k=1:g %该层循环进⾏遗传算法的操作A=J; %交配产⽣⼦代A的初始染⾊体c=randperm(w); %产⽣下⾯交叉操作的染⾊体对for i=1:2:wF=2+floor(100*rand(1)); %产⽣交叉操作的地址temp=A(c(i),[F:102]); %中间变量的保存值A(c(i),[F:102])=A(c(i+1),[F:102]); %交叉操作A(c(i+1),F:102)=temp;endby=[]; %为了防⽌下⾯产⽣空地址,这⾥先初始化while ~length(by)by=find(rand(1,w)<0.1); %产⽣变异操作的地址endB=A(by,:); %产⽣变异操作的初始染⾊体for j=1:length(by)bw=sort(2+floor(100*rand(1,3))); %产⽣变异操作的3个地址%交换位置B(j,:)=B(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]);endG=[J;A;B]; %⽗代和⼦代种群合在⼀起[SG,ind1]=sort(G,2); %把染⾊体翻译成1,...,102的序列ind1num=size(G,1); long=zeros(1,num); %路径长度的初始值for j=1:numfor i=1:101long(j)=long(j)+d(ind1(j,i),ind1(j,i+1)); %计算每条路径长度endend[slong,ind2]=sort(long); %对路径长度按照从⼩到⼤排序J=G(ind2(1:w),:); %精选前w个较短的路径对应的染⾊体endpath=ind1(ind2(1),:), flong=slong(1) %解的路径及路径长度xx=xy(path,1);yy=xy(path,2);plot(xx,yy,'-o') %画出路径以上整个代码中没有调⽤GA⼯具箱。
tsp旅行包、商问题算法研究 - 副本
4.TSP 问题算法实现
4.1 问题的提出
某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费) 。他 要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程
(或旅费)最小。 设 G=(V,E) 是一个带权图。图中各边的费用(权)为正数。图中的一条周游路线是 包括 V 中的每个顶点在内的一条回路。 周游路线的费用是这条路线上所有边的费 用之和。旅行售货员问题要在图 G 中找到费用最小的周游路线。
题目:TSP 旅行商问题的算法研究
学号: 姓名: 班级:
日期:2015 年 1 月 1
1.研究背景
旅行商问题( Traveling Salesman Problem ,简称 TSP)是一个易于描述但难于解决 的著名难题之一。TSP 问题可描述为:已知 n 个城市各城市间的距离,某一旅行商 从某个城市出发访问每个城市一次且仅一次,最后回到出发城市,怎样安排才使其 所走路线最短。TSP 问题的数学描述即为:如何在一个赋权图中,寻求权和最小 哈密尔顿回路问题。 现实生活中有很多问题可以归结为旅行商问题,比如邮路问题、装配线上的螺 帽问题和产品的生产安排问题等。TSP 问题在电路板钻孔进度的安排、基因测序 和机器人控制等方面有着重要的应用。因此, TSP 问题的求解具有重要的理论意 义和实际意义。 几十年前就已找到的一些指数级算法虽然能精确地求解 TSP 问题, 但随着问 题规模的变大,这些算法完全失效(组合爆炸) 。近似算法或启发式算法尽管不能 精确求解,但能够把误差控制在可以容忍的范围内并且能够快速地得到答案。 计算机科学是一种创造性思维活动的科学。 计算机算法设计与分析是面向设计 的、处于核心地位的一门学科。算法是一组有穷的规则,它规定了解决某一特定 类型问题的一系列运算。它由有限条可执行的、有确定结果的程序指令组成。算 法设计是一件非常困难的工作,常用的算法设计方法有:分治法、贪心方法、动 态规划、回溯法、分枝-限界法、基本检索与周游方法、遗传算法等。本文将分 别就贪心方法、动态规划、回溯法、遗传算法这几种算法设计方法研究 0/1 背包 问题的求解方法进行分析,并对各种算法的复杂度进行分析。
数学建模经典问题——旅行商问题
度最短的两条边之和; C*(T):最优回路长度;
25
于是,dmin(i, 1)代表与第i个结点关联的所有边 中最长边的长度,dmin_j(i, 1) 代表与第i个结点关联 的所有边中次长边的另一个结点编号(其中一个结点 编号为i),第i结点的dmin(i, k)和dmin_j(i, k)可由距 离矩阵w轻易求得。
20
当然,用该方法有时会找不到TSP的最优解, 因为很可能在进行了几轮迭代后,却找不到新的不 等式。Padborg与Hong曾计算了74个TSP,其中54 个得到了最优解,其余的虽未得到最优解,却得到 了很好的下界,如果与近似方法配合,可以估计近 似解的精确程度。如,他们解过一个有313个城市的 TSP,获得一个下界41236.46,而用近似方法能得 到一条长为41349的路线,于是可估计出所得近似解 与最优解的误差不超过0.26%。
14
早在1954年,Dantzig等人就曾提出过一种方 法(非多项式算法),并且求出了一个42城市的 TSP最优解。到了1960年代,不少人用分支定界法 解决了许多有几十个城市的TSP。还有人提出了一 些近似方法,也解决了许多有几十个城市甚至上百 个城市的TSP(有时找到的仅是近似解)。更值得 注意的是,从1970年代中期开始,Grotschel与 Padberg等人深入研究了TS多面体的最大面 (facet),并从所得结果出发获得了一种解TSP的 新算法,可以解决一些有100多个城市的TSP,且都 在不长的时间内找到了最优解。
一、数学模型 1. 标准TSP 旅行商问题(简称TSP),也称货郎担问题或 旅行推销员问题,是运筹学中一个著名的问题,其 一般提法为:有一个旅行商从城市1出发,需要到城 市2、3、…、n去推销货物,最后返回城市1,若任 意两个城市间的距离已知,则该旅行商应如何选择 其最佳行走路线
基于深度强化学习的旅行商问题及其变体研究
基于深度强化学习的旅行商问题及其变体研究1. 内容简述本研究基于深度强化学习(Deep Reinforcement Learning,DRL)方法,对旅行商问题(Traveling Salesman Problem,TSP)及其变体进行了深入研究。
旅行商问题是组合优化领域中最经典的问题之一,其目标是在给定一组城市和它们之间的距离后,找到一条最短的路径,使得旅行商能够依次访问所有城市并返回原点,同时尽量减少总的行驶距离。
随着深度强化学习的发展,越来越多的研究者开始尝试将DRL应用于解决TSP问题及其变体。
我们在多个公开数据集上对所提出的算法进行了实验验证,相较于传统的TSP求解方法,基于深度强化学习的算法在解决TSP问题及其变体时具有更好的性能和泛化能力。
1.1 研究背景随着人工智能技术的不断发展,深度强化学习(Deep Reinforcement Learning,DRL)已经成为解决复杂问题的强大工具。
旅行商问题(Traveling Salesman Problem,TSP)是组合优化领域中最著名的问题之一,其目标是在给定一组城市和它们之间的距离后,找到一条最短的路径,使得旅行商从起点出发,经过所有城市恰好一次并回到起点。
TSP问题在实际生活中具有广泛的应用价值,例如物流配送、供应链管理等。
由于TSP问题的复杂性,目前尚未有一种通用的高效算法能够同时满足最优性和实用性的要求。
基于深度强化学习的方法在研究TSP问题及其变体方面具有重要的理论意义和实际应用价值。
1.2 研究目的本研究旨在探索基于深度强化学习的旅行商问题及其变体,以提高旅行商问题的求解效率和鲁棒性。
通过对现有深度强化学习算法的研究和分析,总结其在解决旅行商问题方面的优势和不足。
针对旅行商问题的特点和难点,设计并实现一种基于深度强化学习的解决方案,以提高求解效果。
通过对比实验验证所提出方法的有效性和优越性,为实际应用提供参考。
1.3 研究意义旅行商问题(TSP,Traveling Salesman Problem)是组合优化领域中一个经典的问题,其目标是在给定一组城市和它们之间的距离后,找到一条最短的路径,使得旅行商从一个城市出发,经过所有其他城市恰好一次,然后回到出发城市。
2.旅行商TSP问题(1.1)
旅行商问题旅行商问题(Traveling Salesman Problem,TSP)又译为旅行推销员问题、货郎担问题,简称为TSP问题,是最基本的路线问题,该问题是在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。
最早的旅行商问题的数学规划是由Dantzig(1959)等人提出。
目录目录旅行商问题 (1)目录 (1)1.简介 (1)2.研究历史 (2)3.问题解法 (2)4.解法思路 (2)途程建构法 (2)途程改善法 (2)合成启发法 (3)5.研究进展 (3)6.问题分析 (3)1.简介“旅行商问题”常被称为“旅行推销员问题”,是指一名推销员要拜访多个地点时,如何找到在拜访每个地点一次后再回到起点的最短路径。
规则虽然简单,但在地点数目增多后求解却极为复杂。
以42个地点为例,如果要列举所有路径后再确定最佳行程,那么总路径数量之大,几乎难以计算出来。
多年来全球数学家绞尽脑汁,试图找到一个高效的算法。
TSP问题在物流中的描述是对应一个物流配送公司,欲将n个客户的订货沿最短路线全部送到。
如何确定最短路线。
TSP问题最简单的求解方法是枚举法。
它的解是多维的、多局部极值的、趋于无穷大的复杂解的空间,搜索空间是n个点的所有排列的集合,大小为(n-1)。
可以形象地把解空间看成是一个无穷大的丘陵地带,各山峰或山谷的高度即是问题的极值。
求解TSP,则是在此不能穷尽的丘陵地带中攀登以达到山顶或谷底的过程。
2.研究历史旅行商问题字面上的理解是:有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的具有最短路程的环路。
TSP的历史很久,最早的描述是1759年欧拉研究的骑士周游问题,即对于国际象棋棋盘中的64个方格,走访64个方格一次且仅一次,并且最终返回到起始点。
TSP由美国RAND公司于1948年引入,该公司的声誉以及线性规划这一新方法的出现使得TSP成为一个知名且流行的问题。
旅行商问题
旅行商问题
旅行商问题(Traveling Salesman Problem,TSP)是一个有着悠久历史的经典优化问题,也是一个非常重要的研究领域。
贪婪法是常用的解决TSP问题的算法之一。
它的思想是每次都选择与当前位置最近的城市,最后回到出发城市,进而完成一个TSP问题的解决。
贪婪法的TSP问题可以通过求解最佳匹配(Minimazing Tour Cost)而简单地实现。
它要求先求出各城市带来的价值,然后将价值作为各城市之间的距离权重,计算出最佳匹配。
另外,贪婪算法解决TSP问题还可以使用基于穷举搜索的解法。
它对所有有可能存在的路线进行排查,从而最终求出最短路径长度。
但是,由于TSP问题的解空间很大,穷举搜索的解法无法保证能够求出最优解,运行时间也增加了很多,贪婪算法求解TSP问题速度较快。
总之,贪婪算法解决TSP问题能够在短时间内快速求出最短路径,但是求得的解不一定是最优解,而且TSP问题求解的解空间非常大,仍然有很多未知问题需要进一步研究。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
旅行商问题旅行商问题(Traveling Salesman Problem,TSP)又译为旅行推销员问题、货郎担问题,简称为TSP问题,是最基本的路线问题,该问题是在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。
最早的旅行商问题的数学规划是由Dantzig(1959)等人提出。
目录目录旅行商问题 (1)目录 (1)1.简介 (1)2.研究历史 (2)3.问题解法 (2)4.解法思路 (2)途程建构法 (2)途程改善法 (2)合成启发法 (3)5.研究进展 (3)6.问题分析 (3)1.简介“旅行商问题”常被称为“旅行推销员问题”,是指一名推销员要拜访多个地点时,如何找到在拜访每个地点一次后再回到起点的最短路径。
规则虽然简单,但在地点数目增多后求解却极为复杂。
以42个地点为例,如果要列举所有路径后再确定最佳行程,那么总路径数量之大,几乎难以计算出来。
多年来全球数学家绞尽脑汁,试图找到一个高效的算法。
TSP问题在物流中的描述是对应一个物流配送公司,欲将n个客户的订货沿最短路线全部送到。
如何确定最短路线。
TSP问题最简单的求解方法是枚举法。
它的解是多维的、多局部极值的、趋于无穷大的复杂解的空间,搜索空间是n个点的所有排列的集合,大小为(n-1)。
可以形象地把解空间看成是一个无穷大的丘陵地带,各山峰或山谷的高度即是问题的极值。
求解TSP,则是在此不能穷尽的丘陵地带中攀登以达到山顶或谷底的过程。
2.研究历史旅行商问题字面上的理解是:有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的具有最短路程的环路。
TSP的历史很久,最早的描述是1759年欧拉研究的骑士周游问题,即对于国际象棋棋盘中的64个方格,走访64个方格一次且仅一次,并且最终返回到起始点。
TSP由美国RAND公司于1948年引入,该公司的声誉以及线性规划这一新方法的出现使得TSP成为一个知名且流行的问题。
3.问题解法旅行推销员的问题,我们称之为巡行(Tour),此种问题属于NP-Complete 的问题,从距离矩阵中产生一个近似最佳解的途径,有以下几种解法:1、途程建构法(Tour Construction Procedures)2、途程改善法(Tour Improvement Procedure)先给定一个可行途程,然后进行改善,一直到不能改善为止。
有以下几种解法:如果成本降低(距离减少),则取代之,直到无法改善为止,K通常为2或3。
3、合成启发法(Composite Procedure)有以下几种解法:起始解求解+2-Opt:起始解求解+3-Opt:4.解法思路旅行推销员的问题,我们称之为巡行(Tour),此种问题属于NP完全问题(NP-Complete),所以旅行商问题大多集中在启发式解法。
Bodin(1983)等人将旅行推销员问题的启发式解法分成三种:途程建构法从距离矩阵中产生一个近似最佳解的途径,有以下几种解法:如1、近邻点法(Nearest Neighbor Procedure):一开始以寻找离场站最近的需求点为起始路线的第一个顾客,此后寻找离最后加入路线的顾客最近的需求点直到最后。
(像贪婪算法)2、节省法(Clark and Wright Saving):以服务每一个节点为起始解,根据三角不等式两边之和大于第三边之性质,其起始状况为每服务一个顾客后便回场站,而后计算路线间合并节省量,将节省量以降序排序而依次合并路线,直到最后。
(像Dijstra算法)3、插入法(Insertion procedures):如插入法、最省插入法、随意插入法、最远插入法、最大角度插入法等。
途程改善法先给定一个可行途程,然后进行改善,一直到不能改善为止。
有以下几种解法:1、K-Opt(2/3 Opt):把尚未加入路径的K条节线暂时取代如今路径中K条节线,并计算其成本(或距离),如果成本降低(距离减少),则取代之,直到无法改善为止,K通常为2或3。
2、Or-Opt:在相同路径上相邻的需求点,将之和本身或其它路径交换且仍保持路径方向性,合成启发法先由途程建构法产生起始途程,然后再使用途程改善法去寻求最佳解,又称为两段解法(two phase method)。
有以下几种解法:1、起始解求解+2-Opt:以途程建构法建立一个起始的解,再用2-Opt的方式改善途程,直到不能改善为止。
2、起始解求解+3-Opt:以途程建构法建立一个起始的解,再用3-Opt的方式改善途程,直到不能改善为止。
5.研究进展2010年10月25日,英国一项最新研究说,在花丛中飞来飞去的小蜜蜂显示出了轻易破解“旅行商问题”的能力,而这是一个吸引全世界数学家研究多年的大问题,如能理解蜜蜂的解决方式,将有助于人们改善交通规划和物流等领域的工作。
英国伦敦大学皇家霍洛韦学院等机构研究人员报告说,小蜜蜂显示出了轻而易举破解这个问题的能力。
他们利用人工控制的假花进行了实验,结果显示,不管怎样改变花的位置,蜜蜂在稍加探索后,很快就可以找到在不同花朵间飞行的最短路径。
这是首次发现能解决这个问题的动物,研究报告即将发表在《美国博物学家》杂志上。
进行研究的奈杰尔·雷恩博士说,蜜蜂每天都要在蜂巢和花朵间飞来飞去,为了采蜜而在不同花朵间飞行是一件很耗精力的事情,因此实际上蜜蜂每天都在解决“旅行商问题”。
尽管蜜蜂的大脑只有草籽那么大,也没有电脑的帮助,但它已经进化出了一套很好的解决方案,如果能理解蜜蜂怎样做到这一点,对人类的生产、生活将有很大帮助。
据介绍,“旅行商问题”的应用领域包括:如何规划最合理高效的道路交通,以减少拥堵;如何更好地规划物流,以减少运营成本;在互联网环境中如何更好地设置节点,以更好地让信息流动等。
6.问题分析旅行商问题要从图G的所有周游路线中求取最小成本的周游路线,而从初始点出发的周游路线一共有(n-1)!条,即等于除初始结点外的n-1个结点的排列数,因此旅行商问题是一个排列问题。
排列问题比子集合的选择问题通常要难于求解得多,这是因为n个物体有n!种排列。
通过枚举(n-1)!条周游路线,从中找出一条具有最小成本的周游路线的算法,其计算时间显然为O(n!)。
枚举法思想:程序中采用深度优先策略。
(采用隐式和显式两种形式)枚举算法的特点是算法简单,但运算量大,当问题的规模变大,循环的阶数越大,执行的速度越慢。
如果枚举范围太大(一般以不超过两百万次为限),在时间上就难以承受。
在解决旅行商问题时,以顶点1为起点和终点,然后求{2…N}的一个全排列,使路程1→{2…N}的一个全排列→1上所有边的权(代价)之和最小。
所有可能解由(2,3,4,…,N)的不同排列决定。
为便于讨论,介绍一些关于解空间树结构的术语。
在下面分析回溯法和分支限界法时都直接或间接用到解空间树。
在解空间树中的每一个结点确定所求问题的一个问题状态(problem state)。
由根结点到其它结点的所有路径则确定了这个问题的状态空间(state space)。
解状态(solution states)表示一些问题状态S,对于这些问题状态,由根到S的那条路径确定了这解空间中的一个元组。
答案状态(answer states)表示一些解状态S,对于这些解状态而言,由根到S的这条路径确定了这问题的一个解(即,它满足隐式约束条件)。
解空间的树结构称为状态空间树(state space tree)。
对于旅行商问题,一旦设想出一种状态空间树,那么就可以先系统地生成问题状态,接着确定这些问题状态中的哪些状态是解状态,最后确定哪些解状态是答案状态,从而将问题解出。
为了生成问题状态,采用两种根本不同的方法。
如果已生成一个结点而它的所有儿子结点还没有全部生成,则这个结点叫做活结点。
当前正在生成其儿子结点的活结点叫E-结点。
不再进一步扩展或者其儿子结点已全部生成的生成结点就是死结点。
在生成问题状态的两种方法中,都要用一张活结点表。
在第一种方法中,当前的E-结点R一旦生成一个新的儿子C,这个儿子结点就变成一个新的E-结点,当完全检测了子树C之后,R结点就再次成为E-结点。
这相当与问题状态的深度优先生成。
在第二种状态生成方法中,一个E-结点一直保持到死结点为止。
这两种方法中,将用限界函数去杀死还没有全部生成其儿子结点的那些活结点。
如果旅行商问题要求找出全部解,则要生成所有的答案结点。
使用限界函数的深度优先结点生成方法称为回溯法。
E-结点一直保持到死为止的状态生成方法称为分支限界法。
回溯法思想为了应用回溯法,所要求的解必须能表示成一个n- 元组(x1,…,x n),其中x1是取自某个有穷集Si。
通常,所求解的问题需要求取一个使某一规范函数P(x1,…,Xn)取极大值(或取极小值或满足该规范函数条件)的向量。
假定集合Si的大小是mi,于是就有m=m1m2…Mn个n-元组可能满足函数P。
所谓硬性处理是构造这m个n-元组并逐一测试它们是否满足P,从而找出该问题的所有最优解。
而回溯法的基本思想是,不断地用修改过的函数Pi(x1,…Xi)(即限界函数)去测试正在构造中的n-元组的部分向量(x1,…,Xi),看其是否可能导致最优解。
如果判定(x1,…,Xi)不可能导致最优解,那么就可能要测试的后n-i个元素组成的向量一概略去。
因此回溯法作的次数比硬性处理作的测试次数(m次)要少得多。
用回溯法求解的旅行商问题,即在枚举法的基础上多了一个约束条件,约束条件可以分为两种类型:显示约束和隐式约束。
分支限界法思想:本题采用FIFO分支限界法。
如前所述,分支限界法是在生成当前E-结点全部儿子之后再生成其它活结点的儿子,且用限界函数帮助避免生成不包含答案结点子树的状态空间的检索方法。
在总的原则下,根据对状态控件树中结点检索的次序的不同又将分支限界设计策路分为数种不同的检索方法。
在求解旅行商问题时,程序中采用FIFO检索(First In First Out),它的活结点表采用一张先进先出表(即队列)。
可以看出,分支限界法在两个方面加速了算法的搜索速度,一是选择要扩展的节点时,总是选择选择一个最小成本的结点,尽可能早的进入最有可能成为最优解的分支;二是扩展节点的过程中,舍弃导致不可行解或导致非最优解的子结点。
贪心法思想贪心法是一种改进了的分级处理方法。
它首先旅行商问题描述,选取一种度量标准。
然后按这种度量标准对n个输入城市排序,并按序一次输入一个城市。
如果这个输入和当前已构成在这种量度意义下的部分最优解加在一起不能产生一个可行解,则不把这个城市加入到这部分解中。
这种能够得到某种量度意义下的最优解的分级处理方法成为贪心方法。
获得最优路径的贪心法应一条边一条边地构造这棵树。
根据某种量度来选择将要计入的下一条边。