贪心算法之顾客服务安排问题(顾客等待时间问题)

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)

 

运行结果:

 

posted @ 2020-04-25 18:40  ZengZG  Views(4780)  Comments(0Edit  收藏  举报