1.問題
要求給出一種作業排程方案,使所給的n個作業在盡可能短的時間內由m臺機器加工處理完成。約定,每個作業均可在任何一台機器上加工處理,但未完工前不允許中斷處理。作業不能拆分成更小的子作業。
2.演算法解析
此演算法的貪心策略主要在於sort排序演算法,按照作業時間從大到小進行排序。然後再考慮機器數量:(1)如果機器數量大於等於作業數,那麼直接同時執行所有作業,其執行至少所需的時間就為所有作業中最大時間的那個作業的時間。(2)如果機器數小於作業數,則作業時間最少或者空閒的機器優先安排作業。
3.**
①所需資料結構
typedef
struct jobjob;
typedef
struct jobnodejobnode,
*pjobnode;
typedef
struct headerheader, pheader;
②排序函式sort():
void
sort
(job *a,
int n)
}
③選擇最小值函式selectmin():
int
selectmin
(header *m,
int m)
④選擇最大值函式selectmax():
int
selectmax
(header *m,
int m)
⑤作業排程函式dispatch():
int
dispatch
(job *a, header *m,
int n,
int m)
sort
(a, n)
;//將a作業陣列從小到大進行排序
if(n <= m)
return a[0]
.time;
//作業數小於機器數的情況,直接取排好序的作業陣列第乙個元素
for(
int j=
0; j
print
(m, m)
;//輸出每台機器的執行作業的id
max =
selectmax
(m, m)
;//得出最大的s的機器的下標
return m[max]
.s;//返回至少需要的時間
}
⑥全部**
#include
#include
using namespace std;
typedef
struct jobjob;
typedef
struct jobnodejobnode,
*pjobnode;
typedef
struct headerheader, pheader;
intselectmin
(header *m,
int m)
intselectmax
(header *m,
int m)
void
sort
(job *a,
int n)
}void
print
(header *m,
int m)
cout<
intdispatch
(job *a, header *m,
int n,
int m)
sort
(a, n);if
(n <= m)
return a[0]
.time;
for(
int j=
0; j
print
(m, m)
; max =
selectmax
(m, m)
;return m[max]
.s;}
intmain()
maxtime =
dispatch
(a, m, n, m)
; cout<<
"作業全部執行完成所需最短時間為:"
<
7 31 2
2 14
3 44 16
5 66 5
7 3*/
4.執行結果 區間排程問題 貪心演算法
問題 有 n 項工作,每項工作分別在 s i 時間開始,在 t i 時間結束 對於每項 工作,你都有可以選擇參與與否。如果選擇了參與,那麼自始自終都必須全程參與。此外,參與工作的時間段不能重疊 即使是開始的瞬間和結束的瞬間的重疊也 是不允許的 include include include usin...
區間排程問題 貪心演算法
一 題目 區間排程問題 有n項工作,每項工作分別在si時間開始,在ti時間結束。對於每項工作,你都可以選擇參與與否。如果選擇了參與,那麼自始至終都必須全程參與。此外,參與工作的時間段不能重複 即使是開始的瞬間和結束的瞬間的重疊也是不允許的 你的目標是參與盡可能多的工作,那麼最多能參與多少項工作呢?1...
貪心演算法 區間排程問題總結
問題定義 存在單一資源,有一組以時間區間形式表示的資源請求reqs 第i個請求希望占用資源一段時間來完成某些任務,這段時間開始於begin i 終止於end i 如果兩個請求req i和req j在時間區間上沒有重疊,則說這兩個請求是相容的,求出這組請求的最大相容子集 最優子集 舉個例子 有一間多 ...