使用回溯法解批處理作業調度問題<算法分析>


一、實驗內容及要求
 1.要求用回溯法原理求解問題;
 2.要求手工輸入t1[10]及t2[10],t1[i]是任務i在機器1上的執行時間,t2[i]是任務i在機器2上的執行時間;
 3.求出最優批處理作業調度總時間及作業安排順序。
二、實驗步驟
 1、手工輸入任務執行時間數組;
 2、輸出作業總時間和作業的安排順序。

package saunfafenxi;   
import java.util.Scanner;
public class shiyan5 {  
    static int worknum=3; 					//作業總數 
    static int[] T1 = new int[worknum];		//第i個任務在機器一上面執行的時間
    static int[] T2 = new int[worknum];		//第i個任務在機器一上面執行的時間
    static int[] jieguo = new int[worknum];	//保存結果的輔助數組
    static int[][] mission2 = new int[worknum][2];//第i個任務在機器一上面執行的時間
    int bestFinishtime = Integer.MAX_VALUE;		//最短時間  
    int[] schedule = {0,1,2};				//默認的策略順序。  
    int[] bestSchedule = new int[worknum];	//最佳順序  
    int[] f2 = new int[worknum];			//第二台機器的每個任務的結束時間  
    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>worknum-1){  
            bestFinishtime = totaltime;  
            for(int i=0;i<worknum;i++)  
                bestSchedule[i] = schedule[i];  
            return;  
        }  
        for(int i=t;i<worknum;i++){        //下面執行的是第t次的任務,全部遍歷剩下的可能性。  
            f1+=mission2[schedule[i]][0];  
            if(t==0)   
                f2[t]=f1+mission2[schedule[i]][1];  
            else  
                f2[t] = ((f2[t-1]>f1)?f2[t-1]:f1)+mission2[schedule[i]][1];  
            totaltime += f2[t];  
            								//如果該作業處理完之后,總時間已經超過最優時間,就直接回溯。  
            if(totaltime<bestFinishtime){  
                swap(schedule,t,i); 		//把選擇出的原來在i位置上的任務序號調到當前執行的位置t  
                BackTrack(t+1);  
                swap(schedule,t,i);			//進行回溯,還原,執行該層的下一個任務。  
            }  
            f1 -= mission2[schedule[i]][0];  
            totaltime -= f2[t];  
        }  
    }         
    public static void main(String[] args){  
    	Scanner in_t1 = new Scanner(System.in);
    	System.out.println("請輸入各任務在機器1上的執行時間:");	//循環輸入T1數組
        for(int i=0;i<worknum;i++){
            T1[i]=in_t1.nextInt();}
        
        System.out.println("請輸入各任務在機器2上的執行時間:");	//循環輸入T2數組
        for(int i=0;i<worknum;i++){
            T2[i]=in_t1.nextInt();}
        System.out.println("|\t\t-----各個作業所需時間如下----\t\t|");
        System.out.println("|\t作業\t|\t機器1\t|\t機器2\t|");
        for(int i=0;i<worknum;i++){
        	int s=i+1;
            System.out.println("|\t作業"+s+"\t|\t"+T1[i]+"\t|\t"+T2[i]+"\t|");	//循環輸出T1數組
}
        for(int i=0;i<worknum;i++){						//各個任務所需時間的二維數組
        	mission2[i][0]=T1[i];
        	mission2[i][1]=T2[i];
        	}
        shiyan5 bs = new shiyan5();  
        bs.BackTrack(0);  
        System.out.println("\n\n使用回溯得出的作業安排順序如下:");  
        for(int i=0;i<worknum;i++){  
        	jieguo[i]=bs.bestSchedule[i]+1;
            System.out.print("任務"+jieguo[i]+"\n");}   
        System.out.println("作業完成的總時間是"+bs.bestFinishtime);  
    }  
}  

結果截圖:

 

 

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM