分支限界算法作业分配问题

分支限界法的研究与应用摘要:分支限界法与回溯法的不同:首先,回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。

其次,回溯法以深度优先的方式搜索解空间树,而分支限界法则一般以广度优先或以最小耗费优先的方式搜索解空间树。

再者,回溯法空间效率高;分支限界法往往更“快”。

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

在分支限界法中,每一个活结点只有一次机会成为扩展结点。

活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。

这个过程一直持续到找到所需的解或活结点表为空时为止。

常见的分支限界法有:队列式分支限界法,按照队列先进先出原则选取下一个结点为扩展结点。

栈式分支限界法,按照栈后进先出原则选取下一个结点为扩展结点。

优先队列式分支限界法,按照规定的结点费用最小原则选取下一个结点为扩展结点(最采用优先队列实现)。

分支搜索法是一种在问题解空间上进行搜索尝试的算法。

所谓分支是采用广度优先的策略国,依次搜索E-结点的所有分支,也就是所有的相邻结点。

和回溯法一样,在生成的结点中,抛弃那些不满足约束条件的结点,其余结点加入活结点表。

然后从表中选择一个结点作为下一个E-结点,断续搜索。

关键词:分支限界法回溯法广度优先分支搜索法目录第1章绪论 (3)1.1 分支限界法的背景知识 (3)1.2 分支限界法的前景意义 (3)第2章分支限界法的理论知识............... 错误!未定义书签。

2.1 问题的解空间树 ............................................ 错误!未定义书签。

2.2 分支限界法的一般性描述 (6)第3章作业分配问题 (7)3.1 问题描述 (7)3.2 问题分析 (7)3.3 算法设计 (8)3.4 算法实现 (10)3.5 测试结果与分析 (12)第4章结论 (13)参考文献 (14)第1章绪论1.1 分支限界法的背景知识分支搜索法是一种在问题解空间上进行搜索尝试的算法。

所谓分支是采用广度优先的策略国,依次搜索E-结点的所有分支,也就是所有的相邻结点。

和回溯法一样,在生成的结点中,抛弃那些不满足约束条件的结点,其余结点加入活结点表。

然后从表中选择一个结点作为下一个E-结点,断续搜索。

(1) FIFO搜索先进先出搜索算法要依赖“队”做基本的数据结构。

一开始,根结点是唯一的活结点,根结点入队。

从活结点队中取出根结点后,作为当前扩展结点。

对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子加入活结点队列中。

再从活结点表中取出队首结点为当前扩展结点,……,直到找到一个解或活结点队列为空为止。

(2) LIFO搜索后进先出搜索算法要依赖“栈”做基本的数据结构。

一开始,根结点入栈.从栈中弹出一个结点为当前扩展结点。

对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子入栈,再众栈中弹出一个结点为当前扩展结点,……,直到找到一个解或栈为空为止。

(3)优先队列式搜索为了加速搜索的进程,应采用有效地方式选择E-结点进行扩展。

优先队列式搜索,对每一活结点计算一个优先级,并根据这些优先级,从当前活结点表中优先选择一个优先级最高的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。

1.2 分支限界法的前景意义在现实生活中,有这样一类问题:问题有n个输入,而问题的解就由n个输入的某种排列或某个子集构成,只是这个排列或子集必须满足某些事先给定的条件。

把那些必须满足的条件称为约束条件;而把满足约定条件的排列或子集称为该问题的可行解。

满足约束条件的子集可能不止一个,也就量说可行解一般来说是不唯一的。

为了衡量可行解的优劣,事先也可能给出了一定的标准,这些标准一般以函数形式给出,这些函数称为目标函数。

那些使目标函数取极值的可行解,称为最优解。

如工作安排问题,任意顺序都是问题的可行解,人们真正需要的是最省时间的最优解。

用回溯算法解决问题时,是按深度优先的策略在问题的状态空间中,尝试搜索可能的路径,不便于在搜索过程中对不同的解进行比较,只能在搜索到所有解的情况下,才能通过比较确定哪个是最优解。

这类问题更适合用广度优先策略搜索,因为在扩展结点时,可以在E-结点的各个子结点之间进行必要的比较,有选择地进行下一步扩展。

分支限界法就是一种比较好的解决最优化问题的算法。

分支限界法是由“分支”策略和“限界”策略两部分组成。

“分支”策略体现在对问题空间是按广度优先的策略进行搜索;“限界”策略是为了加速搜索速度而采用启发信息剪枝的策略。

