第五章 回溯法-批處理作業排程
阿新 • • 發佈:2018-12-09
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
- /*該程式碼採用了回溯法解決最優排程問題。
- * 演算法思想:對於有n個不同的任務,搜尋出其最佳排列,屬於一棵排列樹搜尋問題。
- * 採用回溯法,搜尋到第t層時,當已經是葉子節點時,說明該路徑就是當前情況下的最優解。
- * 當t不是葉子節點時,依次按照一定的順序執行當前剩下的任務,將剩下的任務全部遍歷一遍。
- * 在遍歷過程中,按照schedule[t:n]完成剩下的搜尋。計算執行當前任務後,各個時間點
- * 的變化。如果該層某個節點的任務執行之後,依然符合剪枝函式,則將當前的策略順序做出
- * 調整,將剛剛執行的那個節點的任務序號放置到當前,然後繼續向下進行搜尋。
- *
- * 剪枝函式:噹噹前節點的總時間已經大於已找到的最優時間,則該節點後面的節點都不用進行搜尋。直接回溯。
- *
- * */
- package BackTrack;
- public class BestSchedule2 {
- int n=3;//作業數
- int[][] mission={{2,1},{3,1},{2,3}};
- int bestFinishtime = Integer.MAX_VALUE;//最短時間
- int[] schedule = {0,1,2};//預設的策略順序。
- int[] bestSchedule = new int[n];//最佳順序
- int[] f2 = new int[n];//第二臺機器的每個任務的結束時間
- int f1,totaltime;//f1當前任務的結束時間,f2的總時間
- public void swap(int[] str,int m,int n){
- int temp = str[m];
- str[m] = str[n];
- str[n] = temp;
- }
- public void BackTrack(int t){
- //當搜尋到葉子節點後,將這次遍歷的策略賦值到最佳策略。
- if(t>n-1){
- bestFinishtime = totaltime;
- for(int i=0;i<n;i++)
- bestSchedule[i] = schedule[i];
- return;
- }
- for(int i=t;i<n;i++){ //下面執行的是第t次的任務,全部遍歷剩下的可能性。
- f1+=mission[schedule[i]][0];
- if(t==0)
- f2[t]=f1+mission[schedule[i]][1];
- else
- f2[t] = ((f2[t-1]>f1)?f2[t-1]:f1)+mission[schedule[i]][1];
- totaltime += f2[t];
- //如果該作業處理完之後,總時間已經超過最優時間,就直接回溯。
- if(totaltime<bestFinishtime){
- swap(schedule,t,i); //把選擇出的原來在i位置上的任務序號調到當前執行的位置t
- BackTrack(t+1);
- swap(schedule,t,i);//進行回溯,還原,執行該層的下一個任務。
- }
- f1 -= mission[schedule[i]][0];
- totaltime -= f2[t];
- }
- }
- public static void main(String[] args){
- BestSchedule2 bs = new BestSchedule2();
- bs.BackTrack(0);
- System.out.println("最佳排程方案為:");
- for(int i=0;i<bs.n;i++)
- System.out.print(bs.bestSchedule[i]+" ");
- System.out.println();
- System.out.println("其完成時間為"+bs.bestFinishtime);
- }
- }