好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

16页
  • 卖家[上传人]:世***
  • 文档编号:168075269
  • 上传时间:2021-02-17
  • 文档格式:DOCX
  • 文档大小:131.49KB
  • / 16 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • TSP问题算法实验报告指导教师: 季晓慧 姓 名: 辛瑞乾 学 号: 提交日期: 2015年11月 目录总述 2动态规划法 2算法问题分析 2算法设计 2实现代码 2输入输出截图 5OJ提交截图 5算法优化分析 5回溯法 5算法问题分析 5算法设计 6实现代码 6输入输出截图 8OJ提交截图 8算法优化分析 9分支限界法 9算法问题分析 9算法设计 9实现代码 9输入输出截图 14OJ提交截图 14算法优化分析 14总结 15总述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#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(-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 = ;const int Max = ;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; i0){ 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

      和蛮力法相比,动态规划法求解TSP问题,把原来的时间复杂度是O(n!)的排列问题,转化为组合问题,从而降低了算法的时间复杂度,但仍需要指数时间回溯法算法问题分析回溯法求解TSP问题,首先把所有的顶点的访问标志初始化为0,然后在解空间树中从根节点出发开始搜索,如果从根节点到当前结点对应一个部分解,即满足上述约束条件,则在当前结点处选择第一棵子树继续搜索,否则,对当前子树的兄弟结点进行搜索,如果当前结点的所有子树都已尝试过并且发生冲突,则回溯到当前结点的父节点采用邻接矩阵mp[n][n]存储顶点之间边的情况,为避免在函数间传递参数,将数组mp设置为全局变量,设数组x[n]表示哈密顿回路经过的顶点算法设计输入:无向图G=(V,E)输出:哈密顿回路1、 将顶点数组x[n]初始化为0,标志数组vis[n]初始化为0;2、 从顶点0出发构造哈密顿回路:vis[0]=1;x[0]=1;k=1;3、 While(k>=1)3.1、x[k]=x[k]+1,搜索下一个顶点3.2、若n个顶点没有被穷举完,则执行下列操作 3.2.1、若顶点x[k]不在湖密顿回路上并且(x[k-1],x[k])∈E,转步骤3.3; 3.2.2、否则,x[k]=x[k]+1,搜索下一个顶点。

      3.3、若数组x[n]已经形成哈密顿路径,则输出数组x[n],算法结束;3.4、若数组x[n]构成哈密顿路径的部分解,则k=k+1,转步骤3;3.5、否则,取消顶点x[k]的访问标志,重置x[k],k=k-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(-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;int mp[20][20];int x[30],vis[30];int n,k,cur,ans;void init(){ for(int i=0;i

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.