zoukankan      html  css  js  c++  java
  • 贪心算法之顾客服务安排问题(顾客等待时间问题)

    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("
    第%d个被选择服务的顾客的服务时间为:%d,等待时间为:%d",i,t[i],wait_time);
            
        }
        printf("
    顾客等待总时间为:%d
    ", 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("
    请输入%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)

    运行结果:

  • 相关阅读:
    基于wax的lua IOS插件开发
    acm
    微策略面试题:在旋转后的数组中查找元素(二分查找)
    BP神经网络
    神经网络理论基础
    机器人关节数学模型
    如何下载中文和英文的全文专利
    Java 12 骚操作, switch居然还能这样玩!
    Java 12 骚操作, String居然还能这样玩!
    Spring Boot YML 掀翻 Properties!!
  • 原文地址:https://www.cnblogs.com/ZZG-GANGAN/p/12767578.html
Copyright © 2011-2022 走看看