貪心演算法 多機排程問題C

2021-10-06 20:20:33 字數 2387 閱讀 5139

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在時間區間上沒有重疊,則說這兩個請求是相容的,求出這組請求的最大相容子集 最優子集 舉個例子 有一間多 ...