1. 程式人生 > >第五章 回溯法-批處理作業排程

第五章 回溯法-批處理作業排程

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 plain copy
  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. }