流水作業排程問題

2021-09-17 01:52:04 字數 1386 閱讀 4201

n個作業要在由2臺機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為a[i]和b[i]。流水作業排程問題要求確定這n個作業的最優加工順序,使得從第乙個作業在機器m1上開始加工,到最後乙個作業在機器m2上加工完成所需的時間最少。

將每個作業按照加工時間分組

對於作業i,若a[i]<=b[i],則分到n1組。若a[i]>b[i],則分到n2組。

進行加工排序

所有n1組(a[i]<=b[i])的作業都在n2組之前加工,對於n1組(a[i]>b[i])的作業,按照b[i] (在m2上加工時間)公升序排列。對於n2組的作業,按照a[i] (在m1上加工時間)降序排列。排列完成即得到加工順序

n1按b[i]公升敘排列:0、5、1、3

n2按a[i]降敘排列:2、4

最優加工順序:0、5、1、3、2、4

如果想要了解程式設計思路,好好看注釋

//3d9 動態規劃 流水作業排程問題

#include using namespace std;

const int n = 6;

class jobtype;

int flowshop(int n,int a,int b,int c);

void bubblesort(jobtype *d,int n);

int main()

; int b = ;

int c[n];//c記錄加工順序

int mintime = flowshop(n,a,b,c);

cout<

d[i].job = a[i]<=b[i];//分組,給符合條件a[i]<=b[i]的放入到n1子集標記為true

d[i].index = i; }

bubblesort(d,n);//對陣列d按關鍵字公升序進行排序

int j = 0,k = n-1; /*

如果作業分在n1集合中(說明a[i]<=b[i]),按b[i]進行公升序排列

如果作業分在n2集合中(說明a[i]>b[i]),按a[i]進行降序排列

*/ for(int i=0; ib[i])中,key=a[i]

*/void bubblesort(jobtype *d,int n)

} //如果本次迴圈沒有進行一次交換,則break,減少了執行時間。

if(flag == 0)

}}

執行結果

流水作業排程問題

流水作業排程問題 n個作業在2 臺機器上m1和 m2組成的流水線上完成加工。每個作業加工的順序都是先在 m1上加工,後在 m2上加工。在兩台機器上加工的時間分別為ai和 bi。解 流水作業排程 根據johnson法則 使用結構體陣列f1 j 存放a i 使用結構體陣列f2 k 存放a i b i 的...

流水作業排程問題

n個作業在2臺機器上m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,後在m2上加工。在兩台機器上加工的時間分別為ai和bi。目標 確定這n個作業的加工順序,使得從第一台作業開始加工,到最後乙個作業完成加工所需要的時間最少。假設要對集合s中的作業進行加工,當m1開始加工時,假設...

流水作業排程問題

有n個作業要在兩台機器m1和m2組成的流水線上完成加工。每個作業i 都必須先花時間ai 在m1上加工,然後花時間bi 在m2上加工。求解n個作業的加工順序,使得總的加工時間最短。最優排程 讓m1沒有空閒,m2的空閒時間盡量短。設s1 為 a b的作業集合,s2為 a b 的作業集合,將s1的作業按a...