模擬 作業排程方案

2022-05-07 11:45:09 字數 3214 閱讀 6337

最近做了這道題作業排程方案,附上鏈結

這道題文字很多,不易讀

我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。 每個工件的每個工序稱為乙個操作,我們用記號j-k表示乙個操作,其中j為1到n中的某個數字,為工件號;k為1到m中的某個數字,為工序號,例如2-4表示第2個工件第4道工序的這個操作。在本題中,我們還給定對於各操作的乙個安排順序。 例如,當n=3,m=2時,「1-1,1-2,2-1,3-1,3-2,2-2」就是乙個給定的安排順序,即先安排第1個工件的第1個工序,再安排第1個工件的第2個工序,然後再安排第2個工件的第1個工序,等等。 一方面,每個操作的安排都要滿足以下的兩個約束條件。 (1) 對同乙個工件,每道工序必須在它前面的工序完成後才能開始; (2) 同一時刻每一台機器至多只能加工乙個工件。 另一方面,在安排後面的操作時,不能改動前面已安排的操作的工作狀態。 由於同一工件都是按工序的順序安排的,因此,只按原順序給出工件號,仍可得到同樣的安排順序,於是,在輸入資料中,我們將這個安排順序簡寫為「1 1 2 3 3 2」。 還要注意,「安排順序」只要求按照給定的順序安排每個操作。不一定是各機器上的實際操作順序。在具體實施時,有可能排在後面的某個操作比前面的某個操作先完成。 例如,取n=3,m=2,已知資料如下:

則對於安排順序「1 1 2 3 3 2」,下圖中的兩個實施方案都是正確的。但所需要的總時間分別是10與12。   當乙個操作插入到某台機器的某個空檔時(機器上最後的尚未安排操作的部分也可以看作乙個空檔),可以靠前插入,也可以靠後或居中插入。為了使問題簡單一些,我們約定:在保證約束條件(1)(2)的條件下,盡量靠前插入。並且,我們還約定,如果有多個空檔可以插入,就在保證約束條件(1)(2)的條件下,插入到最前面的乙個空檔。於是,在這些約定下,上例中的方案一是正確的,而方案二是不正確的。 顯然,在這些約定下,對於給定的安排順序,符合該安排順序的實施方案是唯一的,請你計算出該方案完成全部任務所需的總時間。

第1行為兩個正整數m和n(其中m(<20)表示機器數,n(<20)表示工件數),用乙個空格隔開:

第2行:個用空格隔開的數,為給定的安排順序。

接下來的2n行,每行都是用空格隔開的m個正整數,每個數不超過20。

其中前n行依次表示每個工件的每個工序所使用的機器號,第1個數為第1個工序的機器號,第2個數為第2個工序機器號,等等。

後n行依次表示每個工件的每個工序的加工時間。

只有乙個正整數,為最少的加工時間。
2 3

1 1 2 3 3 2

1 2

1 2

2 13 2

2 5

2 4

10

以上就是題目的內容

解題:

題目主要內容為紅字部分

我的理解就是給了我們工件數n;機器數m;加工工件的順序安排worklist[n*m];以1~n的順序,每個工件在加工時按工序的排列workmac[工件編號][工序號];

從題目和上面的三張圖來看,我們需要得到花費時間最少的方案,按我們人的想法,就是盡可能(不違背(1)(2)約定)的讓機器1和機器2工作,別閒著。所以需要找機器1和機器2時間線timeline[機器號][時間數]的空閒處,見可容納的空餘就插入。

1.按worklist(給定順序)的順序開始,找到當前加工的工件號nowitem(這樣不會違揹我們的約定);

2.當前工件進行到哪一步啦?當然是上一步+1了,step[nowitem]++;

3.這個工件應該在機器workmac[nowitem][step[nowitem]]上面加工;

4.加工時間是worktime[nowitem][step[nowitem]];

5.我們從機器workmac[nowitem][step[nowitem]]的時間線的最開始的頭部1,一點點的加,找到一段可以容納worktime[nowitem][step[nowitem]]的位置,作為當前工件當前工序的加工時間,並標記這段時間。

6.最後會得到每個工件加工完在時間線上的時間點,找到最後加工完的那個工件,即時間點最大的工件

**如下:

#include#define max 21

int nowitem;//

當前的工件編號

int worklist[max*max];//

工件加工給定順序

int workmac[max][max];//

【工件編號,工件工序號】機器編號

int worktime[max][max];//

【工件編號,工件工序號】花費時間

int lasttime[max];//

【工件編號】每個工件最後做完時間

int timeline[max][10000];//

【機器編號,時間線長度】

int step[max];//

當前編號工件進行到的工序 ,初始時都為0

int check(int st,int end,int

mac)

return1;

}int

main()

for(int i=1;i<=n;i++)

}for(int i=1;i<=n;i++)

}intmac,costtime;

for(int i=1;i<=n*m;i++)

lasttime[nowitem]=t+costtime-1

;

break

; }

}

}int maxtime=-1

;

for(int i=1;i<=n;i++)

printf(

"%d\n

",maxtime);

return0;

}

參考:

作業排程方案

題目描述 description 我們現在要利用 m臺機器加工 n個工件,每個工件都有 m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。每個工件的每個工序稱為乙個操作,我們用記號 j k表示乙個操作,其中j為 1到n中的某個數字,為工件號 k為 1到m中的某個數字...

作業排程方案

我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。每個工件的每個工序稱為乙個操作,我們用記號j k表示乙個操作,其中j為1到n中的某個數字,為工件號 k為1到m中的某個數字,為工序號,例如2 4表示第2個工件第4道工序...

作業排程方案

題目描述 我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。每個工件的每個工序稱為乙個操作,我們用記號j k表示乙個操作,其中j為1到n中的某個數字,為工件號 k為1到m中的某個數字,為工序號,例如2 4表示第2個工件...