演算法導論 任務排程問題

2021-07-12 01:31:54 字數 1399 閱讀 4096

問題描述:

在單處理器上具有期限和懲罰的單位時間任務排程問題(課本p239)

實驗要求:

(1)實現這個問題的貪心演算法

(2)將每個 wi 替換為max—wi,執行演算法比較結果。

解題思路:

1.先將任務按照時間懲罰遞減順序進行排序,

2.然後用貪心的思想,盡量把懲罰重的任務先放入待完成佇列中。

這裡我是用了乙個fla陣列進行標記的,先試著把任務期限為d的任務放入fla陣列的第d個位置上,若該位置為1,說明這個位置已經被使用了,那麼往前面進行查詢,看在完成期限之前,有沒有空的位置可以放進去。

#include 

#include

#include

#include

#include

using namespace std;

#define n 6

typedef structtask;

bool cmpw(task t1,task t2)

bool cmpd(task t1,task t2)

}void copy(task &t1,task &t2)

int greedy(task a,task ta,int &ans)

}if(j>0)

}return num;

}int main()

int k=greedy(a,ta,ans);

printf("任務懲罰為:%d\n",ans);

sort(a,a+k,cmpd);

printf("將完成執行的任務按照時間遞增順序排列輸出:\n");

for(int i=0;iprintf("id:%d,期限:%d,懲罰:%d\n",a[i].id,a[i].d,a[i].w);

}//若將每個wi替換為max—wi,改變懲罰值再求一次

ans=0;

for(int i=0;iprintf("\n改變懲罰值後輸出各任務資料\n");

for(int i=0;iprintf("id:%d,期限:%d,懲罰:%d\n",ta[i].id,ta[i].d,ta[i].w);

}k=greedy(a,ta,ans);

printf("改變懲罰值後的任務懲罰為:%d\n",ans);

sort(a,a+k,cmpd);

printf("將完成執行的任務按照時間遞增順序排列輸出:\n");

for(int i=0;iprintf("id:%d,期限:%d,懲罰:%d\n",a[i].id,a[i].d,a[i].w);

}return

0;}

測試執行結果如下:

問題 A 任務排程

題目描述 讀入任務排程序列,輸出n個任務適合的一種排程方式。輸入輸入包含多組測試資料。每組第一行輸入乙個整數n n 100000 表示有n個任務。接下來n行,每行第乙個表示前序任務,括號中的任務為若干個後序任務,表示只有在前序任務完成的情況下,後序任務才能開始。若後序為null則表示無後繼任務。輸出...

任務排程問題

乙個單位時間任務是恰好需要乙個單位時間完成的任務。給定乙個單位時間任務的有限集s。關於s 的乙個時間表用於描述s 中單位時間任務的執行次序。時間表中第1 個任務從時間0 開始執行直至時間1 結束,第2 個任務從時間1 開始執行至時間2 結束,第n個任務從時間n 1 開始執行直至時間n結束。具有截止時...

排程機任務排程問題

題目描述 假設有乙個 排程機,有n個任務相同的任務需要排程到m臺伺服器上執行,由於每台伺服器的配置不一樣,因此,伺服器執行乙個任務所花費的時間也不同。現在假設第i個伺服器執行乙個任務需要的時間為t i 假如,有2個執行機a與b,執行乙個任務分別需要7min和10min,有6個任務待排程。如果平分這6...