




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第八章第八章 分支与限界分支与限界 8.1 分支与限界法的基本思想分支与限界法的基本思想 8.2 作业分配问题作业分配问题 8.3 单源最短路径问题单源最短路径问题 8.4 0/1 背包问题背包问题 8.4 货郎担问题货郎担问题 28.1 分支与限界法的基本思想分支与限界法的基本思想 一一 基本思想基本思想 二二 目标函数目标函数“界界”的特性的特性 三三 两种分支方法两种分支方法 3一一 基本思想基本思想1. 在在 e_结点估算沿着它的各儿子结点搜索时,目标函数结点估算沿着它的各儿子结点搜索时,目标函数 可能取得的可能取得的“界界”,2. 把儿子结点和目标函数可能取得的把儿子结点和目标函数
2、可能取得的“界界”,保存在优先,保存在优先队队 列或堆中,列或堆中,3. 从队列或堆中选取从队列或堆中选取“界界”最大或最小的结点向下搜索,最大或最小的结点向下搜索,直直 到叶子结点,到叶子结点,4. 若叶子结点的目标函数的值,是结点表中的最大值或最若叶子结点的目标函数的值,是结点表中的最大值或最 小值,则沿叶子结点到根结点的路径所确定的解,就是小值,则沿叶子结点到根结点的路径所确定的解,就是 问题的最优解,否则转问题的最优解,否则转 3 继续搜索继续搜索4二二 目标函数目标函数“界界”的特性的特性 是局部解是局部解 是相应的界是相应的界1. 对最小值问题,称为下界,意思是向下搜索所可能取得的
3、对最小值问题,称为下界,意思是向下搜索所可能取得的 值最小不会小于这些下界值最小不会小于这些下界 若若 是所得到的局部解,满足:是所得到的局部解,满足:2. 对最大值问题,称为上界,意思是向下搜索所可能取得的对最大值问题,称为上界,意思是向下搜索所可能取得的 值最大不会大于这些上界值最大不会大于这些上界 若若 是所得到的部分解,满足:是所得到的部分解,满足:)x,x,x()x(k211)x,x,x(bound),x(boundk211)x,x,x(=Xk21)x,x,x(bound)x,x(bound)x(boundk21211)x,x,x(=Xk21)x,x,x(bound)x,x(boun
4、d)x(boundk212115三三 两种分支方法两种分支方法设解向量设解向量 , 的取值范围为有穷集的取值范围为有穷集 ,1 i n1. 每棵子树都有每棵子树都有 个分支:个分支: 最坏情况下,结点表的空间为最坏情况下,结点表的空间为 若状态空间树是完全若状态空间树是完全 n 叉树,叉树, 结点表的空间为结点表的空间为2. 每棵子树只有两个分支,每棵子树只有两个分支, 取特定值的分支、及不取取特定值的分支、及不取 特定值的分支:特定值的分支: 状态空间树是完全二叉树,最坏情况下结点表的空间状态空间树是完全二叉树,最坏情况下结点表的空间 为为)x,x,x(=Xn21ixiSiin=|S|in)
5、nnn(On21n=n=n=nn21)n(Onix)2(On68.2 作业分配问题作业分配问题 一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法 二二 分支限界法解作业分配问题算法的实现分支限界法解作业分配问题算法的实现 7一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法1. 问题描述:问题描述: n 个操作员以个操作员以 n 种不同时间完成种不同时间完成 n 种不同作业。要求分种不同作业。要求分 配每位操作员完成一项工作,使完成配每位操作员完成一项工作,使完成 n 项工作的总时间项工作的总时间 最少最少 操作员编号为操作员编号为 0,1,n
6、-1, 作业也编号为作业也编号为 0,1,n-1, 矩阵矩阵 c 描述每位操作员完成每个作业时所需的时间,描述每位操作员完成每个作业时所需的时间, 元素元素 ci,j 表示第表示第 i 位操作员完成第位操作员完成第 j 号作业所需的时间号作业所需的时间 向量向量 x 描述分配给操作员的作业编号,描述分配给操作员的作业编号, 分量分量 xi 表示分配给第表示分配给第 i 位操作员的作业编号。位操作员的作业编号。8一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法2. 思想方法:思想方法: 1)从根结点开始,每遇到一个)从根结点开始,每遇到一个e_结点,就对它的所有儿结点,
7、就对它的所有儿 子结点计算其下界,把它们登记在结点表中。子结点计算其下界,把它们登记在结点表中。 2)从表中选取下界最小的结点,重复上述过程。)从表中选取下界最小的结点,重复上述过程。 3)当搜索到一个叶子结点时,如果该结点的下界是结点表)当搜索到一个叶子结点时,如果该结点的下界是结点表 中最小的,那么,该结点就是问题的最优解。中最小的,那么,该结点就是问题的最优解。 4)否则,对下界最小的结点继续进行扩展)否则,对下界最小的结点继续进行扩展 9一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法3. 下界的确定:下界的确定: 1)搜索深度为)搜索深度为 0 时,把第时,
8、把第 0 号作业分配给第号作业分配给第 i 位操作员位操作员 所需时间至少为第所需时间至少为第 i 位操作员完成第位操作员完成第 0 号作业所需时号作业所需时 间,加上其余间,加上其余 n-1个作业分别由其余个作业分别由其余 n-1 位操作员单位操作员单 独完成时所需最短时间之和,有:独完成时所需最短时间之和,有: )min(110jlnjilicct10一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法3. 下界的确定:下界的确定: 例:例:4个操作员完成个操作员完成4个作业所需的时间表如下:个作业所需的时间表如下: 把第把第 0 号作业分配给第号作业分配给第 0 位
9、操作员时,所需时间至少不会位操作员时,所需时间至少不会 小于小于 3 + 7 + 6 + 3 = 19 0 1 2 3 0 3 8 4 12 1 9 12 13 5 2 8 7 9 3 3 12 7 6 8 11一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法3. 下界的确定:下界的确定: 2)搜索深度为)搜索深度为 k 时,前面第时,前面第0,1,k-1号作业已分别分配号作业已分别分配 给编号为给编号为i0,i1,ik-1的操作员。的操作员。 S=0,1,n-1表示所有操作员的编号集合;表示所有操作员的编号集合; mk-1=i0,i1,ik-1表示作业已分配的操作员
10、编号集合。表示作业已分配的操作员编号集合。 当把第当把第k号作业分配给编号为号作业分配给编号为ik的操作员时,的操作员时,ik S-mk-1, 所需时间至少为:所需时间至少为: (8.2.1) 则上式为把第则上式为把第k号作业分配给编号为号作业分配给编号为ik的操作员时的下界的操作员时的下界)min(110ilnklmSikllicctkl12一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法4. 算法实现步骤:算法实现步骤: 每个结点都包含已分配作业的操作员编号集合每个结点都包含已分配作业的操作员编号集合m 、 未分配作业的操作员编号集合未分配作业的操作员编号集合 S
11、、 操作员的分配方案向量操作员的分配方案向量x 、搜索深度、搜索深度 k、所需时间的下界、所需时间的下界 t 1)建立根结点)建立根结点X ,令,令X.k = 0,X.S=0,1,n-1 ,X.m= 把当前问题的可行解的最优时间下界把当前问题的可行解的最优时间下界bound 置为置为。 2)对所有编号为)对所有编号为 i 的操作员,的操作员,i X.S ,建立儿子结点,建立儿子结点 Yi, 把结点把结点X 的数据复制到结点的数据复制到结点 Yi。 3)令)令Yi .m=Yi.m i, Yi .S=Yi.S-i ,Yi.x=Yi.k , Yi.k=Yi.k+1 ,按式(,按式(8.2.1)计算)
12、计算 Yi.t。(13一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法4. 算法实现步骤:算法实现步骤: 4)如果)如果Yi.tbuond ,转步骤,转步骤 5),否则剪去结点),否则剪去结点Yi ,转,转 步骤步骤 6)。)。 5)把结点)把结点 Yi插入优先队列。如果结点插入优先队列。如果结点 Yi是叶结点,表明它是叶结点,表明它 是问题的一个可行解,用是问题的一个可行解,用 Yi.t 更新当前可行解的最优时更新当前可行解的最优时 间下界间下界 bound 。(6)取下队列首元素作为子树的根结点)取下队列首元素作为子树的根结点 X ,若,若 X.k=n,则该,则该
13、 结点是叶结点,表明它是问题的最优解,算法结束,向结点是叶结点,表明它是问题的最优解,算法结束,向 量量 X.x 便是作业最优分配分案;否则,转步骤便是作业最优分配分案;否则,转步骤 2)。)。14一一 分支限界法解作业分配问题的思想方法分支限界法解作业分配问题的思想方法例例:图图8.1 所示的所示的4个操作员的作业最优分配方案的搜索树。个操作员的作业最优分配方案的搜索树。15二二 分支限界法解作业分配问题算法的实现分支限界法解作业分配问题算法的实现1. 数据结构如下:数据结构如下:struct ass_node int xn;/* 分配给操作员的作业分配给操作员的作业 */ int k;/*
14、 搜索深度搜索深度 */ floatt;/* 当前搜索深度下当前搜索深度下,已分配的作业所需时间已分配的作业所需时间 */ floatb;/* 本结点所需的时间下界本结点所需的时间下界 */struct ass_node *next;/* 优先队列链指针优先队列链指针 */;typedef struct ass_node ASS_NODEfloatcnn; /* n个操作员分别完成个操作员分别完成n种作业所需时间种作业所需时间 */floatbound; /* 当前已搜索到的可行解的最优时间当前已搜索到的可行解的最优时间 */ASS_NODE *qbase;/* 优先队列的首指针优先队列的首指
15、针 */16二二 分支限界法解作业分配问题算法的实现分支限界法解作业分配问题算法的实现2. 队列操作函数:队列操作函数: Q_insert(ASS_NODE *qbase,ASS_NODE *xnode); 把把 所指向的结点按时间下界插入优先队列所指向的结点按时间下界插入优先队列 中,下界越小,中,下界越小, 优先性越高。优先性越高。 ASS_NODE *Q_delete(ASS_NODE *qbase); 取下并返回优先队列取下并返回优先队列 的首元素的首元素17二二 分支限界法解作业分配问题算法的实现分支限界法解作业分配问题算法的实现3. 实现代码:实现代码:1. #define MAX
16、_FLOAT_NUM /* 最大的浮点数最大的浮点数 */ 2. float job_assigned(float c,int n,int job) 3. 4. int i,j,m,n_heap = 0; 5. ASS_NODE *xnode,*ynode,*qbase = NULL; 6. float min,bound = MAX_FLOAT_NUM; 7. xnode = new ASS_NODE; 8. for (i=0;ixi = -1;10. xnode-t = xnode-b = 0;11. xnode-k = 0;18二二 分支限界法解作业分配问题算法的实现分支限界法解作业分配
17、问题算法的实现12. while (xnode-k!=n) /* 非叶子结点非叶子结点,继续向下搜索继续向下搜索 */13. for (i=0;ixi=-1) /* 操作员操作员i尚未分配作业尚未分配作业 */15. ynode = new ASS_NODE; /* 为操作员为操作员i建立结点建立结点 */16. *ynode = *xnode;/*把父亲结点的数据复制给它把父亲结点的数据复制给它 */17. ynode-xi = ynode-k;/* 作业作业k分配给操作员分配给操作员i */18. ynode-t += ciynode-k; /*已分配作业时间累计已分配作业时间累计*/19
18、. ynode-b = ynode-t;20. ynode-k+;19二二 分支限界法解作业分配问题算法的实现分支限界法解作业分配问题算法的实现21. for (j=ynode-k;jn;j+) /* 未分配作业最小时间估计未分配作业最小时间估计 */22. min = MAX_FLOAT_NUM;23. for (m=0;mxm=-1)&(cmjb += min;28. 29. if (ynode-bk=n)/* 已得到一个可行解已得到一个可行解 */32. bound = ynode-b; /* 更新可行解的最优下界更新可行解的最优下界 */33. 34. else delete ynod
19、e; /* 大于可行解的最优下界大于可行解的最优下界,剪除剪除*/35. 36. 20二二 分支限界法解作业分配问题算法的实现分支限界法解作业分配问题算法的实现37. delete xnode;/* 释放结点释放结点xnode的缓冲区的缓冲区 */38. xnode = Q_delete(qbase);/* 取下队列首元素取下队列首元素 */39. 40. min = xnode-b;/* 保存下界保存下界,以便作为返回值返回以便作为返回值返回 */41. for (i=0;ixi;43. while (qbase) /* 释放结点缓冲区释放结点缓冲区 */44. xnode = Q_dele
20、te(qbase);45. delete xnode;46. 47. return min;48. 21二二 分支限界法解作业分配问题算法的实现分支限界法解作业分配问题算法的实现4.复杂性分析复杂性分析 在第在第11行之前的初始化部分:第行之前的初始化部分:第89行的行的 for 循环,初始化根结点的循环,初始化根结点的 向量向量 x 需需O(n)时间;其余需时间;其余需O(1)时间。时间。 第第1339行的行的while循环:循环: 假定需进行假定需进行 c 个结点的处理。每处理一个结点,需要:个结点的处理。每处理一个结点,需要: 第第16行把父亲结点的数据复制给儿子结点,需行把父亲结点的数
21、据复制给儿子结点,需O(n)时间,时间, 第第2128行的二重循环,需要行的二重循环,需要O(n2)时间,时间, 第第30行把结点插入优先队列,第行把结点插入优先队列,第38行取下队列首元素,需行取下队列首元素,需O(c)时时 间,其余需间,其余需O(1)时间。时间。 因此,第因此,第1339行的行的while循环,在最坏情况下需循环,在最坏情况下需O(cn2)时间。时间。 算法的结束部分:第算法的结束部分:第41行及行及43行的行的for循环分别需循环分别需O(n)时间和时间和O(c)时间时间 因此,算法在最坏情况下,需因此,算法在最坏情况下,需O(cn2)时间。时间。 共处理共处理c个结点
22、。每个结点需个结点。每个结点需O(n)空间。空间。 因此,在最坏情况下,算法的空间复杂性是因此,在最坏情况下,算法的空间复杂性是O(cn)。228.3 单源最短路径问题单源最短路径问题 一一 分支限界法解单源最短路径问题的思想方法分支限界法解单源最短路径问题的思想方法 二二 分支限界法解单源最短路径问题算法的实现分支限界法解单源最短路径问题算法的实现 23一一 分支限界法解单源最短路径问题的思想方法分支限界法解单源最短路径问题的思想方法1. 问题描述:给定有向赋权图问题描述:给定有向赋权图 G=(V,E),图中每一条边都具,图中每一条边都具 有非负长度,求从源顶点有非负长度,求从源顶点 s 到
23、目标顶点到目标顶点 t 的最短路径问题的最短路径问题 2. 思想方法:思想方法: 把源顶点把源顶点 s 作为根结点开始进行搜索。作为根结点开始进行搜索。 对源顶点对源顶点 s 的所有邻接顶点,都产生一个分支结点,的所有邻接顶点,都产生一个分支结点, 估计从源点估计从源点 s 经该邻接顶点到达目标顶点的距离作为该分经该邻接顶点到达目标顶点的距离作为该分 支结点的下界,支结点的下界, 选择下界最小的分支结点,对这个分支结点所对应的顶点选择下界最小的分支结点,对这个分支结点所对应的顶点 的所有邻接顶点继续进行上述的搜索。的所有邻接顶点继续进行上述的搜索。 24一一 分支限界法解单源最短路径问题的思想
24、方法分支限界法解单源最短路径问题的思想方法3. 下界的确定:下界的确定: 假定假定 d(node) 是搜索树中从根结点到结点是搜索树中从根结点到结点 node所对应的所对应的顶点顶点 u 的路径长度,顶点的路径长度,顶点 u 的邻接顶点为的邻接顶点为 v1,v2,vl ,而,而 cu,vi为顶点为顶点 u 到其邻接顶点到其邻接顶点 vi 的距离。令的距离。令 (8.3.1) 则结点则结点 的下界的下界 可表示为:可表示为: 25一一 分支限界法解单源最短路径问题的思想方法分支限界法解单源最短路径问题的思想方法4. 结点内部数据的描述:结点内部数据的描述: 顶点编号为顶点编号为 0,1,,n-1
25、 搜索树中结点的数据结构:搜索树中结点的数据结构:struct path_node int u;/* 该结点所对应的顶点该结点所对应的顶点 */ int pathn;/* 从源点开始的路径上顶点编号从源点开始的路径上顶点编号 */ int k;/* 当前搜索深度下当前搜索深度下,路径上的顶点个数路径上的顶点个数 */ int d;/* 从源点到本结点所对应顶点的路径长度从源点到本结点所对应顶点的路径长度 */ float b;/* 经本结点到目标顶点最短路径长度下界经本结点到目标顶点最短路径长度下界 */struct path_node *next;;typedef struct path_n
26、ode PATH_NODE; 26一一 分支限界法解单源最短路径问题的思想方法分支限界法解单源最短路径问题的思想方法5. 算法步骤:算法步骤: 假定源顶点为假定源顶点为 s ,目标顶点为,目标顶点为 t, 1)初始化:建立根结点)初始化:建立根结点 X ,令根结点的,令根结点的 X.u=s ,X.k=1, X.path0=s,X.d=0,X.b=0 ,当前可行解的最短路径,当前可行解的最短路径 下界下界 bound 置为置为 。 2)令顶点)令顶点 X.u 所对应的顶点为所对应的顶点为 u ,对,对 u 的所有邻接顶点的所有邻接顶点 vi 建立儿子结点建立儿子结点 Yi,把结点,把结点 X 的
27、数据复制到结点的数据复制到结点 Yi。 3)令)令Yi.u=vi ,Yi.pathyi.k=vi ,Yi.k=Yi.k+1 , Yi.d=Yi.d+cu,vi ,对顶点,对顶点 vi按式(按式(8.3.1)和式()和式(8.3.2) 计算计算 h 和和 Yi.b 。27一一 分支限界法解单源最短路径问题的思想方法分支限界法解单源最短路径问题的思想方法5. 算法步骤:算法步骤: 4)如果)如果 Yi.bu = xnode-path0 = s;10. xnode-d = xnode-b = 0; xnode-k = 1;11. for (i=1;ipathi = -1; 32二二 分支限界法解单源
28、最短路径问题算法的实现分支限界法解单源最短路径问题算法的实现13. while (xnode-u!=t) /* 结点所对应的顶点不是目标顶点结点所对应的顶点不是目标顶点 */14. pnode = nodexnode-u.next;/* 取该顶点的邻接表指针取该顶点的邻接表指针 */ 15. while (pnode) 16. if (pnode-v_num!=u) /* 限制邻接顶点不是源顶点限制邻接顶点不是源顶点 */17. ynode = new PATH_NODE; /* 为邻接顶点建立一个结点为邻接顶点建立一个结点 */18. *ynode = *xnode; /* 把父亲结点的数据
29、复制给它把父亲结点的数据复制给它 */19 ynode-u = pnode-v_num; /* 结点对应的顶点编号结点对应的顶点编号 */20. ynode-pathk = pnode-u; /* 当前结点路径上的顶点编号当前结点路径上的顶点编号 */ 21. ynode-k = ynode-k + 1; /* 路径的顶点个数路径的顶点个数 */22. ynode-d = ynode-d + pnode-len; /*当前结点路径的长度当前结点路径的长度*/23. p = nodeynode-u.next; 33二二 分支限界法解单源最短路径问题算法的实现分支限界法解单源最短路径问题算法的实现
30、24. if (p=NULL) h = 0;/* 按式按式(8.3.1)计计算算h */25 else 26. h = MAX_FLOAT_NUM;27. while (p) 28. if (p-lenlen;29. p = p-next;30. 31. 34二二 分支限界法解单源最短路径问题算法的实现分支限界法解单源最短路径问题算法的实现32. ynode-b = ynode-d + h;33. if (ynode-bu=t)/* 已得到一个可行解已得到一个可行解 */36. bound = ynode-b; /* 更新可行解的最优下界更新可行解的最优下界 */37. 38. else de
31、lete ynode; /* 大于可行解的最优下界大于可行解的最优下界,剪除剪除*/39. 40. pnode = pnode-next;/* 取下一个邻接顶点取下一个邻接顶点 */41. 42. delete xnode; /* 释放结点释放结点xnode的缓冲区的缓冲区 */43. xnode = Q_delete(qbase);/* 取下队列首元素取下队列首元素 */44. 35二二 分支限界法解单源最短路径问题算法的实现分支限界法解单源最短路径问题算法的实现45. h = xnode-d;/* 保存路径长度作为返回值返回保存路径长度作为返回值返回 */46 k = xnode-k;47
32、. for (i=0;ipathi;49. while (qbase) /* 释放结点缓冲区释放结点缓冲区 */50. xnode = Q_delete(qbase);51. delete xnode;52. 53. return h;54 36二二 分支限界法解单源最短路径问题算法的实现分支限界法解单源最短路径问题算法的实现4. 算法的复杂性估计算法的复杂性估计 1)时间复杂性:)时间复杂性: 第第 812 行对父亲结点进行初始化,需行对父亲结点进行初始化,需O(n) 时间。时间。 假定源顶点和目标顶点不邻接,其它顶点有假定源顶点和目标顶点不邻接,其它顶点有 n-1 个邻接顶点个邻接顶点 第
33、第2730行的行的while循环需循环需O(n)时间时间 第第1541行的行的while循环则需循环则需O(n2)时间时间 第第1344 行的行的 while循环,循环体的执行次数取决于所搜索的结点个数循环,循环体的执行次数取决于所搜索的结点个数 c,因此算法的时间复杂性为,因此算法的时间复杂性为O(cn2)时间。时间。 2)空间复杂性:)空间复杂性: 取决于优先队列的结点个数,每个结点需要取决于优先队列的结点个数,每个结点需要O(n)空间存放路径的顶点编空间存放路径的顶点编 号,而队列的结点个数不会超过所搜索的结点个数,因此,算法所需要号,而队列的结点个数不会超过所搜索的结点个数,因此,算法
34、所需要 的空间为的空间为O(cn)。378.4 0/1 背包问题背包问题 一一 解解 0/1 背包问题的思想方法和求解过程背包问题的思想方法和求解过程 二二 0/1 背包问题分支限界算法的实现背包问题分支限界算法的实现38一一 解解 0/1 背包问题的思想方法和求解过程背包问题的思想方法和求解过程 1. 思想方法思想方法 2. 求解过程求解过程391. 思想方法思想方法1)分支选择及物体分类)分支选择及物体分类 n 个物体按价值重量比递减顺序排序后,重量分别为个物体按价值重量比递减顺序排序后,重量分别为 ,价值分别为,价值分别为 ,物体序,物体序 号集合为号集合为 S = 0, 1, , n
35、1 ,背包载重量为背包载重量为 M 按物体价值重量比递减顺序(集合按物体价值重量比递减顺序(集合 S 中物体的顺序号)中物体的顺序号) 把物体把物体 k 装入背包或不装入背包进行分支搜索装入背包或不装入背包进行分支搜索 物体划分为三类:当搜索深度为物体划分为三类:当搜索深度为 k 时时 确定装入背包的物体集合,确定装入背包的物体集合, 确定不装入背包的物体集合,确定不装入背包的物体集合, 尚待选择的物体集合,尚待选择的物体集合, 1n10w,w,w-1n10p,p,p-:)k(S1=)0(S1:)k(S2=)0(S2:)k(S31-n,1,0=S=)0(S3402)分支时的处理)分支时的处理
36、搜索深度为搜索深度为 k + 1时,被搜索物体序号就是集合时,被搜索物体序号就是集合 S 中的元中的元 素素 k 把物体装入背包的分支结点的处理:把物体装入背包的分支结点的处理: 不把物体装入背包的分支结点的处理:不把物体装入背包的分支结点的处理: k)k(S=)1+k(S11)k(S=)1+k(S22k)k(S=)1+k(S33-)k(S=)1+k(S11k)k(S=)1+k(S22k)k(S=)1+k(S33-413)上界的确定)上界的确定 b(k):搜索深度为:搜索深度为 k 时,分支结点的背包中物体价值上界时,分支结点的背包中物体价值上界 若:若: 令令 b(k) = 0 若:若: 则
37、:则:)k(Sii1wM)k(Sii1wMm1mk=ii)k(Siiwx+w+w=M1-)k(Sl,mk,1k;4. float w = node-w;5. float p = node-p;6. if (node-w M)/ 物体重量超过背包载重量物体重量超过背包载重量7. node-b = 0;/ 上界置为上界置为0491)bound 函数:确定背包的剩余载重量及可获得最大价值函数:确定背包的剩余载重量及可获得最大价值8. else 9. while (w+ob i .w = M) & (i n) 10. w += ob i .w; 11. p += ob i+ .p;12. 13. if
38、 (i b = p + (M w) * ob i .p / ob i .w; 15. else16. node-b = p;17. 18. O(n)502)算法描述)算法描述 1. float knapsack_bound(OBJECT ob , float M, int n, int obx ) 2. int i, j, k = 0; / 堆中元素个数的计数器堆中元素个数的计数器 k 初始化为初始化为0 4. float v; 5. KNAPNODE *xnode, *ynode, *znode; 6. HEAP x, y, z, *heap; 7. heap = new HEAP n*n
39、; / 分配堆的存储空间分配堆的存储空间 8. for (i=0; in; i+) 9. ob i .v = ob i .p / ob i .w; / 物体的价值重量比物体的价值重量比 10. ob i .num = i; / 物体排序前的原始序号物体排序前的原始序号11. 12. merge_sort(ob,n); / 物体按价值重量比排序物体按价值重量比排序 51算法描述(父亲结点初始化)算法描述(父亲结点初始化)13. xnode = new KNAPNODE;/ 建立父亲结点建立父亲结点 x14. for (i=0;is1 i = FALSE;16. xnode-k = 0;17. x
40、node-w = 0;18. xnode-p = 0;52算法描述(结点算法描述(结点 y 的处理,的处理,O(n))19. while (xnode-ks1ynode-k = TRUE; / 装入第装入第k个物体个物体23. ynode-w += obynode-k.w; / 物体重量累计物体重量累计 24. ynode-p += obynode-k.p; / 物体价值累计物体价值累计25. ynode-k+; / 搜索深度加搜索深度加 126. bound(ynode,M,ob,n); / 结点结点 y 的上界的上界27. y.b = ynode-b;28. y.p = ynode;29.
41、 insert(heap,y,k); / 结点结点 y 插入堆中插入堆中 53算法描述(结点算法描述(结点 z 的处理,的处理,O(n))30. znode = new KNAPNODE;/ 建立结点建立结点 z31. *znode = *xnode;/ 结点结点 x 的数据拷贝到结点的数据拷贝到结点 z32. znode-k+;/ 搜索深度加搜索深度加 133. bound(ynode, M, ob, n);/ 结点结点 z 的上界的上界 O(n)34. z.b = znode-b;35. z.p = znode;36. insert(heap,z,k); / 结点结点 z 插入堆中插入堆中
42、37. delete xnode;/ 释放结点释放结点 x 的缓冲区的缓冲区38. x = delete_max(heap,k); 39. xnode = x.p; / 取堆顶元素作为新的取堆顶元素作为新的 x 结点结点40. 54算法描述(最终处理)算法描述(最终处理)41. v = xnode-p;42. for (i=0;is1 i ) obx i = ob i .num;44. else obx i = -1;45. 46. delete xnode;/ 释放释放 x 结点缓冲区结点缓冲区47. for (i=1; i=k ;i+)/ 释放堆中结点的缓冲区释放堆中结点的缓冲区48. d
43、elete heap i .p;49. delete heap;/ 释放堆的缓冲区释放堆的缓冲区50. return v;/ 回送背包中物体的价值回送背包中物体的价值51. 553. 算法分析算法分析时间复杂性:时间复杂性: while 循环的循环体执行时间:循环的循环体执行时间:O(n) 在最坏情况下,可能执行在最坏情况下,可能执行 次次 时间复杂性:时间复杂性:空间复杂性:空间复杂性: 每个结点所需数据空间:每个结点所需数据空间:O(n) 最坏情况下有最坏情况下有 个结点个结点 空间复杂性:空间复杂性:n2)2n(Onn2)2n(On568.2 货郎担问题货郎担问题 一一 费用矩阵的特性及
44、归约费用矩阵的特性及归约 二二 界限的确定和分支的选择界限的确定和分支的选择 三三 货郎担问题的求解过程货郎担问题的求解过程 四四 几个辅助函数的实现几个辅助函数的实现 五五 货郎担问题分支限界算法的实现货郎担问题分支限界算法的实现 57一一 费用矩阵的特性及归约费用矩阵的特性及归约 1. 哈密尔顿回路与费用矩阵的关系哈密尔顿回路与费用矩阵的关系 2. 费用矩阵的归约费用矩阵的归约 581. 哈密尔顿回路与费用矩阵的关系哈密尔顿回路与费用矩阵的关系引理:令引理:令 G = 是有向赋权图,是有向赋权图,l 是图是图 G 的一条哈密尔的一条哈密尔 顿回路,顿回路,c 是图是图 G 的费用矩阵,则回
45、路上的边对应于费的费用矩阵,则回路上的边对应于费 用矩阵中每行每列各一个元素用矩阵中每行每列各一个元素 证明:设图证明:设图 G 有有 n 个顶点,个顶点, l 是图是图 G 的一条哈密尔顿回路的一条哈密尔顿回路 是回路中任意一个顶点,是回路中任意一个顶点,1 i n 费用矩阵第费用矩阵第 i 行元素:顶点行元素:顶点 到其它顶点的出边费用到其它顶点的出边费用 费用矩阵第费用矩阵第 i 列元素:其它顶点到顶点列元素:其它顶点到顶点 的入边费用的入边费用 在回路中只有一条出边,一条入边在回路中只有一条出边,一条入边 费用矩阵中第费用矩阵中第 i 行第行第 i 列各只有一个元素与其对应列各只有一个
46、元素与其对应 在回路中只出现一次在回路中只出现一次 费用矩阵的第费用矩阵的第 i 行、第行、第 i 列各有且只有一个元素与其对应列各有且只有一个元素与其对应 回路中有回路中有 n 个不同顶点,费用矩阵的每行每列都有且只有个不同顶点,费用矩阵的每行每列都有且只有 一个元素与回路中的顶点的出边与入边一一对应一个元素与回路中的顶点的出边与入边一一对应 iviviviviv59哈密尔顿回路与费用矩阵的关系(续)哈密尔顿回路与费用矩阵的关系(续)例:例:5 城市的货郎担问题的费用矩阵如图城市的货郎担问题的费用矩阵如图 哈密尔顿回路哈密尔顿回路 回路上的边对应于费用矩阵中的元素回路上的边对应于费用矩阵中的
47、元素 024130vvvvvv=l2042143103c,c,c,c,c 0 1 2 3 4 0 2 25 5 4 41 1 3 32 2 2 28 8 1 5 1 18 8 3 31 1 2 26 6 2 20 16 7 7 1 1 3 10 51 25 6 6 4 23 9 7 11 602. 费用矩阵的归约费用矩阵的归约1)行归约和列归约)行归约和列归约 定义:费用矩阵定义:费用矩阵 c 的第的第 i 行(或第行(或第 j 列)中的每个元素列)中的每个元素 减去一个正常数减去一个正常数 (或(或 ),得到一个新的费),得到一个新的费 用矩阵用矩阵 ,使得,使得 中第中第 i 行(或第行(
48、或第 j 列)中的最列)中的最 小元素为小元素为0,称为费用矩阵的行归约,称为费用矩阵的行归约(或列归约或列归约)。 称为行归约常数,称为行归约常数, 称为列归约常数称为列归约常数ilhjchccilhjch61行归约和列归约的例:行归约和列归约的例:下图为行归约和列归约的例子:下图为行归约和列归约的例子: 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 2 25 5 4 41 1 3 32 2 2 28 8 0 0 0 0 1 16 6 7 7 3 3 l lh h0 0 = = 2 25 5 0 0 0 0 1 16 6 3 3 3 3 1 5 1 18 8 3 31 1
49、2 26 6 1 1 0 0 1 13 3 2 26 6 2 21 1 l lh h1 1 = = 5 5 1 1 0 0 1 13 3 2 22 2 2 21 1 2 20 16 7 7 1 1 2 2 1 19 9 1 15 5 6 6 0 0 l lh h2 2 = = 1 1 2 2 1 19 9 1 15 5 2 2 0 0 3 10 51 25 6 6 3 3 4 4 4 45 5 1 19 9 0 0 l lh h3 3 = = 6 6 3 3 4 4 4 45 5 1 19 9 0 0 4 23 9 7 11 4 4 1 16 6 2 2 0 0 4 4 l lh h4 4 =
50、 = 7 7 4 4 1 16 6 2 2 0 0 0 0 c ch h3 3 = = 4 4 622. 归约矩阵归约矩阵定义:对费用矩阵定义:对费用矩阵 c 的每一行和每一列都进行行归约和列归的每一行和每一列都进行行归约和列归 约,得到一个新的费用矩阵约,得到一个新的费用矩阵 ,使得,使得 中每一行和中每一行和 每一列至少都有一个元素为每一列至少都有一个元素为 0,称为费用矩阵的归约,称为费用矩阵的归约 矩阵矩阵 称为费用矩阵的归约矩阵。称常数称为费用矩阵的归约矩阵。称常数 为矩阵为矩阵 c 的归约常数的归约常数 ccc-1n0=ii1n0=iich+lh=h63归约矩阵的例:归约矩阵的例:
51、下图为归约矩阵的例子:下图为归约矩阵的例子:归约常数归约常数 h = 25 + 5 + 1 + 6 + 7 + 4 = 48 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 2 25 5 4 41 1 3 32 2 2 28 8 0 0 0 0 1 16 6 7 7 3 3 l lh h0 0 = = 2 25 5 0 0 0 0 1 16 6 3 3 3 3 1 5 1 18 8 3 31 1 2 26 6 1 1 0 0 1 13 3 2 26 6 2 21 1 l lh h1 1 = = 5 5 1 1 0 0 1 13 3 2 22 2 2 21 1 2 20 16 7
52、 7 1 1 2 2 1 19 9 1 15 5 6 6 0 0 l lh h2 2 = = 1 1 2 2 1 19 9 1 15 5 2 2 0 0 3 10 51 25 6 6 3 3 4 4 4 45 5 1 19 9 0 0 l lh h3 3 = = 6 6 3 3 4 4 4 45 5 1 19 9 0 0 4 23 9 7 11 4 4 1 16 6 2 2 0 0 4 4 l lh h4 4 = = 7 7 4 4 1 16 6 2 2 0 0 0 0 c ch h3 3 = = 4 4 643. 归约矩阵与哈密尔顿回路的关系归约矩阵与哈密尔顿回路的关系 定理:有向赋权图定理
53、:有向赋权图 G = ,G 的哈密尔顿回路的哈密尔顿回路 l ,G 的费用矩阵的费用矩阵 c,w(l) 是以是以 c 计算的回路费用。计算的回路费用。 是是 c 的归约矩阵,归约常数为的归约矩阵,归约常数为 h , 是以是以 计算的回路计算的回路 费用,有费用,有证明:证明: 和和 分别是分别是 c 和和 的第的第 i 行第行第 j 列元素列元素 0 i, j n 1 w(l) 及及 分别是以分别是以 c 和和 计算的哈密尔顿回路计算的哈密尔顿回路 的费用的费用 界限的确定界限的确定 ccc) l (wh+) l (w=) l (wijcijcjiijijch+lh+c=c) l (wclj
54、, iijc=) l (wlj , iijc=) l (wh+) l (w=ch+lh+c=c=) l (w1n0=jj1n0=iilj , iijlj , iij-65归约矩阵与哈密尔顿回路的关系(续)归约矩阵与哈密尔顿回路的关系(续) 定理:有向赋权图定理:有向赋权图 G = ,G 的最短哈密尔顿回路的最短哈密尔顿回路 l , G的费用矩阵的费用矩阵 c,c 的归约矩阵的归约矩阵 ,令,令 是图是图 的的 邻接矩阵,则邻接矩阵,则 l 也是图也是图 的最短哈密尔顿回路的最短哈密尔顿回路证明:若证明:若 l 不是图不是图 的最短的哈密尔顿回路,的最短的哈密尔顿回路, 则则 中必存在另一条最短
55、的哈密尔顿回路中必存在另一条最短的哈密尔顿回路 l, 同时,同时,l 也是也是 G 中的一条回路中的一条回路 和和 分别是以分别是以 计算的计算的 l 和和 l 的费用,有的费用,有 令令 w(l) 和和 w(l) 是分别以是分别以 c 计算的回路计算的回路 l 和和 l 的费用的费用 l 是是 G 中比中比 l 更短的哈密尔顿回路,与定理的前提矛盾更短的哈密尔顿回路,与定理的前提矛盾 所以,所以,l 是是 的最短的哈密尔顿回路的最短的哈密尔顿回路 ccGGGG) l (w) l (wc+) l (w=) l (wh+) l (w=) l (wh+) l (w=) l (wh+) l (w=h
56、+) l (w=) l (w+) l (w=G66二二 界限的确定和分支的选择界限的确定和分支的选择 1. 分支限界法解货郎担问题的思想方法分支限界法解货郎担问题的思想方法 2. 界限的确定界限的确定 3. 分支的选择分支的选择 671. 分支限界法解货郎担问题的思想方法分支限界法解货郎担问题的思想方法 1)选取沿某一边出发的路径,作为分支结点)选取沿某一边出发的路径,作为分支结点 Y,不沿该边,不沿该边 出发的其它所有路径集合,作为另一个分支结点出发的其它所有路径集合,作为另一个分支结点2)分别计算结点)分别计算结点 Y 和和 的下界的下界 w(Y) 和和3)选择下界最小的结点)选择下界最小
57、的结点 若下界最小的结点是若下界最小的结点是 Y 结点,降阶结点,降阶 Y 结点相应的费用结点相应的费用 矩阵,纪录该边作为路径中的一条边矩阵,纪录该边作为路径中的一条边 若下界最小的结点是若下界最小的结点是 结点,费用矩阵相应元素置为结点,费用矩阵相应元素置为 4)继续)继续 1)的处理,直到某个结点降阶后的费用矩阵变为)的处理,直到某个结点降阶后的费用矩阵变为 2 阶,则直接计算该结点下界阶,则直接计算该结点下界5)若该结点下界最小,则该结点所纪录的边集就是问题的)若该结点下界最小,则该结点所纪录的边集就是问题的 解,其下界就是最短路径的长度。否则转解,其下界就是最短路径的长度。否则转 3
58、)继续处理)继续处理YY)Y(wY682. 界限的确定界限的确定1)根结点下界的计算)根结点下界的计算 求图求图 G 费用矩阵费用矩阵 c 的归约矩阵的归约矩阵 ,得归约常数,得归约常数 h 问题转换为求取与问题转换为求取与 G 相对应的图相对应的图 的最短哈密尔的最短哈密尔 顿回路问题顿回路问题 令令 w(l) 和和 分别是分别是 G 和和 的最短哈密尔顿回的最短哈密尔顿回 路的费用,据归约矩阵与哈密尔顿回路的关系路的费用,据归约矩阵与哈密尔顿回路的关系 G 的最短哈密尔顿回路的费用,最少不会少于的最短哈密尔顿回路的费用,最少不会少于 h 货郎担问题状态空间树中根结点货郎担问题状态空间树中根
59、结点 X 的下界的下界 w(X) = h cG) l (wGh+) l (w=) l (w69例:例:下图的最短哈密尔顿回路最少不会短于下图的最短哈密尔顿回路最少不会短于 48归约常数归约常数 h = 25 + 5 + 1 + 6 + 7 + 4 = 48 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 2 25 5 4 41 1 3 32 2 2 28 8 0 0 0 0 1 16 6 7 7 3 3 l lh h0 0 = = 2 25 5 0 0 0 0 1 16 6 3 3 3 3 1 5 1 18 8 3 31 1 2 26 6 1 1 0 0 1 13 3 2 26
60、 6 2 21 1 l lh h1 1 = = 5 5 1 1 0 0 1 13 3 2 22 2 2 21 1 2 20 16 7 7 1 1 2 2 1 19 9 1 15 5 6 6 0 0 l lh h2 2 = = 1 1 2 2 1 19 9 1 15 5 2 2 0 0 3 10 51 25 6 6 3 3 4 4 4 45 5 1 19 9 0 0 l lh h3 3 = = 6 6 3 3 4 4 4 45 5 1 19 9 0 0 4 23 9 7 11 4 4 1 16 6 2 2 0 0 4 4 l lh h4 4 = = 7 7 4 4 1 16 6 2 2 0 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西梧州市本年度(2025)小学一年级数学部编版随堂测试(上学期)试卷及答案
- 广西贵港市本年度(2025)小学一年级数学统编版期中考试(下学期)试卷及答案
- VR技术应用模拟习题含答案
- 基础营养模考试题(含参考答案)
- 山西省部分学校2024-2025学年高二下学期期中测评考试历史试题(原卷版+解析版)
- 水球场地水质监测与过滤考核试卷
- 电视设备智能生物药品政策法规研究技术考核试卷
- 纺织设备客户需求分析与产品设计考核试卷
- 生物质燃气发电技术在新能源领域的应用考核试卷
- 稀土金属提炼过程中的资源保障与可持续发展策略考核试卷
- 建筑工地物业服务合同模板7篇
- 2025年中国智慧公园行业发展现状、市场前景、投资方向分析报告(智研咨询发布)
- 《计算机发展史》课件
- 2025年安徽芜湖市阳光电力维修工程有限责任公司招聘笔试参考题库附带答案详解
- 2024-2025学年统编版语文八年级上册期末易错题:现代文阅读(记叙文)(含答案)
- 学校食堂每日食品安全检查记录台账(日管控)
- 钢琴(安康职业技术学院)知到智慧树章节测试课后答案2024年秋安康职业技术学院
- 《ERP总体介绍》课件
- 企业利他培训
- DB32-T 4569-2023 发泡陶瓷保温板 保温系统应用技术规程
- 2025云南烟草专卖局(公司)高校毕业生招聘90人(非定向)高频重点提升(共500题)附带答案详解
评论
0/150
提交评论