变形的KRUSKAL法解决巡回售货员问题.DOCVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
变形的KRUSKAL法解决巡回售货员问题 软件工程二班 莫承长 23号 一、思想 1.选择一条最短的边作为部分解。 2.选择一条最短的且将之加入到部分解不形成回路的边。 3.重复第2步,直至所有的结点都包含在部分解中。 关于巡回售货员问题有如下算法。 1)选择一条最短的边作为部分解。 2)选择一条长度最短,且满足下述条件的边加入到部分解中: 将之加入到部分解中去不会形成 (i)叉路(如图中绿线),即一个结点最多允许有两个结点与之相连 (ii)回路 (如图中红线,最后一次则要求形成回路)         3)重复第2步n-1次 因为c是稀疏矩阵。为节省空间可用其它形式来表示城市间的距离。例如用下述的二维数组: int ARC[M][3] ; 其中M是图所含有的边的数目的最大值,对于每一条边记录(起点城市,终点城市,距离),城市用整数表示。 4.变形的KRUSKAL法解题过程中部分解由若干段路径组成, 每条路径只须记载其两个端点, 即将一段路径的起点和终点作成一个记录, 这些记录用一个链连接起来。当部分解由两段路径ABC , DE组成时,链如图所示。 每次选择长度最短的边(X,Y),则须考虑三种可能的情况: (1)所选择的边不和部分解的任何路径段连接成更长的路径段,此时只要将(X,Y)作为一条路径段的记录加到链中去。 (2)所选择的边(X,Y)可与部分解中的一条路径段连接得到更长的路径段(如图)。此时要做的事情有三件: B B Y X A 图中带箭头的边为所选择,起点和终点的标记分别为X和Y。 段的一端和X相重, 另外一端为A。 数组ARC中若有边(A,Y)则将之删除,这是为了避免形成回路。 将所有与X相关的其它边从数组 ARC中删除,这是为了避免形成叉路。 链LIST中有一个关于路径段(A, X)的记录 将之改为路径段(A,Y)的记录。 B B Y X A ^ A X list (3) 所选择的边(X,Y)可与部分解中的两条路径段相连接。要做的事有四件。 图中带箭头的边为所选择. 其起点和终点分别是X和Y. 两段路径的另一端点分别为A和B. (i) 数组ARC中若有边(A,B),则将之删除,否则会出现回路。 (ii) 将所有与X相关的边、所有与Y相关的边从数组ARC中删除,否则会出现岔路。 iii) 链LIST中关于路径段(A,X)的记录,改为路径段(A,B)的记录。 (iv) 将关于路径段(B,Y)的记录从链LIST中删除。 因此选择了一条边(X,Y)之后,要判断这条边属于这三种情况的哪一种。这三种情况,分别对应于 1)结点X、Y都不出现在链的记录中 2)结点X、Y只有一个出现在链的记录中 3)结点X、Y两者都出现在链的记录中 二、程序流程 A、读入城市数目, 存放在N中;读入关于边的信息,存放在数组ARC中。 B、将ARC中的边按长度排序。 C、初始化 COST=0; LIST=NULL;//链头变量为LIST K=0; //数组ARC的下标 D、依次选择N条边 E、扫描ARC数组, 其中长度不为MAXINT或没有被打标记的边有N条,这些边就是上一步所选择的N条边. 将它们按结点排列并打印出来,即为问题的解。 三.程序实现代码 #define MAXINT 2989 #include stdio.h #include malloc.h #define LEN sizeof (struct chain) struct chain *P1,*P2; int static X,Y; int static ARC[13][3], COST=0,r[5]; struct chain { int port1; int port2; struct chain *next; } struct chain *creat() { struct chain *head,*p1,*p2; head=p1=p2=(struct chain*) malloc(LEN); p1-port1=p1-port2=p1-next=NULL; return(head); } Read() {int i; printf(Input the information of the side:); for(i=0;i13;i++) { printf(The %dth sides length:,i); scanf(%d,ARC[i][3]); printf(Its Firs

文档评论(0)

sunhongz + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档