問題:
給定n個作業的集合。每個作業必須先由機器1處理,然後由機器2處理。所有作業在機器2上完成處理的時間和稱為該作業排程的完成時間和。
批處理作業排程問題要求對於給定的n個作業,制定最佳作業排程方案(給出作業的加工順序),使其完成時間和達到最小。
分析:
所有可能的解為各個任務的乙個全排列,因此是乙個子集樹問題。約束函式沒有明確的要求,限界函式為當前已經完成的工件的總的完成時刻和小於最優解。
關鍵是求出每種情況下對應的結果。工件i在機器2上的結束時間等於開始時間+做工時間,開始時間是i在機器1上的結束時間和i-1在機器2上的結束時間中較大的那個,由此就構成了遞推計算式。
**:
#include
using
namespace std;
#define maxn 105
#define inf 0x3f3f3f
// 任務在機器1,2上耗費的時間
int f1[maxn]
;int f2[maxn]
;// 記錄最優排程
int res[maxn]
;// 當前最優解
int bestnow = inf;
// 當前所完成的工件在機器1上的總的完成時間之和,只記錄下當前的就可以了
int m1 =0;
// 當前所完成的工件在機器2上的總的完成時刻之和,每個都記錄下來方便計算
int m2[maxn]
;// 計算當前解
intsum
(int pos)
return tmp;
}// 限界函式
// mi1= m(i-1)1 + f1i; mi2 = max + f2xi;
bool
bound
(int pos)
// 遞迴法計算最優排程
void
arrangetraceback
(int pos,
int n)
else
// 恢復現場,只需恢復m1即可,m2不需要恢復,反正pos後面的也用不到
m1 -
= f1[res[pos]];
swap
(res[pos]
, res[i]);
}}}int
main()
f1[1]
=2; f1[2]
=3; f1[3]
=2;
f2[1]
=1; f2[2]
=1; f2[3]
=3;arrangetraceback(1
, n)
;
cout<}
複雜度:
排列樹,o(n!)
C C 回溯法 作業排程問題
問題描述 n個作業 1,2,n 要在兩台機器上處理,每個作業必須先由機器1處理,然後再由機器2處理,機器1處理作業i所需時間為a1,機器2處理作業i所需時間為bj 1 i n 批處理作業排程問題要求確定這n個作業的最優處理順序,使得從第1個作業在機器1上處理開始,到最後乙個作業在機器2上處理結束所需...
回溯法 批處理作業排程 回溯法 批處理作業排程
問題描述 給定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上完成處理的時...