电路板排序问题要求出拥有最小密度的最佳排序,当时我们是用回溯法来求的。
回顾了一下电路板问题,把当初没看懂的完善了一下。
当初用回溯法的基本思路,就是考虑我们插槽中包含的电路板数量是否等于其总数量,如果不相等则代表该电路板一定会产生跨越,因此要使得密度+1。
那么如果我们采用分支限界法的堆结构,那么构建的解空间树有n层,每层每个节点n-i个分支。当且仅当到达叶子节点开始结算每条路径的跨越数量,同样还是以当前插槽中包含的电路板数量是否等于其总数量为判断条件,若<则产生跨越使其密度+1。并且每次遍历完一条路径,如果有更小的跨度就可以更新,若当前跨度大于最小跨度则剪枝。
我们以广度优先遍历,每次寻找每层中最小跨度的节点最为下一次拓展的活结点,直到我们遍历完所有的活结点为止。
用分支限界法解决批处理作业调度问题,那么 我们应当建立一个最小堆进行分支选取。对于每层节点的分支应当是n个作业,以在两台机器上完成的处理时间为下界,选取最小结点进行遍历。
bbFlow(){
对各作业在机器1和2上作业时间排序
do{
if(到达叶结点){
if(当前作业安排机器2上完成时间和 < bestc){
更新bestc;
更新最优解;
}
}else{
For(int i=enode.已安排作业数; i<总作业数; i++){
求得当前下界bb;
If(bb < bestc){
结点插入最小堆;
}
}
}
取下一个拓展结点;
}while(enode!=null&&enode.s<=n)
}