1. 程式人生 > >獨立任務最優排程問題

獨立任務最優排程問題

問題:獨立任務最優排程,又稱雙機排程問題:用兩臺處理機A和B處理n個作業。設第i個作業交給機器A處理時所需要的時間是a[i],若由機器B來處理,則所需要的時間是b[i]。現在要求每個作業只能由一臺機器處理,每臺機器都不能同時處理兩個作業。設計一個動態規劃演算法,使得這兩臺機器處理完這n個作業的時間最短(從任何一臺機器開工到最後一臺機器停工的總的時間)。
研究一個例項:
n=6 
a = {2, 5, 7, 10, 5, 2};
b = {3, 8, 4, 11, 3, 4}.

分析:當完成k個作業,設機器A花費了x時間,機器B所花費時間的最小值肯定是x的一個函式,設F[k][x]表示機器B所花費時間的最小值(注意,這是B機器所花費的時間,即當B機器停機時的時間點)。則有

F[k][x]=Min{ F[k-1][x]+b[k], F[k-1][x-a[k]] };

其中,F[k-1][x]+b[k]表示第k個作業由機器B來處理(完成k-1個作業時機器A花費的時間仍是x,前提就是A機器停機的時間是x),F[k-1][x-a[k]]表示第k個作業由機器A處理(完成k-1個作業時機器A花費的時間是x-a[k])。

那麼x(表示A機器的停機時間)、F[k][x](表示B機器的停機時間)兩者取最晚停機的時間,也就是兩者中最大的時間,是在AB在此時間中完成k任務最終的時間:Max(x, F[k][x])。而機器A花費的時間x在此期間是一個變數,其取值可以是即x=0,1,2……x(max),(理論上x的取值是離散的,但為程式設計方便,設為整數連續的)由此構成了點對較大值序列。要求整體時間最短,取這些點對較大值序列中最小的即是。
理解難點在於B是A的函式表示式,也即動態規劃所在。花點時間,看懂表示式,加上思考,理解了這點一切OK,後面的程式設計實現完全依據這個思想。先用前兩個任務的列舉示例來幫助理解。
示例:前兩個作業示例足矣。

初始化第一個作業:下標以0開始。

首先,機器A所花費時間的所有可能值範圍:0 <= x <= a[0].
設x<0時,設F[0][x]= ∞,則max(x, ∞)= ∞;記法意義見下。
x=0時,F[0][0]=3,則Max(0,3)=3,機器A花費0時間,機器B花費3時間,而此時兩個機器所需時間為3;
x=1時,F[0][1]=3,Max(1,3)=3;
x=2時,F[0][2]=0,則Max(2,0)=2;

那麼上面的點對序列中,可以看出當x=2時,完成第一個作業兩臺機器花費最少的時間為2,此時機器A花費2時間,機器B花費0時間。

來看第二個作業:

首先,x的取值範圍是:0 <= x <= (a[0] + a[1]).
當x<0時,記F[1][x] = ∞;這個記法程式設計使用,因為陣列下標不能小於0。在這裡的實際含義是:x是代表完成前兩個作業機器A的時間,a[1]是機器A完成第2個作業的時間,若x<a[1],則勢必第2個作業由機器B來處理,即在Min()中取前者。

x=0,則F[1][0]= Min{ F[0][0]+b[2], F[0][0-a[1]] }= Min{3+8,∞}=11,進而Max(0,11)=11;
x=1,則F[1][1]= Min{ F[0][1]+b[2], F[0][1-a[1]] }= Min{3+8,∞}=11,進而Max(11)=11;
x=2,則F[1][2]= Min{ F[0][2]+b[2], F[0][2-a[1]] }= Min{0+8,∞}=8,進而Max(2,8)=8;
x=3,則F[1][3]= Min{ F[0][3]+b[2], F[0][3-a[1]] }= Min{0+8,∞}=8,進而Max(3,8)=8;
x=4,則F[1][4]= Min{ F[0][4]+b[2], F[0][4-a[1]] }= Min{0+8,∞}=8,進而Max(4,8)=8;
x=5,則F[1][5]= Min{ F[0][5]+b[2], F[0][5-a[1]] }= Min{0+8,3}=3,進而Max(5,3)=5;
x=6,則F[1][6]= Min{ F[0][6]+b[2], F[0][6-a[1]] }= Min{0+8,3}=3,進而Max(6,3)=6;
x=7,則F[1][7]= Min{ F[0][7]+b[2], F[0][7-a[1]] }= Min{0+8,0}=0,進而Max(7,0)=7;

