动态规划法回溯法分支限界法求解TSP问题实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划法回溯法分支限界法求解T S P问题实
验报告
文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]
TSP问题算法实验报告指导教师:季晓慧
姓名:辛瑞乾
学号:
提交日期: 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的最短路径长度
1.初始化第0列(动态规划的边界问题)
for(i=1;i dp[i][0]=mp[i][0] 2.依次处理每个子集数组x[2^n-1] for(i=1;i if(子集x[j]中不包含i) 对x[j]中的每个元素k,计算d[i][j]=min{mp[i][k]+dp[k][j-1]}; 3.输出最短路径长度。 实现代码 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define debug "output for debug\n" #define pi (acos) #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 | 1 using namespace std; 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; i { for(int j=0; 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; i { dp[i][0]=mp[i][0]; } dp[0][mx-1]=inf; for(int j=1; j<(mx-1); j++) { for(int i=1; i { if((j&(1<<(i-1)))==0) { int x,y=inf; for(int k=1; k { if((j&(1<<(k-1)))>0){ x=dp[k][(j-(1<<(k-1)))]+mp[i][k]; y=min(y,x); } } dp[i][j]=y; } } } dp[0][mx-1]=inf; for(int i=1;i dp[0][mx-1]=min(dp[0][mx-1],mp[0][i]+dp[i][(mx-1)-(1<<(i-1))]); printf("%d\n",dp[0][mx-1]); } return 0; } 输入输出截图 OJ提交截图 算法优化分析 该算法需要对顶点集合{1,2,…,n-1}的每一个子集进行操作,因此时间复杂度为O(2^n)。和蛮力法相比,动态规划法求解TSP问题,把原来的时间复杂度是O(n!)的排列问题,转化为组合问题,从而降低了算法的时间复杂度,但仍需要指数时间。