第2章分支限界法的理论知识2.1 问题的解空间树1x1=1 x1=02 3x2=1 x2=0 x2=1 x2=04 5 6 7x3=1 x3=0 x3=1 x3=0 x3=1 x3=0 x3=1 x3=08 9 10 11 12 13 14 15子集树在FIFO分支搜索方法中,在搜索当前E-结点全部儿子后,其儿子成为活结点,E-结点变为死结点;活结点存储在队列中,队首的活结点出队后变为E-结点,其再生成其他活结点的儿子……直到找到问题的解或活结点队列为空搜索完毕.这里采用地构造解空间二叉树的方法,问题的解就是二叉树中的某一个分支.这个解是要搜索到二叉树的叶结点才能确定的,且只须记录最优解的叶结点,就能找到问题的解.比较方便的存储方式是二叉树要有指向父结点的指针,以便从叶结点回溯解的方案.又为了方便知道当前结点的情况,还要记录当前结点是父结点的哪一个儿子.FIFO分支搜索算法框架如下:假定问题解空间树为T,T至少包含一个解结点(答案结点).u为当前的最优解,初值为一个较大的数;E表示当前扩展的活结点,x为E 的儿子,s(x)为结点x下界函数,当其值比u大时,不可能为最优解,不断续搜索此分支,该结点不入队;当其值比u小时,可能达到最优解,断续搜索此分支,该结点入队;cost(X)当前叶结点所在分支的解.search(T){ leaf=0;初始化队;ADDQ(T);parent(E)=0;while(队不空){ DELETEQ(E)for(E的每个儿子X)if(s(X)<u){ ADD Q(X);parent(X)=E;if(X是解结点){ U=min(cost(X),u);leaf=x;}}}printf("least cost=%f",u);while(leaf!=0){ printf("%f",leaf);leaf=parent(leaf);}}找最小成本的LC分支-限界算法框架与FIFO分支-限界算法框架结构大致相同,只是扩展结点的顺序不同,因而存储活结点的数据结构不同.FIFO分支-限界算法用队存储活结点,LC分支-限界算法用堆存储活结点,以保证比较优良的结点行被扩展.且对于LC分支-限界算法,当扩展到叶结点就已经找到最优解,可以停止搜索.2.2 分支限界法的一般性描述分支限界有3种不同的搜索方式:FIFO、LIFO和优先队列。

对于先进先出搜索(FIFO),其算法要依赖“队”做基本的数据结构。

一开始,根结点是唯一的活结点,根结点入队。

从活结点队中取出根结点后,作为当前扩展结点。

对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子加入活结点队列中。

再从活结点表中取出队首结点为当前扩展结点,……,直到找到一个解或活结点队列为空为止。

对于后进先出搜索(LIFO),其算法要依赖“栈”做基本的数据结构。

一开始,根结点入栈.从栈中弹出一个结点为当前扩展结点。

对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子入栈,再众栈中弹出一个结点为当前扩展结点,……,直到找到一个解或栈为空为止。

对于优先队列式扩展方式,不加入限界策略其实是无意义的,因为要说明解的最优性,必需搜索完问题全部解空间,才能下结论。

优先队列式搜索通过结点的优先级,可以使搜索尽快朝着解空间树上有最优解的分支推进,这样当前最优解一定较接近真正的最优解。

其后将当前最优解作为一个“标准”,对上界(或下界)不可能达到(或大于)这个“标准”的分支,则不去进行搜索,这样剪枝的效率更高,能较好地缩小搜索范围,从而提高搜索效率。

这种搜索策略称为优先队列式分支限界法,即“LC-检索”。

优先队列式分支限界法进行算法设计的要点如下:(1)结点扩展方式:无论哪种分支限界法,都需要有一张活结点表。

优先队列的分支限界法将活结点组织成一个优先队列,并按优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。

(2)结点优先级确定:优先队列中结点优先级常规定为一个与该结点相关的数值w,w一般表示以该结点为根的子树中的分支(其中最优的分支)接近最优解的程度。

(3)优先队列组织:结点优先级确定后,按结点优先级进行排序,就生成了优先队列。

排序算法的时间复杂度较高,考试到搜索算法每次只扩展一个结点,使用数据结构中介绍的堆排序比较合适,这样每次扩展结点时,比较交换的次数最少。

第3章作业分配问题3.1 问题描述题1:作业分配问题:设有A,B,C,D,E, …等n个人从事J1,J2,J3,J4,J5,…等n项工作,每人只能从事一项任务,每个任务由不同的工人从事有着不同的费用,求最佳安排使费用最低。

要求:输出每人所从事的工作任务以及最佳安排的最低费用。

题2:有两艘船和需要装运的n个货箱,第一艘船的载重量是c1,第二艘船的载重量是c2,Wi是货箱i的重量,且W1+W2+W3+W4+......+Wn<=c1+c2。

希望确定是否有一种可将所有n个货箱全部装船的方法。

要求:输出每艘船最终载重量.3.2 问题分析分支搜索法是一种在问题解空间上进行搜索尝试的算法。

