獨立任務最優排程問題
研究一個例項:
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的取值是離散的,但為程式設計方便,設為整數連續的)由此構成了點對較大值序列。要求整體時間最短,取這些點對較大值序列中最小的即是。示例:前兩個作業示例足矣。
初始化第一個作業:下標以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時間。
程式程式碼如下:
- <span style="font-size:16px;">using System;
- namespace zydd
- {
- class Program
- {
- //獨立任務最優排程函式,引數為兩組任務和任務個數,最優時間和順序結果。
- staticvoid DlrwZydd(int[] a, int[] b, int n, int[] least, string[] result)
- {
- //首先給一個大值。
- for (int i = 0; i < n; i++)
- {
- least[i] = 99;
- }
- //若任務只有一臺機器完成,求得兩個時間。
- int aSum = 0, bSum = 0;
- for (int i = 0; i < n; i++)
- {
- aSum += a[i];
- bSum += b[i];
- }
- //小值加1作為陣列的列數,減少儲存空間。
- int Sum = 1 + Math.Min(aSum, bSum);
- //建立四個行數列數相同的陣列,timeA儲存機器A可能用的時間,timeB儲存對應機器B用的時間,
- //timeMax記錄兩者共需的時間,即較大的那個;who則標識完成該任務的機器是A還是B。
- int[,] timeA = newint[n, Sum];
- int[,] timeB = newint[n, Sum];
- int[,] timeMax = newint[n, Sum];
- char[,] who = newchar[n, Sum];
- char[] tempRlt = newchar[n];//tempRlt記錄機器完成任務的機器順序,並逐一賦值給result
- //先計算第1個任務相關值,記錄在四個陣列的第0行。
- for (int i = 0; i <= a[0]; i++)
- {
- timeA[0, i] = i;
- if (i < a[0])
- {
- timeB[0, i] = b[0];
- who[0, i] = 'b';
- }
- else
- {
- timeB[0, i] = 0;
- who[0, i] = 'a';
- }
- timeMax[0, i] = Math.Max(timeA[0, i], timeB[0, i]);
- }
- //儘管像下面一樣,直接比較即可得出完成第1項任務的最優時間,但由於使用動態規劃,計算上述值是必需的。
- if (a[0] <= b[0])
- {
- least[0] = a[0];
- tempRlt[0] = 'a';
- }
- else
- {
- least[0] = b[0];
- tempRlt[0] = 'b';
- }
- result[0] = new String(tempRlt);
- //計算第2個至第n個任務,分別記錄在四個陣列相應行。
- for (int k = 1; k < n; k++)
- {
- //tempSum記錄完成前k項任務機器A最多需要的時間,即全部由A完成需要的時間,亦即機器A所有可能的取值範圍。
- int tempSum = 0;
- for (int temp = 0; temp <= k; temp++)
- {
- tempSum += a[temp];
- }
- //計算出所有可能的點對(timeA,timeB),並取值timeMax。
- for (int i = 0; i <= tempSum; i++)
- {
- //機器A在完成前k項任務時所花費的時間為i。
- timeA[k, i] = i;
- //i即timeA[k, i],若機器A完成前k項任務的時間 小於 它完成第k項的時間,可能嗎?不可能,所以第k項任務肯定由機器B做。
- if (i < a[k])
- {
- timeB[k, i] = timeB[k - 1, i] + b[k];
- who[k, i] = 'b';
- }
- //按照前述動態規劃方式的思想,確定機器A在花費i時間時,機器B花費的最優時間。
- else
- {
- if ((timeB[k - 1, i] + b[k]) <= timeB[k - 1, i - a[k]])
- {
- timeB[k, i] = timeB[k - 1, i] + b[k];
- who[k, i] = 'b';
- }
- else
- {
- timeB[k, i] = timeB[k - 1, i - a[k]];
- who[k, i] = 'a';
- }
- }
- //兩臺機器花費時間較大的那個為總花費時間。
- timeMax[k, i] = Math.Max(timeA[k, i], timeB[k, i]);
- }
- //處理陣列tempSum後面的值。機器A時間全部設為最大,此時機器B則無需花費時間。
- for (int i = tempSum + 1; i < aSum; i++)
- {
- timeA[k, i] = tempSum;
- timeB[k, i] = 0;
- }
- //完成第k項任務後,在timeMax所有可能值中,選取最小值即最優值。
- int flag = 0;//記錄最優值所在的位置i值,同時也是機器A所花費的時間。
- for (int i = 0; i <= tempSum; i++)
- {
- if (timeMax[k, i] > 0 && timeMax[k, i] < least[k])
- {
- least[k] = timeMax[k, i];
- flag = i;
- }
- }
- //用來回溯所用機器的順序,需要注意的是機器A所花費的時間和陣列的下標一樣,因此可用做標記。
- //最後一項任務的回溯路徑已在示意圖中標出,便於理解。
- tempRlt[k] = who[k, flag];
- for (int i = k; i > 0 && flag > 0; i--)
- {
- //如果是機器A完成第i項任務,則機器A花費的時間減去a[i]就是完成前i-1項任務的時間。
- //同時在who中可以確定前一項任務的機器,因為機器A花費的時間可用做位置標記。
- if (tempRlt[i] == 'a')
- {
- flag -= a[i];
- tempRlt[i - 1] = who[i - 1, flag];
- }
- if (tempRlt[i] == 'b')
- {
- tempRlt[i - 1] = who[i - 1, flag];
- }
- }
- result[k] = new String(tempRlt);
- }
- }
- staticvoid Main(string[] args)
- {
- constint N = 6;
- int[] a = newint[N] { 2, 5, 7, 10, 5, 2 };
- int[] b = newint[N] { 3, 8, 4, 11, 3, 4 };
- int[] least = newint[N]; //記錄完成任務的最優時間
- string[] result = newstring[N]; //記錄完成任務機器的順序
-
相關推薦
獨立任務最優排程(雙機排程)問題
用兩臺處理機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 隨著社會的不斷發展,人與人之間的感情越來越功利化。最近,愛神丘比特發現,愛情也已不再是完全純潔的了。這使得丘比特很是苦惱,