- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
旅行售货员问题
1)回溯法求解问题的一般思路,回溯法求解本问题的思路及其C/C++程序实现及效率分析。
2)分支限界法求解问题的一般思路,分支限界法求解本问题的思路及其C/C++程序实现及效率分析
解答:
1) 回溯法求解问题的一般思路,回溯法求解本问题的思路及其C/C++程序实现及效率分析。
思路:
旅行售货员问题的解空间是一棵排列树。对于排列树的回溯搜索与生成1,2,…,n的所有排列的递归算法perm类似。开始时,相应的排列树由的所有排列构成。
在递归算法backtrack中,当i=n时,当前的扩展结点是排列树的叶结点的父结点。此时算法检测图G是否存在一条从顶点到顶点的边和从顶点到顶点1的边。如果这两条边都存在,则找到一条旅行售货员回路。此时算法还需要判别这条回路的费用是否优于当前已经找到的最优回路的费用bestc。如果是,则必须更新当前的最优值bestc和当前的最优解bestx。
当时,当前的扩展结点位于排列树的第层。图G中存在从顶点 到达顶点的边时,构成图G中的一条路径,且当的费用小于当前最优值时算法进入排列树的第i层;否则,则剪去相应的子树。算法中用变量cc记录当前路径的费用。
代码:
# include iostream
using namespace std;
const int NoEdge=-1;
const int MAX=20;
int G[MAX][MAX];
int ans[MAX],x[MAX];
int bestc,cc;
void init(int n)
{ int i,j,len; memset(G,NoEdge,sizeof(G));
while( cinij )
{ if( i==0 j==0 ) break;
cinlen; G[i][j]=len ; G[j][i]=len; }
for(i=1;i=n;i++) x[i]=i;
bestc=0x7fffffff;
cc=0; }
void Swap( int i,int j)
{ int t=I ; i=j; j=t; }
void BackTrack(int i,int n)
{ int j;
if(i==n+1)
{ if(G[ x[n-1] ][ x[n] ] != NoEdge G[ x[n] ][1] != NoEdge
(cc + G[ x[n] ][1] bestc ) )
{ for(j=1;j=n;j++) ans[j] = x[j];
bestc = cc + G[ x[n] ][ 1 ]; } }
else
{ for(j=i;j=n;j++)
{ if( G[ x[i-1] ][ x[j] ] != NoEdge (cc + G[ x[i-1] ][ x[j] ] bestc) )
{ Swap( x[i],x[j] );
cc += G[ x[i-1] ][ x[i] ];
BackTrack(i+1,n);
cc -= G[ x[i-1] ][ x[i] ];
Swap( x[i],x[j] );
} } } }
void print(int n)
{ cout最小的旅行费用为:bestcendl;
cout最佳路径是:;
for(int i=1;i=n;i++)
coutans[i]-;
coutans[1]endl; }
int main()
{ int n;
while( cinnn )
{ init(n);
BackTrack(2,n);
print(n) ; } return 1; }
效率分析:
如果不考虑更新bestx所需的计算时间,则算法backtrack需要 计算时间。由于算法backtrack在最坏的情况下可能需要更新当前最优解 次,每次更新bestx需 计算时间,从而整个算法的计算时间复杂性为 。
2)分支限界法求解此问题
基本思想:
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树时表示问题解空间的一棵有序树,常见的由子集树和排列树。在搜索问题的解空间树时,分支限界法与回溯法的主要不同在于它们对当前扩展结点所采用的扩展方式。在分支限界法中,每一个活结点只有一次机会成为扩展检点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点总,导致不可行的解或者非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后从活结点表中取下一结点成为当前扩展结点,并重复上述扩展过程。这个过程一直持续到找到所需的解或活结点表空为止。
代码:
#inc
文档评论(0)