第五章 回溯法-批处理作业调度

来源:互联网 发布:java web开发实战经典 编辑:程序博客网 时间:2024/06/04 18:08

http://blog.csdn.net/wzq153308/article/details/46365177

问题描述

给定 n 个作业的集合 j = {j1, j2, ..., jn}。每一个作业 j[i] 都有两项任务分别在两台机器上完成。每一个作业必须先由机器1 处理,然后由机器2处理。作业 j[i] 需要机器 j 的处理时间为 t[j][i] ,其中i = 1, 2, ..., n, j = 1, 2。对于一个确定的作业调度,设F[j][i]是作业 i 在机器 j 上的完成处理的时间。所有作业在机器2上完成处理的时间之和 f = sigma F[2][i] 称为该作业调度的完成时间之和。

批处理作业调度问题要求对于给定的 n 个作业,制定最佳作业调度方案,使其完成时间和达到最小。

[java] view plaincopy
  1. /*该代码采用了回溯法解决最优调度问题。 
  2.  * 算法思想:对于有n个不同的任务,搜索出其最佳排列,属于一棵排列树搜索问题。 
  3.  * 采用回溯法,搜索到第t层时,当已经是叶子节点时,说明该路径就是当前情况下的最优解。 
  4.  * 当t不是叶子节点时,依次按照一定的顺序执行当前剩下的任务,将剩下的任务全部遍历一遍。 
  5.  * 在遍历过程中,按照schedule[t:n]完成剩下的搜索。计算执行当前任务后,各个时间点 
  6.  * 的变化。如果该层某个节点的任务执行之后,依然符合剪枝函数,则将当前的策略顺序做出 
  7.  * 调整,将刚刚执行的那个节点的任务序号放置到当前,然后继续向下进行搜索。 
  8.  *  
  9.  * 剪枝函数:当当前节点的总时间已经大于已找到的最优时间,则该节点后面的节点都不用进行搜索。直接回溯。 
  10.  *  
  11.  * */  
  12. package BackTrack;  
  13.   
  14.   
  15. public class BestSchedule2 {  
  16.     int n=3;//作业数  
  17.     int[][] mission={{2,1},{3,1},{2,3}};  
  18.     int bestFinishtime = Integer.MAX_VALUE;//最短时间  
  19.     int[] schedule = {0,1,2};//默认的策略顺序。  
  20.     int[] bestSchedule = new int[n];//最佳顺序  
  21.     int[] f2 = new int[n];//第二台机器的每个任务的结束时间  
  22.     int f1,totaltime;//f1当前任务的结束时间,f2的总时间  
  23.     public void swap(int[] str,int m,int n){  
  24.         int temp = str[m];  
  25.         str[m] = str[n];  
  26.         str[n] = temp;  
  27.     }  
  28.       
  29.     public void BackTrack(int t){  
  30.         //当搜索到叶子节点后,将这次遍历的策略赋值到最佳策略。  
  31.         if(t>n-1){  
  32.             bestFinishtime = totaltime;  
  33.             for(int i=0;i<n;i++)  
  34.                 bestSchedule[i] = schedule[i];  
  35.             return;  
  36.         }  
  37.   
  38.         for(int i=t;i<n;i++){        //下面执行的是第t次的任务,全部遍历剩下的可能性。  
  39.             f1+=mission[schedule[i]][0];  
  40.             if(t==0)   
  41.                 f2[t]=f1+mission[schedule[i]][1];  
  42.             else  
  43.                 f2[t] = ((f2[t-1]>f1)?f2[t-1]:f1)+mission[schedule[i]][1];  
  44.             totaltime += f2[t];  
  45.             //如果该作业处理完之后,总时间已经超过最优时间,就直接回溯。  
  46.             if(totaltime<bestFinishtime){  
  47.                 swap(schedule,t,i); //把选择出的原来在i位置上的任务序号调到当前执行的位置t  
  48.                 BackTrack(t+1);  
  49.                 swap(schedule,t,i);//进行回溯,还原,执行该层的下一个任务。  
  50.             }  
  51.             f1 -= mission[schedule[i]][0];  
  52.             totaltime -= f2[t];  
  53.         }  
  54.     }         
  55.     public static void main(String[] args){  
  56.         BestSchedule2 bs = new BestSchedule2();  
  57.         bs.BackTrack(0);  
  58.         System.out.println("最佳调度方案为:");  
  59.         for(int i=0;i<bs.n;i++)  
  60.             System.out.print(bs.bestSchedule[i]+"  ");  
  61.         System.out.println();  
  62.         System.out.println("其完成时间为"+bs.bestFinishtime);  
  63.     }  
  64. }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为mate8忘了锁屏密码怎么办 红米4a打王者卡怎么办 苹果5s软件更新密码忘记了怎么办 华为荣耀P9进水了没有声音怎么办 华为荣耀7原相机不能拍照怎么办 华为手机触屏密码忘记了怎么办 华为荣耀10屏锁密码忘了怎么办 华为手机开机卡在开机界面怎么办 苹果6s国行不能用移动4g怎么办 苹果手机32g内存不够用怎么办 华为荣耀6x忘记了密码怎么办 百度粉色衣服被洗变色了怎么办 粉色衣服放进洗衣机洗变色了怎么办 红米note5a应用锁忘了怎么办 索尼手机死机了怎么办不可拆卸电池 华为手机一直停留在开机画面怎么办 5s用11.4太卡了怎么办 华为荣耀5a手机声音小怎么办 牙签卡在手机插卡针里怎么办 捡的华为手机账号激活不了怎么办 华为平板激活手机密码忘了怎么办 捡个华为手机非要激活才能用怎么办 华为手机没激活想重新激活怎么办 华为手机激活总显示系统繁忙怎么办 华为荣耀7i进水了不开机怎么办 华为荣耀手机进水了怎么办开不开机 华为畅享5s变砖怎么办 我的苹果7机身内存满了怎么办 小米5x拆机后屏幕翘边怎么办 苹果手机设备禁止游戏登入怎么办 苹果7plus玩游戏掉频怎么办 孕期牙套子掉了基牙烂掉了怎么办 美团绑定的信用卡过期了怎么办 苹果6s手机开不开机怎么办 换了散热硅胶后还是死机怎么办 华为畅享6s掉啦怎么办 透明塑料壳被太阳晒的发黄怎么办 新买的手机壳有味道怎么办 刚买的手机壳有异味怎么办 bjd 光油把妆蹭掉了一点怎么办 软皮套手机壳如果大了怎么办