貪心算法之顧客服務安排問題(顧客等待時間問題)


1. 問題描述:

  1)設有 n 個顧客同時等待一項服務,顧客i需要的服務時間為 t,i = 1,2,...,n。從 0 時刻安排任務。

  2)一個顧客的等待時間0 時刻開始計算,直到完成對他服務的時刻終止。

  3)問應該怎樣安排 n 個顧客的服務次序使得總的等待時間(每個顧客等待時間的總和)最少?

 

2. 問題分析:

  1)為了讓顧客等待的總時間最少,那么就需要以:顧客所需服務時間最少,作為貪婪標准。即:要求服務時間最短第一個被服務,第二短的次之,以此類推。這很像操作系統里的SJF(短作業優先)調度算法。

  2)因此,我們可以先對顧客所需的服務服務時長進行從小到大排序,最后用貪婪的思想進行選擇。

 

C語言實現:

// Hello, i'm JJU-干干

/*
++++++++++++++++++++++++++++++++++++++++++++++++
+
+ 思想:為了總等待時間最少,當然是用時少的服務先執行,
+ 用時長的后執行,類似於操作系統的SJF。
+ 所以要先對顧客的服務時長進行從小到大排序。
+ 注意:這里的等待時間是從0時刻開始到顧客服務完成時刻的
+ 時間間隔。
+
++++++++++++++++++++++++++++++++++++++++++++++++

*/

#include<stdio.h>
#include<stdlib.h>
#define size 100


void Quick_Sort(int *a, int l, int r)  //用快速排序的方法對服務時長進行排序
{
    if(l<r)
    {
        int i=l, j=r;
        int x=a[l];
        while(i<j)
        {
            while(i<j && a[j]>=x)  j--;

            if(i<j) a[i++]=a[j];

            while(i<j && a[i]<x) i++;

            if(i<j) a[j--]=a[i];
        }

        a[i] = x;
        Quick_Sort(a,l,i-1);
        Quick_Sort(a,i+1,r);
    }
}


void Greedy(int n, int *t)
{
    int wait_time=0,wait_stime=0;  // wait_time: 每個顧客的等待時間,wait_stime: 顧客總的等待時間
    int i;

    for(i=1;i<=n;i++)
    {    
        wait_time = wait_time+t[i];  //等待時間 = 0 時刻到顧客服務完成時刻的時間間隔
        wait_stime+=wait_time;      // 總的等待時間更新:加上新的服務顧客的等待時間
        printf("\n第%d個被選擇服務的顧客的服務時間為:%d,等待時間為:%d",i,t[i],wait_time);
        
    }
    printf("\n顧客等待總時間為:%d\n", wait_stime);
}


void main()
{
    int wait_stime=0,wait_time=0; 
    int i,n;
    int t[size];
    int l,r;

    printf("請輸入服務總人數:");
    scanf("%d",&n);

    printf("\n請輸入%d人各自的服務時間:",n);
    for(i=1; i<=n ;i++)
        scanf("%d",&t[i]);
    l=1;  //快速排序的左邊界
    r=n; //快速排序的右邊界

    Quick_Sort(t,l,r);
    Greedy(n,t); 

    system("pause");
}

 

運行結果:

 

Python實現: 

# Hello, i'm JJU-干干

def Quick_Sort(a,l,r):
    if(l<r):
        i = l
        j = r
        x = a[l]
        while i<j:
            while i<j and a[j]>=x:
                j-=1
            if i<j:
                a[i] = a[j]
                i+=1
            while i<j and a[i]<x:
                i+=1
            if i<j:
                a[j] = a[i]
                j-=1

        a[i] = x
        Quick_Sort(a,l,i-1)
        Quick_Sort(a,i+1,r)
    return a

def Greedy(n,t):
    wait_time = 0
    wait_stime = 0

    for i in range(0,n):
        wait_time = wait_time + t[i]
        wait_stime = wait_stime + wait_time
        print("第{0}個被選擇服務的顧客的服務時間為:{1}, 等待時間為:{2}" .format(i,t[i],wait_time))
    print("顧客等待的總時間為:{0}".format(wait_stime))

if __name__ == '__main__':
    n = eval(input("請輸入要服務顧客的總人數:"))
    t = list(eval(input("請輸入顧客各自所需的服務時間:")))
    
    l=0
    r=n-1

    t = Quick_Sort(t,l,r)
    Greedy(n,t)

 

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM