数据结构 程序设计 TSP n城市旅行问题
- 格式:doc
- 大小:88.50 KB
- 文档页数:10
旅行商问题(traveling saleman problem,简称tsp):已知n 个城市之间的相互距离,现有一个推销员必须遍访这n 个城市,并且每个城市只能访问一次,最后又必须返回出发城市。
如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短?用图论的术语来说,假设有一个图g=(v,e),其中v 是顶点集,e 是边集,设d=(dij)是由顶点i 和顶点j 之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶点且每个顶点只通过一次的具有最短距离的回路。
这个问题可分为对称旅行商问题(dij=dji,,任意i,j=1,2,3,…,n)和非对称旅行商问题(dij ≠dji,,任意i,j=1,2,3,…,n)。
若对于城市v={v1,v2,v3,…,vn}的一个访问顺序为t=(t1,t2,t3,…,ti,…,tn),其中ti∈v(i=1,2,3,…,n),且记tn+1= t1,则旅行商问题的数学模型为:min l=σ d(t(i),t(i+1)) (i=1,…,n)旅行商问题是一个典型的组合优化问题,并且是一个np 难问题,其可能的路径数目与城市数目n 是成指数型增长的,所以一般很难精确地求出其最优解,本文采用遗传算法求其近似解。
遗传算法:初始化过程:用v1,v2,v3,…,vn 代表所选n 个城市。
定义整数pop-size 作为染色体的个数,并且随机产生pop-size 个初始染色体,每个染色体为1 到18 的整数组成的随机序列。
适应度f 的计算:对种群中的每个染色体vi,计算其适应度,f=σ d(t(i),t(i+1)). 评价函数eval(vi):用来对种群中的每个染色体vi 设定一个概率,以使该染色体被选中的可能性与其种群中其它染色体的适应性成比例,既通过轮盘赌,适应性强的染色体被选择产生后台的机会要大,设alpha ∈(0,1) ,本文定义基于序的评价函数为eval(vi)=alpha*(1-alpha).^(i-1) 。
TSP问题的解决与实现讲解1. 问题描述所谓TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次,并且要求所走的路程最短。
该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。
2. 基本要求(1) 上网查找TSP问题的应用实例;(2) 分析求TSP问题的全局最优解的时间复杂度;(3) 设计一个求近似解的算法;(4) 分析算法的时间复杂度。
3. 提交报告课程设计报告提交内容包括:(1) 问题描述;(2) 需求分析;(3) 概要设计;(4) 详细设计;(5) 调试分析;(6) 使用说明;(7) 测试结果;(8) 附录(带注释的源程序)。
参见“数据结构课程设计概述.pdf”和“数据结构课程设计示例.pdf”。
指导教师(签字):系主任(签字):批准日期:2014年月日1.问题描述(1)题目要求旅行家要旅行n个城市,要求各个城市经历且仅经历一次,最终要回到出发的城市,求出最短路径。
用图论的术语来说,假如有一个图G=(V,E),其中V是顶点集,E是边集,设D=(d)是由ij顶点i和顶点j之间的距离所组成的距离矩阵。
TSP问题就是求出一条通过每个顶点且每个顶点只通过一次的具有最短距离的回路。
(2)基本要求a. 上网查找TSP 问题的应用实例;b. 分析求TSP 问题的全局最优解的时间复杂度;c. 设计一个求近似解的算法;d. 分析算法的时间复杂度。
(3)测试数据5个城市的TSP 问题:注:由于矩阵所表示的是两个城市之间的距离,所以该矩阵为对称矩阵路程矩阵如图所示:最短路径为v 0v 1v 4v 2v 32.需求分析(1)本程序用于求解n 个结点的最短哈密尔顿回路问题。
(2)程序运行后显示提示信息—“Please insert the number of cities:”,例如用户输入5,则表示结点n 的值为5;接下来程序输出提示信息—“Please insert the distance between one city and another:”,例如用户输入测试数据中给出的路程矩阵,表示任意两个城市之间的距离,比如第一个城市到第0个城市之间的距离为25。
旅行商问题的求解方法摘要旅行商问题(TSP问题)时是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。
该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。
本文主要介绍用蛮力法、动态规划法、贪心法和分支限界法求解TSP问题,其中重点讨论动态规划法和贪心法,并给出相应求解程序。
关键字:旅行商问题;动态规划法;贪心法;分支限界法1引言旅行商问题(TSP)是组合优化问题中典型的NP-完全问题,是许多领域内复杂工程优化问题的抽象形式。
研究TSP的求解方法对解决复杂工程优化问题具有重要的参考价值。
关于TSP的完全有效的算法目前尚未找到,这促使人们长期以来不断地探索并积累了大量的算法。
归纳起来,目前主要算法可分成传统优化算法和现代优化算法。
在传统优化算法中又可分为:最优解算法和近似方法。
最优解算法虽然可以得到精确解,但计算时间无法忍受,因此就产生了各种近似方法,这些近似算法虽然可以较快地求得接近最优解的可行解,但其接近最优解的程度不能令人满意。
但限于所学知识和时间限制,本文重点只讨论传统优化算法中的动态规划法、贪心法和分支限界法,并对蛮力法做简单介绍,用以比较。
2正文2.1蛮力法2.1.1蛮力法的设计思想蛮力法所依赖的基本技术是扫描技术,即采用一定的策略将待求解问题的所有元素一次处理一次,从而找出问题的解。
一次处理所有元素的是蛮力法的关键,为了避免陷入重复试探,应保证处理过的元素不再被处理。
在基本的数据结构中,一次处理每个元素的方法是遍历。
2.1.2算法讨论用蛮力法解决TSP问题,可以找出所有可能的旅行路线,从中选取路径长度最短的简单回路。
如对于图1,我们求解过程如下:(1)路径:1->2->3->4->1;路径长度:18;(2)路径:1->2->4->3->1;路径长度:11;(3)路径:1->3->2->4->1;路径长度:23;(4)路径:1->3->4->2->1;路径长度:11;(5) 路径:1->4->2->3->1;路径长度:18;(6) 路径:1->4->3->2->1;路径长度:18;从中,我们可以知道,路径(2)和(4)路径长度最短。
贪心法求解TSP问题一目的利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C++语言进行程序设计,并规范地完成课程设计报告。
通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。
二需求分析1、问题描述TSP(Traveling Salesman Problem )是指:有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的具有最短路程的环路。
2、解法分析采用贪心法求解:任意选择某个城市作为出发点,然后前往最近的未访问的城市,直到所有的城市都被访问并且仅被访问一次,最后返回到出发点。
要求这时遍历各城市的距离为最短距离。
3、功能要求输入城市的数量和城市间的距离,要求输入的为整数。
结果为输出最短路径和遍历的最短距离,要求为整数。
三概要设计1、为便于查找离某顶点最近的邻接点,采用邻接矩阵存储该图算法描述如下:(1).任意选择某个顶点i作为出发点;(2).执行下述过程,直到所有顶点都被访问:(3).i=最后一个被访问的顶点;(4).在顶点i的邻接点中查找距离顶点i最近的未被访问的邻接点j;(5).访问顶点j;(6).从最后一个访问的顶点直接回到出发点i。
2、最近邻点策略从任意城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市,具体求解过程举例如下:3、程序设计组成框图:TSP 输入城市的数量与各城市之间的距离循环遍历找到与起始城市最近的城市,用flag[]保存该城市序号,用min[]保存最短路径输出flag[],得到最佳路径用sum+=min[]求出最短路径4、流程图:5、方法与数据解释:public void initDistance()方法作用:存储个城市间的距离,及城市的数目。
TSP问题一,实验目的熟悉图的数据结构,学会解决实际问题二,实验内容旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
路径的选择目标是要求得的路径路程为所有路径之中的最小值。
三,设计与编码#include<iostream>using namespace std;const int MaxSize = 10;const int Max = 100;int Min(int arr[],int n);class MGraph{public:MGraph(char city[], int n, int e);~MGraph(){}void TSP(int v);private:char vertex[MaxSize];int arc[MaxSize][MaxSize];int vertexNum, arcNum;};int visited[MaxSize] = {0};int main(){char city[] = {'A','B','C','D','E'};MGraph MG(city, 5, 10);MG.TSP(0);return 0;}void MGraph::TSP(int v){cout << vertex[v]; visited[v] = 1;int i = 0,j = 0, s = 0;int log = 0;for(;log < vertexNum;log++){j = Min(arc[i],vertexNum);visited[j] = 1;cout << "->" << vertex[j];i = j;}}int Min(int *p,int n){int start = 0, min = p[0], k = 0;while(visited[start] == 1){start++;min = p[start];}for(;start < n;start++){if((visited[start] == 0) && (min >= p[start])){k = start;min = p[k];}}return k;}//构造函数MGraph::MGraph(char city[], int n, int e){vertexNum = n;arcNum = e;//存储顶点信息for(int i = 0; i < vertexNum; i++)vertex[i] = city[i];//初始化图的邻接矩阵for(int i = 0; i < vertexNum; i++)for(int j = 0; j < vertexNum; j++)arc[i][j] = 100;//存储图的边信息int i,j,weight;for(int k = 0; k < arcNum; k++){cout << "请输入边的两个顶点的序号及其权值:";cin >> i >> j >> weight;arc[i][j] = weight;arc[j][i] = weight;}}四,运行与测试五,总结与心得通过对实际问题的解决,巩固了课本知识,提高了编写代码的能力。
一、问题描述TSP ,即Traveling Saleman Problem ,也就是旅行商问题,又译为旅行推销员问题、货郎担问题,简称为TSP 问题,是最基本的路线问题。
TSP 的历史很久,最早的描述是1759年欧拉研究的骑士周游问题,即对于国际象棋棋盘中的64个方格,走访64个方格一次且仅一次,并且最终返回到起始点。
TSP 问题指一个旅行商,n 个城市。
旅行商要从这一个出发地出发,择一条路径(哈密顿回路),对n 个城市中的每一个城市进行一次且仅一次的访问,最后回到出发地.其目标是得到所有可行路径之中的最小路径,或旅行时间最短,或旅行费用最少等。
如图1,图2所示,为一个5个城市的TSP 问题描述(仅画出两种方案),显然图1和图2的路线都满足遍及所有城市的要求,但是图2的路线长度要远小于图1的路线长度,而解TSP 问题的目的就是求出遍及所有城市的长度最短的路线方案。
该问题的模型可以表示为下述0/1整数规划模型:2 4 1 图13 5 1 24 35 图2{}(,j)A {:(,)}{j:(,)}{(,):,}min(1)..1(2)1(3)||12|U |||2(4)0,1ij ij i ij i i j A ij i j A ij i j A i U j U ij c x st x j Vx i Vx U V x ∈∈∈∈∈∈=∈=∈≤-≤≤-∈∑∑∑∑n :所要访问的城市数目。
V :所有访问的城市集。
.U :所有访问的城市集的真子集,即V U ⊂。
A :连接任意两个点的弧组成的集合。
()j i :所要访问的第()j i 个城市,即V j i ∈,。
ij c :相邻两个城市间距离。
如果 j i =,则0=ij c 。
()⎩⎨⎧=其他城市城市后紧接着访问如果访问01,j i j i X二、总结和展望禁忌搜索算法是对人类思维过程本身的一种模拟,其特点是采用了禁忌技术,它通过对一些局部最优解的禁忌达到接纳一部分较差解,从而跳出局部搜索的目的。
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)。
实验三10个城市的TSP问题一、问题描述旅行商问题旅行商按一定的顺序访问N个城市的每个城市,使得每个城市都能被访问且仅能被访问一次,最后回到起点,而使花费的代价最小。
二、设计思想1、算法的选择这是一个NP完全问题,穷举法显然是不可取的。
由于初始态和最终态无法界定,因此没有采用了A*算法。
通过查阅资料,发现模拟退火算法能较好地解决这一问题。
2、算法思想模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。
用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。
3、算法描述模拟退火算法与初始值无关,算法求得的解与初始解状态S(是算法迭代的起点)无关;模拟退火算法具有渐近收敛性,已在理论上被证明是一种以概率p 收敛于全局最优解的全局优化算法。
接受概率p=exp(-Δf/Ti)。
求解TSP的模拟退火算法模型可描述如下:解空间:解空间S是遍访每个城市恰好一次的所有路经,解可以表示为{w1,w2 ,……, wn},w1, ……, wn是1,2,……,n的一个排列,表明w1城市出发,依次经过w2, ……, wn城市,再返回w1城市。
初始解可选为(1,……, n) ;目标函数:目标函数为访问所有城市的路径总长度;我们要求的最优路径为目标函数为最小值时对应的路径。
新路径的产生:随机产生1和n之间的两相异数k和m,不妨假设k<m,则将原路径(w1,w2,…,wk,wk+1,…,wm,wm+1,…,wn)变为新路径:(w1,w2,…,wm,wk+1,…,wk,wm+1,…,wn)上述变换方法就是将k和m对应的两个城市在路径序列中交换位置,称为2-opt映射。
c# TSP设计思路1问题分析TSP问题是一个经典的数学问题:当有N个城市,一个旅行商需要贩卖货物走遍所有城市后回到出发城市,求其最短路径的解。
由于遗传算法方法的本质是处理复杂问题的一种随机搜索算法, 因此利用遗传算法求解TSP问题是方便和快速的。
2算法说明:<1> 初始化群体:设N个城市,n个子群体,每个子群中m个个体,初始设计交叉概率,变异概率,lchrom : 城市数量pcross:交叉的概率pmutation:变异的概率co_min:时间选择;使用遗传算法目前数学界已经有标准定义,我们只要按照标准算法,即可求解出TSP问题的最优解法:算法定义包括包括群体的初始化,选择,交叉,变异操作。
其主要步骤可描述如下:(1)随机产生一组初始个体构成的初始种群,并评价每一个个体的适配值。
(2)判断算法的收敛准则是否满足。
若满足输出搜索结果;否则执行以下步骤。
(3)根据适配值大小以一定方式执行选择操作。
(4)按交叉概率Pc执行交叉操作.(5)按变异概率Pm执行变异操作。
(6)返回步骤(2)。
本TSP问题的遗传算法总体设计总体设计说明:(1)本算法的判断结束准则是固定指定了迭代的次数当算法达到迭代次数时,算法结束,输出当前的最优解(2)在根据适配值计算并选择的时候,记录下来的当前最优值,在变异后加入跟新的群体,保证新的迭代循环中TSP解越来越好(不会变差)。
(3)在选择的一种操作是拿最优的K个替换最差的K个个体,本例是按适配值选择,并使群体数目变少,当每次变异操作后,产生随机路径补充群体是群体数目不变,再次循环,一定程度上防止因初始群体的选择问题而陷入局部最优。
2 详细设计2.1 编码与随机和初始群体生成给所有城市编码,以城市的遍历次序作为遗传算法的编码。
在MATLAB中使用randperm(N)产生一个1×N 的矩阵(N为所有城市的个数,本例中为31)为一个随机路径。
利用n×N矩阵存储n个随机群体产生初始群体。