n個作業集合。每個作業先由機器1處理,再由機器2處理。作業i需要機器j處理的時間為mij 。
mij機器1
機器2作業121
作業23
1作業323
對於乙個確定的作業排程,設fij 是作業i在機器j上完成的具體時間。所有作業在機器2上完成的具體時間(時刻)之和f稱為該作業排程的完成時間和。
要求:對於給定的n個作業,制定最佳作業排程方案(乙個排列),使其完成時間和達到最小
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
fbegin00
0①23
3③47
10②78
18 假設此時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,得到最終結果。
該問題的解空間:排列樹:
使用到的全域性變數:
核心求解**:m 各作業所需的處理時間
x 當前作業排程
bestx 當前最優作業排程
f2 機器2完成的處理時間
f1 機器1完成的處理時間
f 完成時間和
bestf 當前最優值
n 作業數
void backtrack(int i)
} else
// 本條路徑求解結束後回退到原本的狀態
f1 -= m[x[j]][1];
f -= f2[i];}}
}
/**
* 回溯法求解批處理作業排程問題
* * 主要由backtrack函式遞迴呼叫求解問題
* 使用bsetf儲存最優解,bestx儲存最優的作業排程序列
**/#include #include #define maxrow 4
#define maxcol 3
/** * m 各作業所需的處理時間
* x 當前作業排程
* bestx 當前最優作業排程
* f2 機器2完成的處理時間
* f1 機器1完成的處理時間
* f 完成時間和
* bestf 當前最優值
* n 作業數
**/int m[maxrow][maxcol], x[maxrow], bestx[maxrow], f2[maxrow], f1, f, bestf, n;
// 值交換函式
void swap(int i, int j)
void backtrack(int i)
} else
f1 -= m[x[j]][1];
f -= f2[i];}}
}void main()
backtrack(1);
printf("%d\n", bestf);
for (int i = 1; i <= n; i++)
printf("\n");
system("pause");
}
回溯法 批處理作業排程 回溯法 批處理作業排程
問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先有機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理時間。則所有作業在機器2上完成處理時間和f f2i,稱為該...
回溯法 批處理作業排程 回溯法之批處理作業排程
回溯法之批處理作業排程 1.問題描述 n個作業集合。每個作業先由機器1處理,再由機器2處理。作業i需要機器j處理的時間為mij mij機器1 機器2作業1 作業2作業3 對於乙個確定的作業排程,設fij 是作業i在機器j上完成的具體時間。所有作業在機器2上完成的具體時間 時刻 之和f稱為該作業排程的...
批處理作業排程(回溯法)
1.問題描述 給定n個作業,集合j j1,j2,j3 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先有機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理時間。則所有作業在機器2上完成處理時間和,稱為該作業排...