数据结构与算法.ppt

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

(2)旅行商问题 解空间是排列树 可采用Page8的Perm函数,产生n个元素表的所有排列 作为类AdjacencyWDigraph的成员 * * 使用递归函数生成排列(P7 例1-3) 【例】a,b,c的排列方式有:abc,acb,bac,bca,cab,cba。共6种(n个元素的排列方式共有n!种) 令E{e1,…,en}表示n个元素的集合。 令Ei为移去元素i后所得的集合, perm(X)表示集合X中元素的排列方式, ei.perm(X)表示在perm(X)中的每个排列方式的前面均加上ei以后所得到的排列方式。 例如,若E={a,b,c},则E1={b,c},perm(E1)={bc,cb}, e1.perm(E1)={abc,acb} * * 使用递归函数生成排列(P7 例1-3) 【递归出口】n=1。当只有一个元素时,只可能产生一种排列方式,即perm(E)=e,其中e是E中唯一的元素。 当n1时,perm(E) =e1.perm(E1)+e2.perm(E2)+e3.perm(E3)+…en.perm(En) 即采用n个perm(X)来定义perm(E),其中每个X包含n-1个元素。 【例】当n=3,并且E={a,b,c} 则,perm(E)=a.perm({b,c})+b.perm({a,c})+c.perm({a,b}) perm({b,c})=b.perm(c)+c.perm(b) a.perm({b,c})=ab.perm(c)+ac.perm(b)=ab.c+ac.b=(abc,acb) * * 使用递归函数生成排列(P7 例1-3) a.perm({b,c})包含两个排列式:abc和acb, a是它们的前缀,perm({b,c})是它们的后缀 同样,ac.perm({b})表示前缀ac,后缀为perm({b})的排列方式。 程序1-10输出所有前缀为list[0:k-1],后缀为list[k,m]的排列方式。 * * 使用递归函数生成排列(程序1-10) templateclass T void Perm(T list[], int k, int m) {// Generate all permutations of list[k:m]. int i; if (k == m) { // 输出一个排列方式 for (i = 0; i = m; i++) cout list[i]; cout endl; } * * 使用递归函数生成排列(程序1-10) else // list[k:m] has more than one permutation // generate these recursively for (i = k; i = m; i++) { Swap(list[k], list[i]); Perm(list, k+1, m); Swap(list[k], list[i]); } } * * 预处理程序:TSP templateclass T T AdjacencyWDigraphT::TSP(int v[ ]) { x = new int [n+1]; 保存到当前节点的路径 for (int i = 1; i = n; i++) x[i] = i; bestc = NoEdge; bestx = v; 保存最优解路径 cc = 0; tSP(2); 搜索x[2:n]的各种排列 delete [] x; return bestc; 返回最优解耗费 } * * tSP函数 结构与Perm函数相同。 当i=n时,处在排列树的叶节点的父节点上,并且需要验证从x[n-1]到x[n]有一条边,从x[n]到起点x[1]也有一条边。若两边都存在,则发现一个新旅行。若发现的旅行是目前发现的最优旅行,则将旅行和它的耗费分别存入bestx和bestc中。 当in时,检查当前i-1层节点的孩子节点,并且仅当以下情况出现时,移动到孩子节点之一: (1)有从x[i-1]到x[i]的一条边(如果是的话,x[1:i]定义了网络中的一条路径); (2)路径x[1:i]的耗费小于当前的最优解的耗费. 变量cc保存目前所构造的路径的耗费。 * * 迭代回溯算法:tSP templateclass T a[N][N]表示两个节点之间是否有边 void Adj

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档