演算法實驗二
任務排程問題:在單處理器上具有期限和懲罰的單位時間任務排程問題;平衡樹問題:實現3種樹中的兩種:紅黑樹,AVL樹,Treap樹。
任務排程問題
任務排程問題就是給定一個有窮單位時間任務的集合S,集合S中的每個任務都有一個截止期限di和超時懲罰wi,需要找出集合S的一個排程,使得因任務誤期所導致的總懲罰最小,這個排程也稱為S的一個最優排程。
問題描述:
在單處理器上具有期限和懲罰的單位時間任務排程問題(課本P239)
實驗要求:
(1)實現這個問題的貪心演算法
(2)將每個 wi 替換為max{m1,m2…mn}—wi,執行演算法比較結果。
解題思路:
1.先將任務按照時間懲罰遞減順序進行排序,
2.然後用貪心的思想,儘量把懲罰重的任務先放入待完成佇列中。
程式碼
#include<iostream>
#include <algorithm>
#include<ctime>
#define n 6
using namespace std;
typedef struct {
int id;//第幾個任務
int d;//任務的期限
int w;//罰
}tesk;
bool cmpW(tesk t1, tesk t2) {
return t1.w>t2.w;
}
bool cmpD(tesk t1, tesk t2) {
return t1.d<t2.d;
}
void InitNum(tesk t[]) {
srand((unsigned)time(NULL));
for (int i = 0; i < n; i++) {
t[i].id = i + 1;
t[i].d = rand() % n + 1;
t[i].w = rand() % 30;
}
}
void copy(tesk &t1, tesk &t2) {
t1.id = t2.id;
t1.d = t2.d;
t1.w = t2.w;
}
int greedy(tesk a[], tesk ta[], int &ans) {
int num = 0, i, j;//當前已經完成的任務數量
sort(ta, ta + n, cmpW);
int fla[9999];
memset(fla, 0, sizeof(fla));
for (i = 0; i<n; i++) {
for (j = ta[i].d; j>0; j--) {
if (fla[j] == 0) {
fla[j] = 1;
break;
}
}
if (j>0) {
copy(a[num++], ta[i]);
ans -= ta[i].w;
}
}
return num;
}
int main() {
tesk ta[n], a[n], tb[n], b[n];
printf("%s", "正在生成隨機資料\n");
InitNum(ta);
for (int i = 0; i < n; i++) {
copy(tb[i], ta[i]);
}
printf("%s", "生成的資料為\n");
int max_w = -1, sum_w = 0;
for (int i = 0; i < n; i++) {
printf("ID: %d,任務的期限: %d,任務的懲罰:%d\n", ta[i].id, ta[i].d, ta[i].w);
sum_w += ta[i].w;
if (max_w < ta[i].w) {
max_w = ta[i].w;
}
}
int k = greedy(a, ta, sum_w);
printf("任務懲罰為:%d\n", sum_w);
sort(a, a + k, cmpD);
printf("將完成執行的任務按照時間遞增順序排列輸出:\n");
for (int i = 0; i<k; i++) {
printf("ID:%d,期限:%d,懲罰:%d\n", a[i].id, a[i].d, a[i].w);
}
sort(a, a + k, cmpW);
printf("將完成的任務按懲罰排序;\n");
for (int i = 0; i<k; i++) {
printf("ID:%d,期限:%d,懲罰:%d\n", a[i].id, a[i].d, a[i].w);
}
printf("若將每個wi替換為max{m1,m2...mn}—wi,新的資料為\n");
for (int i = 0; i<n; i++) {
tb[i].w = max_w - tb[i].w;
printf("ID:%d,期限:%d,懲罰:%d\n", tb[i].id, tb[i].d, tb[i].w);
sum_w += tb[i].w;
}
k = greedy(b, tb, sum_w);
printf("任務懲罰為:%d\n", sum_w);
sort(b, b + k, cmpD);
printf("將完成執行的任務按照時間遞增順序排列輸出:\n");
for (int i = 0; i<k; i++) {
printf("ID:%d,期限:%d,懲罰:%d\n", b[i].id, b[i].d, b[i].w);
}
sort(b, b + k, cmpW);
printf("將完成的任務按懲罰排序;\n");
for (int i = 0; i<k; i++) {
printf("ID:%d,期限:%d,懲罰:%d\n", b[i].id, b[i].d, b[i].w);
}
}
實驗截圖
實現3種樹
實現3種樹中的兩種:紅黑樹,AVL樹(課本P177),Treap樹
紅黑樹
性質
- 根節點是黑色的
- 每個節點或紅或黑
- 每個葉節點都是黑色的
- 紅節點的兩個子節點都是黑色
相關文章
- 實驗二
- KNN演算法實驗KNN演算法
- Java實驗二:類程式設計實驗Java程式設計
- 實驗一和實驗二截圖
- 實驗二-需求分析
- 實驗二:需求分析
- 網路實驗二
- 實驗二 c++C++
- 作業系統實驗——實驗1《CPU Scheduling》&&實驗二《Allocation & Reclaim》作業系統AI
- 實驗二-小型書店
- C語言實驗二C語言
- 實驗二——進展一
- 資料庫實驗二資料庫
- JAVA實驗二 陣列Java陣列
- 滲透測試實驗二
- 6.15 工程數學實驗二
- 實驗七: 查詢演算法的實現演算法
- 湖南大學人工智慧實驗三:分類演算法實驗人工智慧演算法
- 實驗二——————路由器口令配置路由器
- 第二章 實驗任務
- 計算機網路實驗二計算機網路
- 遺傳演算法詳解與實驗演算法
- 實驗二:編寫輸出"Hello World!"
- 實驗十一 ——————二層交換基礎
- 第二次實驗完整程式碼
- 實驗二-密碼引擎-3-sdf介面密碼
- Kurento實戰之二:快速部署和體驗
- 資料結構實驗 二維矩陣的實現資料結構矩陣
- Java實現二分查詢演算法Java演算法
- 二分搜尋演算法的實現演算法
- NOJ-演算法設計實驗-test3演算法
- Etsy使用交錯新演算法實現更快的ML實驗演算法
- 實驗一 二手平臺原型設計原型
- c語言程式設計——實驗報告二C語言程式設計
- 20211314實驗二-密碼引擎-3-sdf介面密碼
- 實驗二 網路嗅探與身份認證
- 第二次作業預備實驗
- 軟體測試實驗二 | 白盒測試
- 實驗二:順序表的基本操作實現及其應用