银行排队模拟(生产者-消费者模拟)

【问题描述】

一个系统模仿另一个系统行为的技术称为模拟,如飞行模拟器。模拟可以用来进行方案论证、人员培训和改进服务。计算机技术常用于模拟系统中。

生产者-消费者(Server-Custom)是常见的应用模式,见于银行、食堂、打印机、医院、超等提供服务和使用服务的应用中。这类应用的主要问题是消费者如果等待(排队)时间过长,会引发用户抱怨,影响服务质量;如果提供服务者(服务窗口)过多,将提高运管商成本。(经济学中排队论)

假设某银行网点有五个服务窗口,分别为三个对私、一个对公和一个外币窗口。银行服务的原则是先来先服务。通常对私业务人很多,其它窗口人则较少,可临时改为对私服务。假设当对私窗口等待服务的客户(按实际服务窗口)平均排队人数超过(大于或等于)7人时,等待客户将可能有抱怨,影响服务质量,此时银行可临时将其它窗口中一个或两个改为对私服务,当客户少于7人时,将立即恢复原有业务。设计一个程序用来模拟银行服务。

说明:

1. 增加服务窗口将会增加成本或影响其它业务,因此,以成本增加或影响最小为原则来增加服务窗口,即如果增加一个窗口就能使得按窗口平均等待服务人数小于7人,则只增加一个窗口。一旦按窗口平均等待服务人数小于7人,就减少一个所增加的窗口。

2. 为了简化问题,假设新到客户是在每个服务周期开始时到达。

3. 当等待服务人数发生变化时(新客户到达或有客户已接受服务),则及时计算按实际服务窗口平均等待服务人数,并按相应策略调整服务窗口数(增加或减少额外的服务窗口,但对私窗口不能减少)。注意:只在获取新客户(不管到达新客户数是否为0)时或已有客户去接受服务时,才按策略调整服务窗口数。进一步讲,增加服务窗口只在有客户到达的周期内进行(也就是说增加窗口是基于客户的感受,银行对增加窗口是不情愿的,因为要增加成本,一旦不再有新客户来,银行是不会再增加服务窗口的);一旦有客户去接受服务(即等待客户减少),银行将根据策略及时减少服务窗口,因此,在每个周期内,有客户去接受服务后要马上判断是否减少服务窗口(因为能减少成本,银行是积极的)

本问题中假设对公和对外币服务窗口在改为对私服务时及服务期间没有相应因公或外币服务新客户到达(即正好空闲),同时要求以增加成本或影响最小为前提,来尽最大可能减少对私服务客户等待时间。

【输入形式】

首先输入一个整数表示时间周期数,然后再依次输入每个时间周期中因私业务的客户数。注:一个时间周期指的是银行处理一笔业务的平均处理时间,可以是一分钟、三分钟或其它。例如:

6

2  5  13  11  15   9

说明:表明在6个时间周期内,第1个周期来了2个(序号分别为1,2),第2个来了5人(序号分别为3,4,5,6,7),以此类推。

【输出形式】

每个客户等待服务的时间周期数。输出形式如下:

用户序号 : 等待周期数

说明:客户序号与等待周期数之间用符号:分隔,冒号(:)两边各有一个空格,等待周期数后直接为回车。

【样例输入】

4

2  5  13  11

【样例输出】

1 : 0

2 : 0

3 : 0

4 : 0

5 : 0

6 : 1

7 : 1

8 : 0

9 : 1

10 : 1

11 : 1

12 : 1

13 : 2

14 : 2

15 : 2

16 : 3

17 : 3

18 : 3

19 : 4

20 : 4

21 : 3

22 : 4

23 : 4

24 : 4

25 : 5

26 : 5

27 : 5

28 : 6

29 : 6

30 : 6

31 : 7

【样例说明】

样例输入表明有四个时间周期,第一个周期来了2人(序号1-2);第二个周期来了5人(序号3-7);第三个周期来了13人(序号8-20);第四个周期来了11人(序号21-31)。由于第一个时间周期内只来了2人,银行(有三个服务窗口)能及时提供服务,因此客户等待时间为0;第二个时间周期内来了5人,银行一个周期内一次只能服务3人,另有2个在下个周期内服务,因此等待时间为1,其它类推。

