实验时间 | 12 月 1 日星期 3第1 节 |
实验目的 | 1. 熟悉C++语言的运行环境的使用。 2. 掌握分支限界法基本思想和解决问题的一般技巧。 3. 掌握分支限界算法的实现方式。 4. 掌握分支限界算法时间复杂度分析的方法和步骤。 |
实验环境 | 博思平台 |
实验内容(步骤、方法、算法、程序) | (1)题目要求:设计算法处理最大团问题:给定无向图 G = < V, E >, 其中顶点集 V = { 1, 2, … , n },边集为 E .求解包含顶点数目最多的完全子图,输出最大团中顶点序号.输出格式参照输出结果。 (2)问题分析: 采用分支限界来处理,解向量为<x1,x2,…xn>,每个分量取值为1或者0,1代表把相应顶点放入最大团中,0代表不把相应顶点放入最大团,定义界:当前已检索到的极大团的顶点数,代价函数:目前的团可能扩张为极大团的顶点数上界F = C+ n – k,其中 C 为目前团的顶点数(初始为0),k 为结点层数,解向量对应的搜索空间为一颗2叉树,从根结点开始,采用深度优先方式进行遍历,遍历过程中判断当前结点是否满足团限制以及当前结点代价函数值是否大于当前界,如果不满足,则回溯父节点,如果满足则继续下一层遍历,直到把所有分支遍历完。 ![]() (3)算法设计: 伪代码如下(仅供参考): ![]() (4)实验结果: 例如 假设给定的图G如下 ![]() 则程序输出如下: 最大团中顶点序号为:1 2 6 7 (1)题目要求:设计算法求解布朗问题(旅行售货员问题),给定n个城市,以及城市之间的距离,输出巡回路线,将所有城市都走且仅走一遍,最后回到起点,输出最短长度的路径,输出格式参照输出结果。
![]() (2)问题分析: 解向量为<x1,x2,…,xn>,其中x1确定为1,每个分量xi取值集合为{2, .., n},解向量对应的搜索空间为一颗排列树,从根结点开始,采用深度优先方式进行遍历,遍历过程中结合已经选过的城市不能再选择,以及当前结点代价函数值和界的关系,限制来删减某些分支,遍历到叶子结点,对应一个可行解,遍历所有分支,找到其中的最优解。 ![]() (3)算法设计:伪代码如下(仅供参考): ![]() (4)实验结果: 例如:如果给定的城市间的距离如下图,城市数为4
![]() 则程序输出结果为: 最短路径为:1 2 4 3 路径长度为:23 |
部分源程序代码/实验配置 | 1. ![]() ![]() 2. ![]() ![]() ![]() |
实验结果与结论 | |
算法的时间复杂度分析(描述算法的时间复杂度,及其推导过程和结果) | 限界函数时间复杂度为O(n),而最坏情况有2^(n +1) – 2个节点,若对每个节点用限界函数判断,则其时间复杂度为O(n2^n).而算法中时间复杂度主要依赖限界函数,则算法的时间复杂度为O(n2^n)。 |
指导教师 评议 | 成绩评定: 指导教师签名: |
算法设计实验——分支限界法
最新推荐文章于 2023-10-14 08:39:43 发布