最小延遲調度問題——貪心算法(C++實現)

1.最小延遲調度問題描述

在這裏插入圖片描述

f(i) 表示某任務 開始的時間。

ti  表示 某任務 加工的時間

di  表示 某任務 要求完成的時間

延遲:  f(i)+ti-di
  • 如果 實際完成的時間 小於 規定完成時間,那麼,就沒有 延遲。延遲就是拖延,如果你在規定時間內(<=規定時間),那麼,就說明沒有延遲,沒有拖延。
  • 由於有很多用戶,所以,會有很多不同的拖延值,我們的目標是,求得所有拖延值中的最大值,並使得這個最大的拖延值 最小。Min(Max拖延值)

2.舉例理解調度問題

在這裏插入圖片描述

f1(1)爲什麼爲0 ,因爲 f(1)=0,t1=5,而 d=10,就是說,用戶一在規定時間內完成了任務,當然沒有延遲。

用戶二的延遲:13-12=1

用戶三的延遲: 17-15=2 

用戶四的延遲: 27-11=16

用戶五的延遲: 30-20=10

 所以,在這個調度的條件下,最大的延遲是 第四個用戶:16.

在這裏插入圖片描述
按照規定的截止時間安排,這裏D的順序是: {10,11,12,15,20}

對應客戶需要加工的時間排序就變成了:{5,10,8,4,3}

 用戶一的延遲爲: 因爲 5<10,所以,延遲爲0

 用戶二的延遲爲: 23-12=11

 用戶三的延遲爲: 27-15=12

 用戶四的延遲爲: 15-11=4

 用戶五的延遲爲: 30-20=10

 在這種情況下,最大的延遲是 12.

可見,不同的調度策略,得到的最小調度延遲值是不一樣的。

在這裏插入圖片描述對於貪心算法,如果要驗證策略的正確性,可以通過舉反例的方式。

  • 對於策略1,按照 加工時間的長短 安排,肯定是 用戶一 先安排,此時,用戶一的 需要1個時間單位完成,用戶二在 第11個時間單位 完成,
    用戶一沒有時間延遲,用戶二的時間延遲爲 1 。
  • 但是,如果我們先加工第二個任務,任務二在 第10個時間單位結束, 規定結束時間爲10 ,此時的延遲爲0。第一個任務的加工時間爲1,結束時間是 11,此時, 11<100,延遲也爲 0 。
  • 對於策略 2: 根據 d-t 的大小,我們應該優先安排 用戶二,此時用戶一的時間延遲是 11-2=9. 用戶二的時間延遲爲0。
    但是,我們如果優先安排用戶一,此時用戶一的時間延遲是0,用戶二的時間延遲是1. 1<9

對於策略 3,是正確的,我們看看僞碼
在這裏插入圖片描述

正確性證明:

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

code

/*
最小延遲調度問題
越前浩波
*/

#include<iostream>
using namespace std;
#define N 100

//也可以用sort()
struct Mission
{
    int num;
    int last;
    int end;
};

//
void QuickSort(Mission *mi,int f,int t)
{
    if(f<t)
    {
        int i=f-1,j=f;
        Mission m=mi[t];
        while(j<t)
        {
            if(mi[j].end<=m.end)
            {
                i++;
                Mission tmp=mi[i];
                mi[i]=mi[j];
                mi[j]=tmp;
            }
            j++;
        }
        Mission tmp1=mi[t];
        mi[t]=mi[i+1];
        mi[i+1]=tmp1;
        QuickSort(mi,f,i);
        QuickSort(mi,i+2,t);
    }
}
int main()
{
    int n;
    cout<<"請輸入任務總數:"<<endl;
    cin>>n;
    Mission mi[N];//Mission[0]~Mission[n-1]
    int start[N+1];//排好序的任務的開始時間,start[1]~start[n]
    int i;
    for(i=0;i<n;i++)
    {
        mi[i].num=i+1;
        cout<<"任務"<<i+1<<"的持續時間爲:";
        cin>>mi[i].last;
        cout<<"任務"<<i+1<<"的截止時間爲:";
        cin>>mi[i].end;
    }
    QuickSort(mi,0,n-1);
    int delay=0,m=0;
    start[1]=0;
    if(start[1]+mi[0].last>mi[0].end)
    {
        delay=start[1]+mi[0].last-mi[0].end;//如果開始時間+持續時間>截止時間,累計延遲
    }

    for(i=1;i<n;i++)
    {
        start[i+1]=start[i]+mi[i-1].last;
        if(start[i+1]+mi[i].last>mi[i].end)
        {
            m=start[i+1]+mi[i].last-mi[i].end;
            if(delay < m)
                delay = m;
        }
    }
    cout<<"最大延遲爲:"<<delay<<endl;
    for(i=0;i<n;i++)
    {
        cout<<"任務"<<mi[i].num<<"的執行時間:["<<start[i+1]<<","<<mi[i].last+start[i+1]<<"]"<<endl;
    }
    system("pause");
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章