是采用广度优先的策略国,依次搜索E-结点的所有分支,也就是所有的相邻结点。

和回溯法一样,在生成的结点中,抛弃那些不满足约束条件的结点,其余结点加入活结点表。

然后从表中选择一个结点作为下一个E-结点,断续搜索。

在分支定界算法中,每一个活结点只有一次机会成为扩展结点。

利用分支定界算法对问题的解空间树进行搜索,它的搜索策略是:(1)产生当前扩展结点的所有孩子结点;(2)在产生的孩子结点中,抛弃那些不可能产生可行解(或最优解)的结点;(3)将其余的孩子结点加入活结点表;(4)从活结点表中选择下一个活结点作为新的扩展结点。

合集下载

第5章-3 分支限界算法设计基本方法

第5章-3 分支限界算法设计基本方法
9
南京信息工程大学计算机与软件学院
问题的解空间:
与回溯法相同,一般用解空间树 解空间树(Solution Space 解空间树 Trees,也称状态空间树)的方式组织。 例如,对于n=3时的0-1背包问题,可用完全二叉树 表示其解空间,如下图所示。
南京信息工程大学计算机与软件学院
10
对解空间树的动态搜索过程
南京信息工程大学计算机与软件学院 4
5.3.1
分支限界法的基本思想
深度优先搜索
ABDHIEJKCFLMGNO
广度优先搜索
ABCDEFGHIJKLMNO
南京信息工程大学计算机与软件学院
5
5.3.1
分支限界法的基本思想
分支限界法常以广度优先或以最小耗费 (最大效益)优先的方式搜索问题的解空间 树。 对已处理的各结点根据限界函数估算目 标函数的可能取值,从中选取使目标函数取 得极值(极大/极小)的结点优先进行广度优 先搜索 不断调整搜索方向,尽快找到解。 特点:限界函数常基于问题的目标函数,适 特点: 用于求解最优化问题。
南京信息工程大学计算机与软件学院
11
广度优先遍历过程
在分支结点上,依次搜索该结点的所有孩子结点, 在分支结点上,依次搜索该结点的所有孩子结点, 分别估算这些孩子结点的目标函数的可能取值; 分别估算这些孩子结点的目标函数的可能取值; 如果某孩子结点的目标函数可能取得的值超出目 标函数的界,则将其丢弃, 标函数的界,则将其丢弃,因为从这个结点生成 的解不会比目前已经得到的解更好; 的解不会比目前已经得到的解更好; 否则,将其加入待处理结点表(简称活结点表) 否则,将其加入待处理结点表(简称活结点表) 中。
18
南京信息工程大学计算机与软件学院

9——分支限界法

9——分支限界法
14

2 例9.1-限界
x3=1
x2=1 4
x1=1 2 x2=0 5
1
x1=0 3 x2=1 6
x2=0
x3=1 x3=0
x3=0 x3=1
x3=0 x3=1 x3=0
7
8

