【問題描述】
n個作業在2臺機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是現在m1上加工,後在m2上加工,在兩台機器上加工的時間分別為ai和bi。
【目標】
確定這n個作業的加工順序,使得從第一台作業開始加工,到最後乙個作業完成加工所需時間最少。
【演算法描述】
流水作業排程問題的johnson法則
(1)令
(2)將n1中作業依 t[i,1]的非減序排列,將n2中作業依 t[i,2]的非增序排列。
【問題分析】
當輸入作業數目為6:
每個作業在m1上執行時間為t[i,1],在m2上執行時間為t[i,2],輸入資料為:
演算法按照先執行的作業,保證m2機器上沒有等待,本例中作業1、4、5滿足條件,被選擇先執行。當選擇第乙個作業時,演算法選擇讓m2第一次等待時間最少的那個,本例中作業1的t[i,1]最小,這樣就可以讓m2第一次等待最少,所以在的集合中,t[i,1]越小越靠前執行。
當執行的作業時,要保證最後乙個作業在m2上的執行時間最短,所以作業2,6,3是按照t[i,2]非增序排列,保證了作業3的t[i,2]是他們三中最小的乙個。
作業執行次序為:1,4,5,2,6,3
1)執行1時:m1上執行2個時間後交給m2,這時m2空閒了2個時間並開始工作。
所以此時要想將1做完需要7(2+5)個時間。
2)執行4時:m1上執行4個時間後,m2還在繼續執行1,並沒有結束。m1結束時間為6,而m2結束1的時間為7,即<6,7>。
所以此時要想把1,4做完,需要14(7+7)個時間。
3)執行5時:m1上執行6個時間後,m2還在繼續執行4,並沒有結束。m1的結束時間為12,而m2結束4的時間為14,即<12,14>
所以此時要想把1,4,5做完,需要23(14+9)個時間。
4)執行2時:m1上執行7個時間後,m2還在繼續執行5,並沒有結束。m1的結束時間為19,而m2結束5的時間為23,即<19,23>.
所以此時要想把1,4,5,2做完,需要26(23+3)個時間。
5)執行6時:m1上執行8個時間後,m2已經不在繼續執行2。m1的結束時間為27,而m2結束2的時間為26,即此時m2已經空閒了乙個時間,即<27,26>.
所以此時要想把1,4,5,2,6完成,需要29(27+2)個時間。
6)執行3時:m1上執行6個時間後,m2已經不在繼續執行6。m1的結束時間為33,而m2結束6的時間為29,即此時m2已經空閒了3個時間,即<33,29>.
所以此時要把1,4,5,2,6,3完成,需要35(33+2)個時間。
所以,根據執行結果,作業執行時間為35.
/*
1)先執行t[i,1]=t[i,2]時,要保證最後乙個作業在m2上執行時間最短,所以按照減序排列
*/#include#include#include#include#define n 100
using namespace std;
struct node ;
bool cmp(node a, node b)
for (i = 0; ib[i] ? b[i] : a[i];
c[i].index = i;
c[i].group = a[i] <= b[i];
} sort(c, c + n, cmp);//按照c中作業時間增序排序
j = 0, k = n - 1;
for (i = 0; i
**
流水作業排程 動態規劃
問題描述 n個作業,要在由機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為ai和bi。要求確定這n個作業的最優加工順序,使得從第乙個作業在機器m1上開始加工,到最後乙個作業在機器m2上加工完成所需的時間最少。問題分析 ...
流水作業排程
流水作業排程問題 描述 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上開始加工,到最後乙個作業...