- 1、本文档共57页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 旅行售货员问题(1) 基本思想(优先队列式分支限界法): 1) 使用最小堆表示活结点优先队列。堆中每个结点的子树费用的下界lcost值是优先队列的优先级。每个顶点的最小费用出边并用MinOut记录,如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法结束。如每个顶点都有出边,则根据MinOut作算法初始化。 2) 使用while循环处理排列树 (分2种情况处理当前扩展结点): a) s=n-2:此时当前扩展结点是排列树中某个叶结点的父结点。如果该叶结点存在相应一条可行回路且费用小于当前最小费用,则将该叶结点插入到优先队列中,否则舍去该叶结点。 b) sn-2:依次产生当前扩展结点的所有儿子结点。由于当前扩展结点所相应的路径是x[0:s],其可行儿子结点是从剩余顶点x[s+1:n-1]中选取的顶点x[i],且(x[s],x[i])是所给有向图G中的一条边。对于当前扩展结点的每一个可行儿子结点,计算出其前缀(x[0:s],x[i])的费用cc和相应的下界lcost。当lcostbestc时,将这个可行儿子结点插入到活结点优先队列中。 3) 算法中while循环的终止条件是排列树的一个叶结点成为当前扩展结点。当s=n-1时,已找到的回路前缀是x[0:n-1],它已包含图G的所有n个顶点。因此,当s=n-1时,相应的扩展结点表示一个叶结点,此时该叶结点所相应的回路的费用等于cc和lcost的值。剩余的活结点的lcost值不小于已找到的回路的费用。它们都不可能导致费用更小的回路。 算法结束时返回找到的最小费用,相应的最优解由数组v给出。 * 旅行售货员问题(2) 实现-定义部分: Template class Type class Traveling{ friend void main(void); public: Type BBTSP(void);//核心函数 private: int n; //顶点数 Type **a, //邻接矩阵 NoEdge, //无边标志 cc, //当前费用 bestc; //当前最小费用 }; Template class Type class MinHeapNode{ friend TravelingType; public: operator Type() const{return cost;} private: int lcost; //子树费用的下界 int cc; //当前费用 int rcost; //x[s:n-1]中顶点最小出边费用和 int s; //根节点到当前节点的路径为x[0:s] int *x; //需要进一步搜索的顶点是x[s+1:n-1]}; * 旅行售货员问题(3) 实现-核心函数BBTSP1: templateclass Typeint BBTSP(int v[]){//优先队列式分支限界法 MinHeapMinHeapNodeType H(1000); int *MinOut = new int[n + 1]; //最小出边费用 int MinSum = 0;//最小出边费用总和 for(int i = 1; i = n; i++){ ??int Min = NoEdge;?? for(int j = 1; j = n; j++)??? if( a[i][j] != NoEdge ? (a[i][j] Min || Min == NoEdge) ) ???? Min = a[i][j]; /*更新当前最小值*/?? if(Min == NoEdge) return NoEdge;//无回路?? MinOut[i] = Min; /*顶点i的最小出边费用*/?? MinSum += Min; /*最小出边费用的总和*/ } MinHeapNodeType E; E.x=new int[n]; for(i = 0; i n; i++) E-x[i] = i + 1; E.s = 0; E.cc = 0; E.rcost = MinSum; int
文档评论(0)