【题解】

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3
  4 #define MAXSIZE 200
  5 #define MINSVR 3
  6 #define MAXSVR 5
  7 #define NUMBER 7
  8
  9 typedef struct
 10 {
 11     int id;
 12     int wtime;
 13 }CustType;
 14
 15 CustType queue[MAXSIZE];
 16 int front=0,real=-1,num=0;
 17 int Worknum=MINSVR;
 18
 19 int isEmpty();
 20 int isFull();
 21 void enQueue(CustType q);
 22 CustType deQueue();
 23 void updatetime();
 24 void arriveCust();
 25 void service();
 26
 27 int main(void)
 28 {
 29     int clock,sumClock;
 30     scanf("%d",&sumClock);
 31     clock=1;
 32     while(1)
 33     {
 34         if(!isEmpty())
 35             updatetime();
 36         if(clock<=sumClock)
 37             arriveCust();
 38         service();
 39         if(num==0 && clock>sumClock)
 40             break;
 41         clock++;
 42     }
 43     return 0;
 44 }
 45
 46 int isEmpty()
 47 {
 48     return num==0;
 49 }
 50 int isFull()
 51 {
 52     return num==MAXSIZE;
 53 }
 54 void enQueue(CustType q)
 55 {
 56
 57     if(isFull())
 58         exit(-1);
 59     else
 60     {
 61         real=(real+1)%MAXSIZE;
 62         queue[real]=q;
 63         num++;
 64     }
 65     return;
 66 }
 67 CustType deQueue()
 68 {
 69     CustType q;
 70     if(isEmpty())
 71         exit(-1);
 72     else
 73     {
 74         q=queue[front];
 75         front=(front+1)%MAXSIZE;
 76         num--;
 77     }
 78     return q;
 79 }
 80 void updatetime()
 81 {
 82     int i;
 83     for(i=0;i<num;i++)
 84         queue[(front+i)%MAXSIZE].wtime++;
 85     return;
 86 }
 87 void arriveCust()
 88 {
 89     static int count=1;
 90     int i,n;
 91     CustType q;
 92     scanf("%d",&n);
 93     for(i=0;i<n;i++)
 94     {
 95         q.id=count++;
 96         q.wtime=0;
 97         enQueue(q);
 98     }
 99     while((num/Worknum)>=NUMBER && Worknum<MAXSVR)
100         Worknum++;
101     return;
102 }
103 void service()
104 {
105     int i;
106     CustType q;
107     for(i=0;i<Worknum;i++)
108         if(isEmpty())
109             return;
110         else
111         {
112             q=deQueue();
113             printf("%d : %d\n",q.id,q.wtime);
114         }
115     while((num/Worknum)<NUMBER && Worknum>MINSVR)
116         Worknum--;
117     return;
118 }

原文地址:https://www.cnblogs.com/tuoniao/p/10346452.html

时间: 2024-10-17 02:37:06

银行排队模拟(生产者-消费者模拟)的相关文章

Java模拟生产者消费者问题

一.Syncronized方法详解 解决生产者消费这问题前,先来了解一下Java中的syncronized关键字. synchronized关键字用于保护共享数据.请大家注意"共享数据",你一定要分清哪些数据是共享数据,如下面程序中synchronized关键字保护的不是共享数据(其实在这个程序中synchronized关键字没有起到任何作用,此程序的运行结果是不可预先确定的).这个程序中的t1,t2是 两个对象(pp1,pp2)的线程.JAVA是面向对象的程序设计语言,不同的对象的数

模拟生产者消费者(多条生产线多个消费者)

1 import java.util.concurrent.ArrayBlockingQueue; 2 import java.util.concurrent.BlockingQueue; 3 import java.util.concurrent.locks.Lock; 4 import java.util.concurrent.locks.ReentrantLock; 5 /** 6 * 模拟生产者消费者(多条生产线多个消费者) 7 * 仓库容量为10 8 * 保证仓库充足量为5 9 * @

java多线程模拟生产者消费者问题,公司面试常常问的题。。。

package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 //Storage仓库 //批注:我把输出结果写在程序以下了,你能够看一下,事实上非常easy的,你想象一下产品从生产,到取出的一个生产线,我们定义两个线程,生产者线程,和消费者线程,一个是生产者不停的生产产品并放入数量有限的指定槽内,而消费者从指定槽依次取出产品,现实中的流水车间也相似于此. publ

Linux多线程模拟生产者/消费者问题

描述: 生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个进程地址空间内执行的N个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供N个消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 输入: 生产者个数.消费者个数.还是缓冲

多线程模拟生产者消费者示例之BlockQuue

public class Test { public static void main(String[] args){ //创建一个阻塞队列,边界为1 BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1); new Thread(new PThread(queue)).start(); new Thread(new CThread(queue)).start(); }} /** * 生产者 */class P

java 用notifyAll和wait() 模拟生产者消费者模型

import java.util.LinkedList; import java.util.Queue; import java.util.Random; /** * Simple Java program to demonstrate How to use wait, notify and notifyAll() * method in Java by solving producer consumer problem. * * @author Javin Paul */ public cla

生产者-消费者问题【Java实现】

综合示例,演示有限长度字符序列缓冲区的并发读写, 或者称 生产者 - 消费者问题.错漏之处, 恳请指出 ^_^ /** * PCProblem : * 模拟生产者-消费者问题, 生产者产生字符并写入字符序列缓冲区, 消费者从缓冲区取走字符 * * @author shuqin1984 2011-08-05 * */ package threadprogramming.basic.simulation; import java.util.concurrent.ExecutorService; im

Java-J2SE学习笔记-线程-生产者消费者问题

一.概述 模拟生产者消费者问题 二.代码 1.Consumer.java 2.Producer.java 3.SyncStack.java 4.Test.java 1.Consumer.java package ProducerConsumer; public class Consumer implements Runnable { private SyncStack syncStack; public Consumer(SyncStack syncStack) { super(); this.

【Windows】用信号量实现生产者-消费者模型

线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者. 2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据. 3.消费者从共享内存资源取数据,如果区域空,则等待生产者填充数据. 4.生产者的填充数据行为和消费者的消费数据行为不可在同一时间发生. 下面用Windows的信号量以及线程等API模拟生产者-消费者模型 #include <Windows.h> #include <stdio.h> #define N 100 #d