动态规划法_回溯法_分支限界法求解TSP问题实验报告.docx

动态规划法_回溯法_分支限界法求解TSP问题实验报告.docx

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划法_回溯法_分支限界法求解TSP问题实验报告

TSP问题算法实验报告指导教师:XX姓 名:XX学 号: 1004131114 提交日期: 2015年11月 总述TSP问题又称为旅行商问题,是指一个旅行商要历经所有城市一次最后又回到原来的城市,求最短路程或最小花费,解决TSP可以用好多算法,比如蛮力法,动态规划法…具体的时间复杂的也各有差异,本次实验报告包含动态规划法,回溯法以及分支限界法。动态规划法算法问题分析假设n个顶点分别用0~n-1的数字编号,顶点之间的代价存放在数组mp[n][n]中,下面考虑从顶点0出发求解TSP问题的填表形式。首先,按个数为1、2、…、n-1的顺序生成1~n-1个元素的子集存放在数组x[2^n-1]中,例如当n=4时,x[1]={1},x[2]={2},x[3]={3},x[4]={1,2},x[5]={1,3},x[6]={2,3},x[7]={1,2,3}。设数组dp[n][2^n-1]存放迭代结果,其中dp[i][j]表示从顶点i经过子集x[j]中的顶点一次且一次,最后回到出发点0的最短路径长度,动态规划法求解TSP问题的算法如下。算法设计输入:图的代价矩阵mp[n][n]输出:从顶点0出发经过所有顶点一次且仅一次再回到顶点0的最短路径长度初始化第0列(动态规划的边界问题)for(i=1;in;i++)dp[i][0]=mp[i][0]依次处理每个子集数组x[2^n-1]for(i=1;in;i++)if(子集x[j]中不包含i)对x[j]中的每个元素k,计算d[i][j]=min{mp[i][k]+dp[k][j-1]};输出最短路径长度。实现代码#include cstdio#include cstdlib#include cstring#include cmath#include ctime#include iostream#include algorithm#include string#include vector#include deque#include list#include set#include map#include stack#include queue#include cctype#include numeric#include iomanip#include bitset#include sstream#include fstream#define debug output for debug\n#define pi (acos(-1.0))#define eps (1e-8)#define inf 0x3f3f3f3f#define ll long long int#define lson l , m , rt 1#define rson m + 1 , r , rt 1 | 1using namespace std;const int mod = 1000000007;const int Max = 100005;int n,mp[20][20],dp[20][40000];int main(){ while(~scanf(%d,n)) { int ans=inf; memset(mp,0,sizeof mp); for(int i=0; in; i++) { for(int j=0; jn; j++) { if(i==j) { mp[i][j]=inf; continue; } int tmp; scanf(%d,tmp); mp[i][j]=tmp; } } int mx=(1(n-1)); dp[0][0]=0; for(int i=1; in; i++) { dp[i][0]=mp[i][0]; } dp[0][mx-1]=inf; for(int j=1; j(mx-1); j++) { for(int i=1; in; i++) { if((j(1(i-1)))==0)

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档