問題描述:
n個作業,要在由機器m1和m2組成的流水線上完成加工。
每個作業加工的順序都是先在m1上加工,然後在m2上加工。
m1和m2加工作業i所需的時間分別為ai和bi。
要求確定這n個作業的最優加工順序,使得從第乙個作業在機器m1上開始加工,到最後乙個作業在機器m2上加工完成所需的時間最少。
問題分析:
直觀上,乙個最優排程應使機器m1沒有空閒時間,且機器m2的空閒時間最少。
在一般情況下,機器m2上會有機器空閒和作業積壓兩種情況。
設全部作業的集合為n=。s是n的作業子集。
通常,機器m1開始加工s中作業時,機器m2還在加工其它作業,要等時間t後才可利用。
將這種情況下完成s中作業所需的最短時間記為t(s, t)。
流水作業排程問題的最優值為t(n, 0)。
處理過程:
1. 將{a1,a2,…,an,b1,b2,…,bn}排成非遞減序列;
2. 依次從序列中抽出最小元素m,如果m = aj且作業j還沒有排入排程表,則把作業 j 安排在排程表可達的最左邊一項空位上(設n個作業的排程表有n項,開始全部為空)。
3. 如果m = bj且作業j還沒有排入排程表,則把作業j安排在排程表可達的最右邊一項空位上。
4.如果作業j已排在排程表中,則取序列的下乙個最小元素m,繼續按上述方法排程,直到元素取完為止。
最後得到的排程表中的作業的順序就是各作業的加工順序。
例 設n = 4,
(a1,a2,a3,a4)=(3,4,8,10),
(b1,b2,b3,b4)=(6,2,9,15),
經排序後為
(b2,a1,a2,b1,a3,b3,a4,b4)=
(2,3,4,6,8,9,10,15)。
設σ1,σ2,σ3,σ4是最優排程。
因為最小數是b2,故置σ4= 2。下乙個次小的數是a1,置σ1= 1。接下去是a2,作業2已經被排程。再其次是b1作業1也已經被排程。下乙個是a3,置σ2= 3,依次置σ3= 4。
演算法複雜度分析:
演算法的主要計算時間花在對作業集的排序。因此,在最壞情況下演算法所需的計算時間為o(nlogn)。所需的空間為o(n)。
**實現:
#include#includeusing namespace std;
class jobtype
};void shellsort(jobtype *a,int n)}}
}int flowshop(int n,int a,int b,int c)
shellsort(d,n);
for(int i=0;i>n;
for(int i=0;i>a[i];
for(int i=0;i>b[i];
int k=flowshop(n,a,b,c);
cout《樣例及答案:
62 5 7 10 5 2
3 8 4 11 3 4
答案 15
52 4 3 6 1
5 2 3 1 7
答案 19
流水作業排程(動態規劃)
問題描述 n個作業在2臺機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是現在m1上加工,後在m2上加工,在兩台機器上加工的時間分別為ai和bi。目標 確定這n個作業的加工順序,使得從第一台作業開始加工,到最後乙個作業完成加工所需時間最少。演算法描述 流水作業排程問題的johnson法則 ...
流水作業排程
流水作業排程問題 描述 n個作業要在由兩台機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為ai和bi,1 i n。流水作業高度問題要求確定這n個作業的最優加工順序,使得從第乙個作業在 機器m1上開始加工,到最後乙個作業...
流水作業排程
流水作業排程問題 描述 n個作業要在由兩台機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為ai和bi,1 i n。流水作業高度問題要求確定這n個作業的最優加工順序,使得從第乙個作業在 機器m1上開始加工,到最後乙個作業...