問題描述:
n個作業(1,2,…,n)要在兩台機器上處理,每個作業必須先由機器1處理,然後再由機器2處理,機器1處理作業i所需時間為a1,機器2處理作業i所需時間為bj(1<=i<=n),批處理作業排程問題要求確定這n個作業的最優處理順序,使得從第1個作業在機器1上處理開始,到最後乙個作業在機器2上處理結束所需時間最少。
例:作業-機器時間關係表為
約束條件:
當前作業的執行時間和必須小於之前已選擇序列時間和的最小值
解圖:
圖中limit為限制條件,real為完成當前作業執行時間和,當real>=limit則回溯。
完整**:
#include
const
int inf=
1000
;const
int max_task=10;
//最大任務數
int n;
//任務數
int a[max_task][2
];//儲存每個作業分別在機器1與機器2上的時間消耗
int result[max_task]
;//儲存排列樹中的一條路徑
int best_result[max_task]
;//儲存最優路徑
int min=inf;
//安排任務最小完成時間
int rop[max_task+1]
;//每個深度對應遍歷進度
int finish[max_task+1]
;//每一層消耗時間和
void
swap
(int result[max_task]
,int best_result[max_task]
)//複製陣列
void
allot_task
(int depth)
} f2=f1+a[i][1
];//該作業完成時間
if(f2
)//該序列執行到此作業消耗時間
f2=finish[depth-1]
; finish[depth]
=f2;
if(depth==n)
//最後乙個作業
visited[i]
=false;
rop[depth]=0
;return;}
else
if(depth
else}}
visited[rop[depth]-1
]=false;
//跟換當前層次作業需要把之前作業解標記
} visited[rop[depth]-1
]=false;
rop[depth]=0
;return;}
main()
allot_task(1
);printf
("最優排程序列為:");
for(
int i=
0;i)printf
("\n消耗時間為:%d\n"
,min)
;}
執行結果:
回溯法 批作業排程問題
問題 給定n個作業的集合。每個作業必須先由機器1處理,然後由機器2處理。所有作業在機器2上完成處理的時間和稱為該作業排程的完成時間和。批處理作業排程問題要求對於給定的n個作業,制定最佳作業排程方案 給出作業的加工順序 使其完成時間和達到最小。分析 所有可能的解為各個任務的乙個全排列,因此是乙個子集樹...
回溯法 批處理作業排程 回溯法 批處理作業排程
問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先有機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理時間。則所有作業在機器2上完成處理時間和f f2i,稱為該...
回溯法 批處理作業排程問題
給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先由機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji i 1,2,n j 1,2。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理的時間。則所有作業在機器2上完成處理的時...