首页 > 试题广场 >

Heather银行想知道,如果再开设一台ATM,情况将如何。

[问答题]
Heather银行想知道,如果再开设一台ATM,情况将如何。请对模拟进行修改,以包含两个队列。假设当第一台ATM前的排队人数少于第二台ATM时,客户将排在第一队,否则将排在第二队。然后再找出要使平均等候时间为1分钟,每小时到达的客户数应该为多少(注意,这是一个非线性问题,即将ATM数量加倍,并不能保证每小时处理的客户数量也翻倍,并确保客户等候的时间少于1分钟)?
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "H12_6.h"

const int MIN_PER_HR = 60;
bool newcustomer(double x);


int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
    using std::ios_base;

    std::srand(std::time(0));

    cout << "Case Study: Bank of Heather Automatic Teller\n";
    cout << "Enter maximum size of queue: ";
    int qs;
    cin >> qs;

    cout << "Enter the number of simulation hours: ";
    int hours;
    cin >> hours;
    long cyclelimit = MIN_PER_HR*hours;

    Item temp;
    double perhour=1;
    long lastturnaways=0;
    long lastcustomers=0;
    long lastserved=0;
    long lastsum_line1=0;
    long lastsum_line2=0;
    long lastline_wait=0;

    while(true)
    {
        Queue line1(qs);
        Queue line2(qs);

        double min_per_cust;
        min_per_cust=MIN_PER_HR/perhour;

        long turnaways=0;
        long customers=0;
        long served=0;
        long line_wait=0;

        int wait_time1=0;
        long sum_line1=0;
        int wait_time2=0;
        long sum_line2=0;

        for(int cycle=0;cycle<cyclelimit;cycle++)
        {
            if(newcustomer(min_per_cust))   //是否有顾客要加入队列
            {
                if(line1.isfull()&&line2.isfull())
                    turnaways++;
                else if(line1.queuecount()>line2.queuecount())
                {
                    customers++;
                    temp.set(cycle);
                    line2.enqueue(temp);
                }
                else
                {
                    customers++;
                    temp.set(cycle);
                    line1.enqueue(temp);
                }
            }

            if(wait_time1<=0&&!line1.isempty())  //前一个操作完毕
            {
                line1.dequeue(temp);
                wait_time1=temp.ptime();
                line_wait+=cycle-temp.when();
                served++;
            }

            if(wait_time2<=0&&!line2.isempty())  //前一个操作完毕
            {
                line2.dequeue(temp);
                wait_time2=temp.ptime();
                line_wait+=cycle-temp.when();
                served++;
            }

            if(wait_time1>0)
                wait_time1--;
            if(wait_time2>0)
                wait_time2--;

            sum_line1+=line1.queuecount();
            sum_line2+=line2.queuecount();
        }
        if((double) line_wait/served>1)
            break;
        else
        {
            lastturnaways=turnaways;
            lastcustomers=customers;
            lastserved=served;
            lastsum_line1=sum_line1;
            lastsum_line2=sum_line2;
            lastline_wait=line_wait;
        }
        perhour++;
    }

    cout << "average wait time lower than 1 minutes needs " << perhour << " customers per hour.\n";

    if(lastcustomers>0)
    {
        cout << "customers accepted: " << lastcustomers << endl;
        cout << "  customers served: " << lastserved << endl;
        cout << "         turnaways: " << lastturnaways << endl;
        cout << "average queue1 size: ";
        cout.precision(2);
        cout.setf(ios_base::fixed,ios_base::floatfield);

        cout << (double) lastsum_line1/cyclelimit << endl;
        cout << "average queue2 size: ";
        cout << (double) lastsum_line2/cyclelimit << endl;
        cout << " average wait time: " << (double) lastline_wait/lastserved << " minutes\n";
    }
    else
        cout << "No customers!\n";
    cout << "Done!\n";

    return 0;
}

bool newcustomer(double x)
{
    return(std::rand()*x/RAND_MAX<1);
}

发表于 2019-11-05 10:23:39 回复(0)