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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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!)的排列问题,转化为组合问题,从而降低了算法的时间复杂度,但仍需要指数时间。

相关文档
最新文档