流水作業排程 動態規劃

2021-08-19 22:12:10 字數 1501 閱讀 5053

問題描述:

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上開始加工,到最後乙個作業...