回溯法 批作業排程問題

2021-10-10 13:45:03 字數 1450 閱讀 5350

問題:

給定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上完成處理的時...