9
10
11 12
13
14
15
W={50,10,10},C1=60。 在此例中,结点3所在分支的所有子树中,装载货物的最 大可能是多少? 20。
20
2 例9.1-算法2 FIFO分支限界
AddLiveNode(folat wt,int i, QNode *E, int ch) { Qnode *b; if (i=n) //叶子 { if (wt>bestw) //目前的最优解 { bestE=E; bestx[n]=ch;} //bestx[n]取值为ch return; } b = new QNode; // 不是叶子, 添加到队列中 b->weight=wt; b->parent=E; b->LChild=ch; add (Q,b) ; }
3 7 14 15


分支搜索法是一种在问题解空间上进行搜索尝试的算法。 所谓“分支”是采用广度优先的策略,依次生成E-结点所 有分支,也就是所有的儿子结点。 和回溯法一样,可以在生成的结点中,抛弃那些不满足约 束条件的结点,其余结点加入活结点表。然后从表中选择 一个结点作为下一个E-结点。 选择下一个E-结点方式的不同导致几种分支搜索方式:
8
2 例9.1 装载问题
子集树
x3=1
x2=1 4
x1=1 2 x2=0 5
1
x1=0 3 x2=1 6

最佳调度问题_分支限界法

最佳调度问题_分支限界法

最佳调度问题_分⽀限界法最佳调度问题【问题描述】假设有n个任务由k个可并⾏⼯作的机器完成。

完成任务i需要的时间为ti。

试设计⼀个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。

【编程任务】对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。

编程计算完成这n个任务的最佳调度。

【输⼊样例】7 32 14 4 16 6 5 3【输出样例】17即此问题为七个任务,三台机器。

⾸先列个七乘三的⼆维数组了解算法思路:我们知道回溯法其实是穷举法加剪枝函数,我们的函数⽤到递归,层层返回。

⼀共七层,每层的除去叶⼦节点都有三个孩⼦每搜索到叶⼦节点就更新⼀次maxnum值(⼩于maxnum则更新)(初值为⼀个较⼤的数),是⽤⼀次搜索结束后三个机器中花费时间最长的机器的所⽤时间作为此次分配的所⽤时间,。

1 #include<bits/stdc++.h>2using namespace std;3int n,k;4int x[100];//机器5int x1[100];//作业6int maxnum=1000000;78void task(int level)9 {10if(level>n){11int temp=0;12for(int i=1;i<=k;i++){13if(x[i]>temp){14 temp=x[i];15 }16 }17if(temp<maxnum){18 maxnum=temp;19 }20 }21else{22for(int i=1;i<=k;i++){23 x[i]+=x1[level];24 task(level+1);25 x[i]-=x1[level];26 }27 }28 }29int main()30 {31 cin >> n;32 cin >> k;33for(int i=1;i<=n;i++){34 cin >>x1[i];35 }36 task(1);37 cout << maxnum;38return0;39 }。

分支限界作业分配

分支限界作业分配

第3章作业分配问题问题描述题1:作业分配问题:设有A,B,C,D,E, …等n个人从事J1,J2,J3,J4,J5,…等n项工作,每人只能从事一项任务,每个任务由不同的工人从事有着不同的费用,求最佳安排使费用最低。

要求:输出每人所从事的工作任务以及最佳安排的最低费用。

题2:有两艘船和需要装运的n个货箱,第一艘船的载重量是c1,第二艘船的载重量是c2,Wi是货箱i的重量,且W1+W2+W3+W4+......+Wn<=c1+c2。

希望确定是否有一种可将所有n个货箱全部装船的方法。

要求:输出每艘船最终载重量.问题分析分支搜索法是一种在问题解空间上进行搜索尝试的算法。

是采用广度优先的策略国,依次搜索E-结点的所有分支,也就是所有的相邻结点。

和回溯法一样,在生成的结点中,抛弃那些不满足约束条件的结点,其余结点加入活结点表。

然后从表中选择一个结点作为下一个E-结点,断续搜索。

在分支定界算法中,每一个活结点只有一次机会成为扩展结点。

利用分支定界算法对问题的解空间树进行搜索,它的搜索策略是:(1)产生当前扩展结点的所有孩子结点;(2)在产生的孩子结点中,抛弃那些不可能产生可行解(或最优解)的结点;(3)将其余的孩子结点加入活结点表;(4)从活结点表中选择下一个活结点作为新的扩展结点。

如此循环,直到找到问题的可行解(最优解)或活结点表为空。

分支限界法的思想是:首先确定目标值的上下界,边搜索边减掉搜索树的某些支,提高搜索效率。

题1:先看一个实例,设有A,B,C,D,E 5人从事J1,J2,J3,J4,J5项工作,每人只能从事一项,他们的效益如图所示,求最佳安排使效益最高。

要求:输出每人所从事的工作项目以及最佳安排的最高效益。

考虑任意一个可行解,例如矩阵中的对角线是一个合法的选择,表示将任务J1分配给人员A,任务J2分配给人员B,任务J3分配给人员C,任务J4分配给D,任务J5分配给E,其总效益是10+10+7+11+4=42;或者应用贪心法求得一个近似解:人员A从事J2时效益最大,将任务J2分配给人员A,剩余工作中人员B从事J1时效益最大,任务J1分配给人员B,J3、J4、J5中人员D从事J4时效益最大,任务J4分配给人员D,J3和J5中人员C从事J3时效益最大,任务J3分配给人员C,任务J5只能分配给人员E,其总效益是11+13+11+7+4=46.显然,42和46都不能确定是最优解,有可能还有比其更大的效益,这两个解其一并不一定是一个最可行的选择,它们仅仅提供了一个参考,这样,可以以其中一个作为参考来进一步对各种作业分配方案进行搜索,比较其每种分配方式的效益.最大的总效益为最优解,其分配方案为最佳分配方案.题2:先看一个实例,当n=3,c1=c2=50,w={10,40,40}时,可将货箱1,2装到第一艘船上,货箱3装到第二艘船上.但如果w={20,40,40},则无法将货箱全部装船.由此可知问题可能有解,可能无解,也可能有多解.下面以找出问题的一个解为目标设计算法.虽然是关于两艘船的问题,其实只讨论一艘船的最大装载问题即可.因为当第一艘船的最大装载为bestw时,若w1+w2+…+wn-bestw<=c2则可以确定一种解,否则问题就无解.这样问题转化为第一艘船的最大装载问题.算法设计题1:问题的解空间为一个子集树,所有可能的解都可通过一个求解树给出.也就是算法要考虑任务是否分配给人员的情况组合,n个任务分配给n个人员的组合共n*n种情况,作业分配子集树是n=4的子集树它是用FIFO分支搜索算法解决该问题的扩展结点的过程编号的.1 个人作业分配2 3 13 4 2 24 5 3 4 5 35 4 5 5 4 4作业分配子集树在任务分配中,如实例中若n=4时,J1分配给A则向左走,否则往右走,直到走到最后,把最终的总效益求出,并把第一次求出的总效益作为最大效益与后边的总效益相比较,比其大者,交换两者,大的作为最大效益.依次方法,直到找到最优解,并输出其值以及其最大效益时的最佳分配方案.(1)用FIFO分支搜索所有的分支,并记录已搜索分支的最优解,搜索完子集树也就找出了问题的解.图中结点1为第零层,是初始E-结点;扩展后结点2,3为第一层;3,4,2是第一个任务分配出去后的下一层扩展结点,4,5,3,4,5是第二个任务分配出去后下一层的扩展结点(即分配情况).(2)用task[i]来表示任务是否分配及分配了给哪个工人,即task[i]=0时表示任务i 未分配, task[i]=j表示任务i分配给了工人j;用worker[k]=0或1来表示工人k是否分配了任务, worker[k]=0表示工人k未分配任务, worker[k]=1表示工人k已分配了任务.(3)把最低费用用mincost来表示和c[i][j]表示工人j执行任务i时的费用,并把c[i][j]和mincost分别初始化为c[1000][1000]和100000;同时把ask[i]和temp[i]、worker[i]的存储空间初始为task[1000]和temp[1000]、worker[1000],之后把其初始化为0.(4)用Plan(int k,unsigned int cost)来对分配作业的解空间树进行搜索,搜索的时候,每个活结点要记录下搜索的路径(即分配方案),存储在temp[i]中,并求出费用cost,然后cost与最小费用mincost进行比较,较小者是最小费用,其分配方案为最佳分配方案.(5)下面的算法中用Plan(int k,unsigned int cost)中的第二个for循环来实现对解空间树的搜索,第一次for(i=0)时,找出0号工人分别执行0,1,2,3,4号任务时总花费最小;第二次for(i=1)时,找出1号工人分别执行除0号工人的任务以外任务时总花费最小,并与i=0时的总花费最小比较;…;第五次for(i=4)时,找出总花费最小,并与上次的总花费最小比较;依次类推对解空间树进行搜索.第一个for循环把cost 与mincost进行比较,求出最小费用并记录出最小费用的分配方案.题2:转化为一艘船的最优化问题后,问题的解空间为一个子集树(问题的解空间树中的子集树).也就是算法要考虑所有物品取舍情况的组合.(1)要想求出最优解,必须搜索到叶结点.所以要记录树的层次,当层次为n+1时,搜索完全部叶结点,算法结束.不同于回溯算法,分支搜索过程中活结点的“层”是需要标识的,否则在入队后无法识别结点所在的层.下面算法,每处理完一层让“-1”入队,以此来标识“层”,并用记数变量i来记录当前层.(2)每个活结点要记录当前船的装载量.(3)为了突出算法思想,对数据结构队及其操作只进行抽象描述.用Queue代表队列类型,则Queue Q:定义了一个队列Q,相关操作有:add(Q,….)表示入队;Empty(Q)测试队列是否为空,为空则返回真值。

分支限界法解批处理作业调度问题java

分支限界法解批处理作业调度问题java

作业调度问题是指在多道程序系统中,根据各道程序的特点和系统的资源状况,合理地安排各道程序的执行顺序。

而分支限界法是一种解决排列、组合、0-1背包等问题的常用技术,可以有效地解决作业调度问题。

本文将结合Java语言,介绍如何使用分支限界法来解决作业调度问题。

一、作业调度问题的基本概念1. 作业调度问题的定义作业调度是指计算机系统对各种作业的安排和分配,以便使计算机系统有效地利用资源,提高各类作业的完成时间和各项资源的利用率。

2. 作业调度问题的类型作业调度问题主要分为单机调度和并行机调度两种类型。

其中单机调度是指一个作业在一台机器上进行处理,而并行机调度是指多个作业在多台机器上进行处理。

3. 作业调度问题的目标作业调度问题的主要目标是减少作业的等待时间,提高系统吞吐量,提高资源利用率,减少作业的周转时间等。

二、分支限界法的基本原理1. 分支限界法的概念分支限界法是一种剪枝技术,通过遍历搜索所有可能的解空间,并在搜索过程中剪掉某些明显不可能得到最优解的分支,从而有效地降低了搜索空间的规模。

2. 分支限界法的特点分支限界法在搜索过程中,通过剪枝操作,能够大大降低搜索空间的规模,提高搜索效率。

在解决NP难问题时,分支限界法通常能够得到较为满意的解。

3. 分支限界法的应用分支限界法被广泛应用于排列、组合、0-1背包、作业调度等各种组合优化问题的求解过程中,具有较高的实用性和效率。

三、分支限界法解决作业调度问题的具体步骤1. 确定问题的数学模型需要将作业调度问题转化为数学模型,例如采用Gantt图或者某种数学表达形式来描述作业的调度顺序和资源分配情况。

2. 设计合适的状态空间树根据问题的特点,设计合适的状态空间树来表示各种可能的作业调度方案,并利用分支限界法进行搜索。

3. 利用分支限界法进行搜索对设计好的状态空间树进行搜索,通过适当的剪枝操作,降低搜索空间的规模,提高搜索效率,直到找到最优解或者满意解为止。

(完整版)分支限界算法作业分配问题

(完整版)分支限界算法作业分配问题

分支限界法的研究与应用摘要:分支限界法与回溯法的不同:首先,回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。

其次,回溯法以深度优先的方式搜索解空间树,而分支限界法则一般以广度优先或以最小耗费优先的方式搜索解空间树。

再者,回溯法空间效率高;分支限界法往往更“快”。

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

在分支限界法中,每一个活结点只有一次机会成为扩展结点。

活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。

这个过程一直持续到找到所需的解或活结点表为空时为止。

常见的分支限界法有:队列式分支限界法,按照队列先进先出原则选取下一个结点为扩展结点。

栈式分支限界法,按照栈后进先出原则选取下一个结点为扩展结点。

优先队列式分支限界法,按照规定的结点费用最小原则选取下一个结点为扩展结点(最采用优先队列实现)。

分支搜索法是一种在问题解空间上进行搜索尝试的算法。

所谓分支是采用广度优先的策略国,依次搜索E-结点的所有分支,也就是所有的相邻结点。

和回溯法一样,在生成的结点中,抛弃那些不满足约束条件的结点,其余结点加入活结点表。

然后从表中选择一个结点作为下一个E-结点,断续搜索。

关键词:分支限界法回溯法广度优先分支搜索法目录第1章绪论 (3)1.1 分支限界法的背景知识 (3)1.2 分支限界法的前景意义 (3)第2章分支限界法的理论知识.................. 错误!未定义书签。

2.1 问题的解空间树 ............................................... 错误!未定义书签。

(完整版)分支限界作业分配

第3章作业分配问题3.1 问题描述题1:作业分配问题:设有A,B,C,D,E, …等n个人从事J1,J2,J3,J4,J5,…等n项工作,每人只能从事一项任务,每个任务由不同的工人从事有着不同的费用,求最佳安排使费用最低。

要求:输出每人所从事的工作任务以及最佳安排的最低费用。

题2:有两艘船和需要装运的n个货箱,第一艘船的载重量是c1,第二艘船的载重量是c2,Wi是货箱i的重量,且W1+W2+W3+W4+......+Wn<=c1+c2。

希望确定是否有一种可将所有n个货箱全部装船的方法。

要求:输出每艘船最终载重量.3.2 问题分析分支搜索法是一种在问题解空间上进行搜索尝试的算法。

是采用广度优先的策略国,依次搜索E-结点的所有分支,也就是所有的相邻结点。

和回溯法一样,在生成的结点中,抛弃那些不满足约束条件的结点,其余结点加入活结点表。

然后从表中选择一个结点作为下一个E-结点,断续搜索。

在分支定界算法中,每一个活结点只有一次机会成为扩展结点。

利用分支定界算法对问题的解空间树进行搜索,它的搜索策略是:(1)产生当前扩展结点的所有孩子结点;(2)在产生的孩子结点中,抛弃那些不可能产生可行解(或最优解)的结点;(3)将其余的孩子结点加入活结点表;(4)从活结点表中选择下一个活结点作为新的扩展结点。

如此循环,直到找到问题的可行解(最优解)或活结点表为空。

分支限界法的思想是:首先确定目标值的上下界,边搜索边减掉搜索树的某些支,提高搜索效率。

题1:先看一个实例,设有A,B,C,D,E 5人从事J1,J2,J3,J4,J5项工作,每人只能从事一项,他们的效益如图所示,求最佳安排使效益最高。

要求:输出每人所从事的工作项目以及最佳安排的最高效益。

考虑任意一个可行解,例如矩阵中的对角线是一个合法的选择,表示将任务J1分配给人员A,任务J2分配给人员B,任务J3分配给人员C,任务J4分配给D,任务J5分配给E,其总效益是10+10+7+11+4=42;或者应用贪心法求得一个近似解:人员A 从事J2时效益最大,将任务J2分配给人员A,剩余工作中人员B从事J1时效益最大,任务J1分配给人员B,J3、J4、J5中人员D从事J4时效益最大,任务J4分配给人员D,J3和J5中人员C从事J3时效益最大,任务J3分配给人员C,任务J5只能分配给人员E,其总效益是11+13+11+7+4=46.显然,42和46都不能确定是最优解,有可能还有比其更大的效益,这两个解其一并不一定是一个最可行的选择,它们仅仅提供了一个参考,这样,可以以其中一个作为参考来进一步对各种作业分配方案进行搜索,比较其每种分配方式的效益.最大的总效益为最优解,其分配方案为最佳分配方案.题2:先看一个实例,当n=3,c1=c2=50,w={10,40,40}时,可将货箱1,2装到第一艘船上,货箱3装到第二艘船上.但如果w={20,40,40},则无法将货箱全部装船.由此可知问题可能有解,可能无解,也可能有多解.下面以找出问题的一个解为目标设计算法.虽然是关于两艘船的问题,其实只讨论一艘船的最大装载问题即可.因为当第一艘船的最大装载为bestw时,若w1+w2+…+wn-bestw<=c2则可以确定一种解,否则问题就无解.这样问题转化为第一艘船的最大装载问题.3.3 算法设计题1:问题的解空间为一个子集树,所有可能的解都可通过一个求解树给出.也就是算法要考虑任务是否分配给人员的情况组合,n个任务分配给n个人员的组合共n*n种情况,作业分配子集树是n=4的子集树它是用FIFO分支搜索算法解决该问题的扩展结点的过程编号的.1 个人作业分配2 3 13 4 2 24 5 3 4 5 3作业分配子集树在任务分配中,如实例中若n=4时,J1分配给A则向左走,否则往右走,直到走到最后,把最终的总效益求出,并把第一次求出的总效益作为最大效益与后边的总效益相比较,比其大者,交换两者,大的作为最大效益.依次方法,直到找到最优解,并输出其值以及其最大效益时的最佳分配方案.(1)用FIFO分支搜索所有的分支,并记录已搜索分支的最优解,搜索完子集树也就找出了问题的解.图中结点1为第零层,是初始E-结点;扩展后结点2,3为第一层;3,4,2是第一个任务分配出去后的下一层扩展结点,4,5,3,4,5是第二个任务分配出去后下一层的扩展结点(即分配情况).(2)用task[i]来表示任务是否分配及分配了给哪个工人,即task[i]=0时表示任务i未分配, task[i]=j表示任务i分配给了工人j;用worker[k]=0或1来表示工人k是否分配了任务, worker[k]=0表示工人k未分配任务, worker[k]=1表示工人k已分配了任务.(3)把最低费用用mincost来表示和c[i][j]表示工人j执行任务i时的费用,并把c[i][j]和mincost分别初始化为c[1000][1000]和100000;同时把ask[i]和temp[i]、worker[i]的存储空间初始为task[1000]和temp[1000]、worker[1000],之后把其初始化为0.(4)用Plan(int k,unsigned int cost)来对分配作业的解空间树进行搜索,搜索的时候,每个活结点要记录下搜索的路径(即分配方案),存储在temp[i]中,并求出费用cost,然后cost与最小费用mincost进行比较,较小者是最小费用,其分配方案为最佳分配方案.(5)下面的算法中用Plan(int k,unsigned int cost)中的第二个for循环来实现对解空间树的搜索,第一次for(i=0)时,找出0号工人分别执行0,1,2,3,4号任务时总花费最小;第二次for(i=1)时,找出1号工人分别执行除0号工人的任务以外任务时总花费最小,并与i=0时的总花费最小比较;…;第五次for(i=4)时,找出总花费最小,并与上次的总花费最小比较;依次类推对解空间树进行搜索.第一个for循环把cost与mincost进行比较,求出最小费用并记录出最小费用的分配方案.题2:转化为一艘船的最优化问题后,问题的解空间为一个子集树(问题的解空间树中的子集树).也就是算法要考虑所有物品取舍情况的组合.(1)要想求出最优解,必须搜索到叶结点.所以要记录树的层次,当层次为n+1时,搜索完全部叶结点,算法结束.不同于回溯算法,分支搜索过程中活结点的“层”是需要标识的,否则在入队后无法识别结点所在的层.下面算法,每处理完一层让“-1”入队,以此来标识“层”,并用记数变量i来记录当前层.(2)每个活结点要记录当前船的装载量.(3)为了突出算法思想,对数据结构队及其操作只进行抽象描述.用Queue代表队列类型,则Queue Q:定义了一个队列Q,相关操作有:add(Q,….)表示入队;Empty(Q)测试队列是否为空,为空则返回真值。

第七章分枝-限界法

▪得以生成的其它结点仅是2,34,50,19,24,32 和31。易于看出,如果使用度量1,则对于 每一种分枝-限界算法,总是生成最小数目 的结点。
6
▪如果使用度量2,则要成为E-结点的结点 只是由根到最近的那个答案结点路径上的 那些结点。
▪以后用C(.)表示“有智力的”排序函数,有称
为结点的成本函数。其定义如下:
在子树X中离X最近的那个答案结点到X的路径长 度
5
▪使用后一种度量,图7.1中树的根结点付出 的代价是4。结点(18和34),(29和35) 以及(30和38)的代价分别是3,2和1。
▪所有在2,3和4级上剩余结点的代价应分别 大于3,2和1。以这些代价作为选择下一个E结点的依据,则E-结点依次为1,18,29和30。
▪初始排列和目标排列叫做初始状态和目标状 态。
▪若由初始状态到某状态存在一系列合法的移 动,则称该状态可由初始状态到达。
▪一种初始状态的状态空间由所有可从初始状
态到达的状态构成。
12
例:15-谜问题
▪ 可以看出棋盘上这些牌有16!种不同的排列, 所以这个问题的状态空间是相当庞大的。
▪有必要在具体求解问题之前判定目标状态是 否在这个初始状态的状态空间中。
1
例7.1 :4-皇后问题
39
55
2
本例考察用一个FIFO分支-限界算法检索 4-皇后问题的状态空间树的基本过程。
起初,只有一个活结点,即结点1。这表 示没有皇后被放在棋盘上。
扩展这个结点,生成它的儿子结点 2,18,34和50。这些结点分别表示皇后1在 第1行的1,2,3,4列情况下的棋盘。
因此这种检索策略称之为最小成本检索,简称 LC-检索。
10
例:15-谜问题

分支限界法


2. 一般情况下,对于一个正在生成的路径,假设已经确定 了前i段(1≤i≤k),其路径为(r1, r2, …, ri, ri+1),此时,该 部分解的目标函数值的计算方法即限界函数如下:
lb
c[r ][r
j j 1
i
+ j 1 ]
ri 1 , v p E
min
{c[ri 1 ][v p ]}
lb v
k i 1
第k行的最小值
n
假设已经将任务2分配给人员a,任务3分配给人员b,花费的 成本是5,则该部分解可能获得的最小成本是5+(1+4)=10。
搜索过程?
任务1 任务2 任务3 任务4
C=
9 6 5 7
2 4 8 6
7 3 1 9
8 7 8 4
a b c d
9.3.3 批处理作业调度问题
9.2 图问题中的分支限界法
9.2.1 TSP问题 9.2.2 多段图的最短路径问题
9.2.1 TSP问题
问题描述:TSP问题是指旅行家要旅行n个城市,要 求各个城市经历且仅经历一次然后回到出发城市, 并要求所走的路程最短。 想法: 确定目标函数的界[down, up] 。(提示:如何确 定上、下界?) 确定目标函数值的计算方法(限界函数)。
分支限界法需要解决的关键问题
如何确定合适的限界函数。(提示:计算简单, 减少搜索空间,不丢解) 如何组织待处理结点表。(提示:表PT可以采用 堆的形式,也可以采用优先队列的形式存储。各有什 么特点?) 如何确定最优解的各个分量。(提示:跳跃式处 理解空树结点,必须保存搜索过程中经过的路径信 息。)
9.1.1 分支限界法的设计思想
确定一个合理的限界函数,并根据限界函数确定目 标函数的界[down, up]。

算法设计与分析分支限界法02


n
32
智能信息处理研究中心(RCIIP)
旅行售货员问题
实例——FIFO队列式
A
1 2 3
1
30 5 4
2 10 4
P
6 3
B
3 2
4 4 2
20
B C,D,E
a
C
4
D
E
3
F
4
G
3
H
4
I
2
26 3
J P
K
2

n
F,G,H,I,J,K L,M,N,P,Q
33
L
59
M
66
N
25
O
Q
智能信息处理研究中心(RCIIP)
bestw
a
右儿子剪枝
// 检查右儿子结点
if (Ew + r > bestw && i < n) Q.Add(Ew); Q.Delete(Ew);
n
// 可能含最优解 // 取下一扩展结点
29
智能信息处理研究中心(RCIIP)
装载问题
构造最优解 P
为了在算法结束后能方便地构造出与最优值相应的最 优解,算法必须存储相应子集树中从活结点到根结点 的路径。为此目的,可在每个结点处设置指向其父结 a 点的指针,并设置左、右儿子标志。 找到最优值后,可以根据parent回溯到根节点,找到 最优解。
28
智能信息处理研究中心(RCIIP)
装载问题
算法的改进
// 检查左儿子结点
Type wt = Ew + w[i]; if (wt <= c) {
P // 左儿子结点的重量
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档