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...