回溯法之批處理作業排程
1. 問題描述
n個作業集合。每個作業先由機器1處理,再由機器2處理。作業i需要機器j處理的時間為mij 。
mij機器1
機器2作業1
作業2作業3
對於乙個確定的作業排程,設fij 是作業i在機器j上完成的具體時間。所有作業在機器2上完成的具體時間(時刻)之和f稱為該作業排程的完成時間和。
要求:對於給定的n個作業,制定最佳作業排程方案(乙個排列),使其完成時間和達到最小
2. 問題分析
3個作業的6種可能的排程方案是1-2-3;1-3-2;2-1-3;2-3-1;3-1-2;3-2-1;它們所相應的完成時間和分別是19,18,20,21,19,19。易見,最佳排程方案是1-3-2,其完成時間和為18。
fi1、fi2表示事件i分別在機器1和機器2上完成的時間。
作業順序
fi1fi2
fbegin
假設此時1-2-3的作業排程已經完成計算,遍歷到了1-3-2的序列。
首先是①,將呼叫f1 += m[x[j]][1];表示作業1在機器1需要2時間才能完成,接下來使用f2[i] = ((f2[i - 1] > f1) ? f2[i - 1] : f1) + m[x[j]][2];比較f02 和 f11 的大小,即需要等待前乙個作業在機器2完成計算才能在機器2開始本次作業,再使用f02 和 f11的較大值f11+作業2在機器2的工作時間1得到f12為3,在使用f += f2[i],將3賦值給f。
到③,呼叫f1 += m[x[j]][1];,f21變為2+2=4,再比較f12和f21,將較大的f21+3=7賦值給f22。f變為10。
到②,f31變為7,比較f22和f31,將7+1=8複製給f32,最終將f變為18,得到最終結果。
3. **求解
該問題的解空間:排列樹:
使用到的全域性變數:
m 各作業所需的處理時間
x 當前作業排程
bestx 當前最優作業排程
f2 機器2完成的處理時間
f1 機器1完成的處理時間
f 完成時間和
bestf 當前最優值
n 作業數
核心求解**:
void backtrack(int i) else else {
// 若沒找到此時的最優解,則對當前的求解樹的子節點遍歷求解
for (int j = i; j <= n; j++) {
f1 += m[x[j]][1];
f2[i] = ((f2[i - 1] > f1) ? f2[i - 1] : f1) + m[x[j]][2];
f += f2[i];
if (f < bestf) {
swap(i, j);
backtrack(i + 1);
swap(i, j);
f1 -= m[x[j]][1];
f -= f2[i];
void main() {
n = 3;
bestf = int_max;
m[1][1] = 2;m[1][2] = 1;
m[2][1] = 3;m[2][2] = 1;
m[3][1] = 2;m[3][2] = 3;
for (int i = 0; i <= n; i++) {
f2[i] = 0;
x[i] = i;
backtrack(1);
printf("%d\n", bestf);
for (int i = 1; i <= n; i++) {
printf("%d ", bestx[i]);
if (i != n)
printf("-> ");
printf("\n");
system("pause");
回溯法 批處理作業排程 回溯法 批處理作業排程
問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先有機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理時間。則所有作業在機器2上完成處理時間和f f2i,稱為該...
回溯法之批處理作業排程
n個作業集合。每個作業先由機器1處理,再由機器2處理。作業i需要機器j處理的時間為mij mij機器1 機器2作業121 作業23 1作業323 對於乙個確定的作業排程,設fij 是作業i在機器j上完成的具體時間。所有作業在機器2上完成的具體時間 時刻 之和f稱為該作業排程的完成時間和。要求 對於給...
批處理作業排程(回溯法)
1.問題描述 給定n個作業,集合j j1,j2,j3 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先有機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理時間。則所有作業在機器2上完成處理時間和,稱為該作業排...