那麼上面的點對序列中,可以看出當x=5時,完成兩個作業兩臺機器花費最少的時間為5,此時機器A花費5時間,機器B花費3時間。


程式程式碼如下:
  1. <span style="font-size:16px;">using System;  
  2. namespace zydd  
  3. {  
  4.     class Program  
  5.     {  
  6.         //獨立任務最優排程函式,引數為兩組任務和任務個數,最優時間和順序結果。
  7.         staticvoid DlrwZydd(int[] a, int[] b, int n, int[] least, string[] result)  
  8.         {  
  9.             //首先給一個大值。
  10.             for (int i = 0; i < n; i++)  
  11.             {  
  12.                 least[i] = 99;  
  13.             }  
  14.             //若任務只有一臺機器完成,求得兩個時間。
  15.             int aSum = 0, bSum = 0;  
  16.             for (int i = 0; i < n; i++)  
  17.             {  
  18.                 aSum += a[i];  
  19.                 bSum += b[i];  
  20.             }  
  21.             //小值加1作為陣列的列數,減少儲存空間。
  22.             int Sum = 1 + Math.Min(aSum, bSum);  
  23.             //建立四個行數列數相同的陣列,timeA儲存機器A可能用的時間,timeB儲存對應機器B用的時間,
  24.             //timeMax記錄兩者共需的時間,即較大的那個;who則標識完成該任務的機器是A還是B。
  25.             int[,] timeA = newint[n, Sum];  
  26.             int[,] timeB = newint[n, Sum];  
  27.             int[,] timeMax = newint[n, Sum];  
  28.             char[,] who = newchar[n, Sum];  
  29.             char[] tempRlt = newchar[n];//tempRlt記錄機器完成任務的機器順序,並逐一賦值給result
  30.             //先計算第1個任務相關值,記錄在四個陣列的第0行。
  31.             for (int i = 0; i <= a[0]; i++)  
  32.             {  
  33.                 timeA[0, i] = i;  
  34.                 if (i < a[0])  
  35.                 {  
  36.                     timeB[0, i] = b[0];  
  37.                     who[0, i] = 'b';  
  38.                 }  
  39.                 else
  40.                 {  
  41.                     timeB[0, i] = 0;  
  42.                     who[0, i] = 'a';  
  43.                 }  
  44.                 timeMax[0, i] = Math.Max(timeA[0, i], timeB[0, i]);  
  45.             }  
  46.             //儘管像下面一樣,直接比較即可得出完成第1項任務的最優時間,但由於使用動態規劃,計算上述值是必需的。
  47.             if (a[0] <= b[0])  
  48.             {  
  49.                 least[0] = a[0];  
  50.                 tempRlt[0] = 'a';  
  51.             }  
  52.             else
  53.             {  
  54.                 least[0] = b[0];  
  55.                 tempRlt[0] = 'b';  
  56.             }  
  57.             result[0] = new String(tempRlt);          
  58.             //計算第2個至第n個任務,分別記錄在四個陣列相應行。
  59.             for (int k = 1; k < n; k++)  
  60.             {  
  61.                 //tempSum記錄完成前k項任務機器A最多需要的時間,即全部由A完成需要的時間,亦即機器A所有可能的取值範圍。
  62.                 int tempSum = 0;  
  63.                 for (int temp = 0; temp <= k; temp++)  
  64.                 {  
  65.                     tempSum += a[temp];  
  66.                 }  
  67.                 //計算出所有可能的點對(timeA,timeB),並取值timeMax。
  68.                 for (int i = 0; i <= tempSum; i++)  
  69.                 {  
  70.                     //機器A在完成前k項任務時所花費的時間為i。
  71.                     timeA[k, i] = i;  
  72.                     //i即timeA[k, i],若機器A完成前k項任務的時間 小於 它完成第k項的時間,可能嗎?不可能,所以第k項任務肯定由機器B做。
  73.                     if (i < a[k])  
  74.                     {  
  75.                         timeB[k, i] = timeB[k - 1, i] + b[k];  
  76.                         who[k, i] = 'b';  
  77.                     }  
  78.                     //按照前述動態規劃方式的思想,確定機器A在花費i時間時,機器B花費的最優時間。
  79.                     else
  80.                     {  
  81.                         if ((timeB[k - 1, i] + b[k]) <= timeB[k - 1, i - a[k]])  
  82.                         {  
  83.                             timeB[k, i] = timeB[k - 1, i] + b[k];  
  84.                             who[k, i] = 'b';  
  85.                         }  
  86.                         else
  87.                         {  
  88.                             timeB[k, i] = timeB[k - 1, i - a[k]];  
  89.                             who[k, i] = 'a';  
  90.                         }  
  91.                     }  
  92.                     //兩臺機器花費時間較大的那個為總花費時間。
  93.                     timeMax[k, i] = Math.Max(timeA[k, i], timeB[k, i]);  
  94.                 }  
  95.                 //處理陣列tempSum後面的值。機器A時間全部設為最大,此時機器B則無需花費時間。
  96.                 for (int i = tempSum + 1; i < aSum; i++)  
  97.                 {  
  98.                     timeA[k, i] = tempSum;  
  99.                     timeB[k, i] = 0;  
  100.                 }  
  101.                 //完成第k項任務後,在timeMax所有可能值中,選取最小值即最優值。
  102.                 int flag = 0;//記錄最優值所在的位置i值,同時也是機器A所花費的時間。
  103.                 for (int i = 0; i <= tempSum; i++)  
  104.                 {  
  105.                     if (timeMax[k, i] > 0 && timeMax[k, i] < least[k])  
  106.                     {  
  107.                         least[k] = timeMax[k, i];  
  108.                         flag = i;  
  109.                     }  
  110.                 }  
  111.                 //用來回溯所用機器的順序,需要注意的是機器A所花費的時間和陣列的下標一樣,因此可用做標記。
  112.                 //最後一項任務的回溯路徑已在示意圖中標出,便於理解。
  113.                 tempRlt[k] = who[k, flag];  
  114.                 for (int i = k; i > 0 && flag > 0; i--)  
  115.                 {  
  116.                     //如果是機器A完成第i項任務,則機器A花費的時間減去a[i]就是完成前i-1項任務的時間。
  117.                     //同時在who中可以確定前一項任務的機器,因為機器A花費的時間可用做位置標記。
  118.                     if (tempRlt[i] == 'a')  
  119.                     {  
  120.                         flag -= a[i];  
  121.                         tempRlt[i - 1] = who[i - 1, flag];  
  122.                     }  
  123.                     if (tempRlt[i] == 'b')  
  124.                     {  
  125.                         tempRlt[i - 1] = who[i - 1, flag];  
  126.                     }  
  127.                 }  
  128.                 result[k] = new String(tempRlt);  
  129.             }     
  130.         }  
  131.         staticvoid Main(string[] args)  
  132.         {  
  133.             constint N = 6;  
  134.             int[] a = newint[N] { 2, 5, 7, 10, 5, 2 };  
  135.             int[] b = newint[N] { 3, 8, 4, 11, 3, 4 };  
  136.             int[] least = newint[N];   //記錄完成任務的最優時間
  137.             string[] result = newstring[N];    //記錄完成任務機器的順序
  138. 相關推薦

    獨立任務排程(雙機排程)問題

        用兩臺處理機AAA和BBB處理nnn個作業。設AAA和BBB處理第kkk個作業的時間分別為aka_kak​和bkb_kbk​。由於各個作業的特點和機器效能的關係,對某些作業,在AAA上的處理時間長;而對另一些作業,在BBB上的處理時間更長。一臺處理機在某

    動態規劃之獨立任務排程問題 問題描述

    1.問題描述 用2 臺處理機A 和B 處理n個作業。設第i 個作業交給機器A 處理時需要時間ai,若由機器B來處理,則需要時間bi。由於各作業的特點和機器的效能關係,很可能對於某些i,有ai>=bi,而對於某些j,j≠i,有aj<bj,既不能將一個作業分開由2 臺機器處理,也沒有一臺機器能同時處

    獨立任務排程(動態規劃)

    題目: 用兩臺處理機A和B處理n個作業。設A和B處理第k個作業的時間分別為ak和bk。由於各個作業的特點和機器效能的關係,對某些作業,在A上的處理時間長;而對另一些作業,在B上的處理時間更長。一臺

    王曉東 獨立任務排程問題

    方法1: #include "stdio.h" #include "string.h" #define MX 10 #define MAX(a, b) ((a)>(b)?(a):(b)) #define MIN(a, b) ((a)<(b)?(a):(b))

    獨立任務排程問題

    問題:獨立任務最優排程,又稱雙機排程問題:用兩臺處理機A和B處理n個作業。設第i個作業交給機器A處理時所需要的時間是a[i],若由機器B來處理,則所需要的時間是b[i]。現在要求每個作業只能由一臺機器處理,每臺機器都不能同時處理兩個作業。設計一個動態規劃演算法,使得這兩

    演算法_動態規劃_獨立任務排程問題

    問題描述   用2 臺處理機A 和B 處理n個作業。設第i 個作業交給機器A 處理時需要時間ai,若由機器B來處理,則需要時間bi。由於各作業的特點和機器的效能關係,很可能對於某些i,有ai>=bi,而對於某些j,j≠i,有aj import java

    南郵 OJ 1220 獨立任務排程問題

    獨立任務最優排程問題 時間限制(普通/Java) : 1000 MS/ 3000 MS          執行記憶體限制 : 65536 KByte 總提交 : 164            測試通

    獨立任務調度問題

    can i++ 任務 ase turn ret n) ++ ber #include <stdio.h> int main() { int n; int *a, *b,*t; int i,k; int s

    排程問題

    【問題描述】 用2 臺處理機A 和B 處理n 個作業。設第i 個作業交給機器A 處理時需要時間ai 若由機器B 來處理,則需要時間bi。由於各作業的特點和機器的效能關係,很可能對於某 些i,有ai>=bi ,而對於某些j,j≠i, 有aj <

    演算法--設計排程演算法使規定時間內執行任務多--貪心策略

           給定開始時間start和結束結束時間end,給定一組任務列表(t1, t2)表示每個任務的起始時間和結束時間。其中每個任務必須按照規定時間執行,不能有重合,設計一個排程演算法,使start到end時間內執行任務個數最多。       可以使用貪心策略,先選取第

    基於模糊數學的“拍照賺錢”任務定價方案研究

    # 基於模糊數學的“拍照賺錢”任務定價最優方案研究 ## 摘要 ***   隨著移動網際網路的快速發展,越來越多的企業將大量線上、線下需求分解成微型兼職任務給廣泛的大眾執行,這樣能夠快速解決企業的彈性勞務需求,同時使用者也能通過手機輕鬆賺錢。“拍照賺錢”APP就是其中的典型代表。本文利用附件相關資料

    String 經常用法算法實現總結 (二)

    lean ... itl min empty turn system then 實現 1. String getOrderedString(boolean isDuplicated, String … str) 說明: Orders all characters in

    [POJ 2728]Desert King(0-1分數規劃/比率生成樹)

    eat ice finall nec clu bool ann channels try Description David the Great has just become the king of a desert country. To win the respec

    Uva 10003 Cutting Sticks (類似於矩陣連乘的dp)

    out min 分析 sin [] can 任務 cin algo 題意:有一根長度為L的木棍,和n個切割點的位置(按照從小到大排序),你的任務是在這些切割點的位置把棍子切成n+1份,使得總切割費用最小。每次切割的費用等於被切的木棍長度 思路:這道題與最優矩陣連乘的思想一樣

    (筆記)斯坦福機器學習第七講--間隔分類器

    滿足 優化 最終 clas 定義 mar 擴展 strong play 本講內容 1.Optional margin classifier(最優間隔分類器) 2.primal/dual optimization(原始優化問題和對偶優化問題)KKT conditions(KK

    POJ 3621 Sightseeing Cows(比例環+SPFA檢測)

    span fort exp ros 說明 6.0 lines choice stdio.h Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submission

    P1073 貿易

    相同 一種商品 ade bar article https 同城 最大 pre P1073 最優貿易 題目描述 C 國有 n 個大城市和 m 條道路,每條道路連接這 n 個城市中的某兩個城市。任意兩個 城市之間最多只有一條道路直接相連。

    267. [NOI1997] 乘車

    names ios 可能 while include 他在 printf 數字 i+1 ★★ 輸入文件:bustravel.in 輸出文件:bustravel.out 簡單對比 時間限制:1 s 內存限制:128 MB H城是一個旅遊勝地,每年都有成千上萬的

    【圖論】貿易

    價格 highlight style 不同 相同 -s 存在 n) size [NOIP2009]最優貿易 描述   C 國有 n 個大城市和 m 條道路,每條道路連接這 n 個城市中的某兩個城市。任意兩個城市之間最多只有一條道路直接相連。這 m 條道路中有一部分為單向

    bzoj2539 丘比特的煩惱、黑書P333 (二分圖匹配)

    def 等於 ostream while 感情 deb valentine 區分 匹配 丘比特的煩惱 題目描述 Description   隨著社會的不斷發展,人與人之間的感情越來越功利化。最近,愛神丘比特發現,愛情也已不再是完全純潔的了。這使得丘比特很是苦惱,