達到最高效益的排程

2021-06-09 21:42:38 字數 1314 閱讀 6048

問題:假設有一台機器,以及在此機器上處理的n個作業a1,a2,...an的集合。每隔作業aj有乙個處理時間tj,效益pj,以及最後期限dj。機器在乙個時刻只能處理乙個作業,而且作業aj必須在tj連續時間單位內不間斷地執行。如果作業aj在最後期限dj之前完成,則獲得效益pj,但如果在最後期限之後才完成,則沒有效益。請給出乙個動態規劃演算法,來尋找能獲得最大量效益的排程,假設所有的處理時間都是1到n之間的整數。

分析:其實這個問題類似於01揹包問題。

1.    將a1,a2,…,an按照dj值排序,從小到大。假設接下來的分析中,已經保證當i

2.    構建陣列s[n][d[n]],s[i][j]代表在j時間內,排程i個作業,所得最高效益值。初始時,令s[i][0] = 0(i = 0->n),s[0][j] = 0(j = 0->d[n])。

3.    求s[i][j]的值,select[i][j]用於記錄是否選擇i。這裡遞迴包含了一種思想:如果第i個作業被排程,那麼最好使其在期限時正好結束,這樣能夠保證i之前的作業能夠在更充裕的時間內被排程。

for i = 1->n

for j = 1->d[i]

//不排程i

s[i][j] = s[i-1][min(j, d[i-1])]

select[i][j] = false

//排程i

if j>t[i]

if s[i][j] < s[i-1][min(j-t[i], d[i-1])]+p[i]

s[i][j] = s[i-1][min(j-t[i], d[i-1])]+p[i]

select[i][j] = true

我之前任務這就是乙個單純的揹包問題,不理解上面為什麼要排序,為什麼要求min

下面的段錯誤的**:

int maxv = 0x80000000;

int f[n] = ;

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

} cout<

這是因為任務有截止期限的,所以必須按照di從小到大排序

下面的**比較好理解

sort();

int end = deadline[0] - time[0];

for (int i = 0; i < end; ++i)

f[0][i] = 0;

for (int i = end; i<= deadline[0]; ++i)

f[0][i] = value[i];

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

else

}}

動態規劃 達到最高效益的排程

問題 假設有一台機器,以及在此機器上處理的n個作業a1,a2,an的集合。每隔作業aj有乙個處理時間tj,效益pj,以及最後期限dj。機器在乙個時刻只能處理乙個作業,而且作業aj必須在tj連續時間單位內不間斷地執行。如果作業aj在最後期限dj之前完成,則獲得效益pj,但如果在最後期限之後才完成,則沒...

動態規劃 達到最高效益的排程

問題 假設有一台機器,以及在此機器上處理的n個作業a1,a2,an的集合。每隔作業aj有乙個處理時間tj,效益pj,以及最後期限dj。機器在乙個時刻只能處理乙個作業,而且作業aj必須在tj連續時間單位內不間斷地執行。如果作業aj在最後期限dj之前完成,則獲得效益pj,但如果在最後期限之後才完成,則沒...

雲計算中想實現最高效益比要看這5點

但是雲 混合模型的最大好處是,與傳統解決方案相比,它可以是成本的一半或更低,並且可以微調其實踐,以更好地在日益擁擠的市場中競爭。但是,雲容科技會提示您在雲中實現最高的成本 收益比,企業必須關注多種因素 雲計算中想實現最高效益比要看這5點 1 軟體許可和支援 大多數協議都是漫長而複雜的,規則通常會對遷...