资源描述
实验2排队系统仿真
一、 学习目的
1. 了解仿真的特点
2. 学习如何建构模型
3. 熟悉eM-Plant基本的对象和操作
4. 掌握排队系统的特点与仿真的实现方法
二、 问题描述
该银行服务窗口为每个到达的顾客服务的时间是随机的,表2.4是顾客服务时间纪录的统计结果
表2.4 每个顾客服务时间的概率分布
服务时间(min)
概率密度
累计概率
1
0.1
0.1
2
0.2
0.3
3
0.3
0.6
4
0.25
0.85
5
0.1
0.95
6
0.05
1.0
对于上述这样一个单服务待排队系统,仿真分析30天,分析该系统中顾客的到达、等待和被服务情况,以及银行工作人员的服务和空闲情况。
三、 系统建模
3.1 仿真目标
通过对银行排队系统的仿真,研究银行系统的服务水平和改善银行服务水平的方法,为银行提高顾客满意度,优化顾客服务流程服务。
3.2.系统建模
3.2.1 系统调研
1. 系统结构: 银行服务大厅的布局, 涉及的服务设备
2. 系统的工艺参数: 到达-取号-等待-服务-离开
3. 系统的动态参数: 顾客的到达时间间隔, 工作人员的服务时间
4. 逻辑参数: 排队规则, 先到先服务
5. 系统的状态参数: 排队队列是否为空, 如果不为空队长是多少, 服务台是否为空
6. 系统的输入输出变量:输入变量确定其分布和特征值,顾客的到达时间间隔的概率分布表和每个顾客被服务时间的概率分布. 输出变量根据仿真目标设定. 包括队列的平均队长、最大队长、仿真结束时队长、总服务人员、每个顾客的平均服务时间、顾客平均排队等待服务时间、业务员利用率等。
3.2.2系统假设
1.取号机前无排队,取号时间为0
2. 顾客排队符合先进先出的排队规则
3.一个服务台一次只能对一个顾客服务
4.所有顾客只有一种单一服务
5.仿真时间为1个工作日(8小时)
6.等候区的长度为无限长
3.2.3系统建模
系统模型:
3.2.4 仿真模型
1.实体:银行系统中的实体是人(主动体)
2.属性:到达时间间隔、接受服务的时间、接受服务类型
3.事件:顾客到达、开始取号、取号结束、进入队列、出队列、接受服务、服务完成、离开银行。
4.活动:到达、取号、排队、服务、离开
5.资源:取号机、排队的座椅、服务柜台
4 系统仿真
4.1 eM-plant界面与主要控件介绍
1
2
3
4
5
1. 实体:
eM-Plant中包括3类实体:entity,container,transporter。
Entity,属于被动体,本身在系统中不能移动,需和主动资源配合才能移动,常用于生产线上的半成品、仓库中的货物等;
container,属于被动体,本身在系统中不能移动,需要和主动资源配合才能移动。做容器使用,在container中可以存储entity,如集装箱、托盘、纸箱等;
transporter属于主动体,在系统中无论主动资源还是被动资源,均可以移动。常用于带动力的实体,如车辆、AGV小车、人等。实体在仿真系统中必不可少,任何系统具有1个或者1个以上的实体。
2. toolboxs
toolboxs是在仿真过程中需要使用的各重控件包括:material Flow, Resources, Information Flow, User Interface, Tools等5个面板。本课程重点学习:material Flow, Information Flow, User Interface三个面板。下面分别介绍如下:
connection,连接线,表示实体的移动(或者资源之间的关系),如顾客到达后取号,则顾客到达资源则与取号机资源。实体从顾客到达资源进入取号机资源则二者之间去有connection连接。
EventController,仿真钟,仿真系统钟必备资源,有且只能有一个,表示仿真过程钟的时间轴。
source,drain,开始和结束资源,仿真系统钟必备资源,可以有多个,表示仿真系统的开始点和结束点。一般来说一个资源对应一个活动,对应实体在其上的一个时间段。一个活动或者一个资源有两个事件,开始事件和结束事件。但是source和drain是一种特殊的资源,只有一个事件,它表示一个时间点,而不是时间段。
singleProc,ParallelProc,单工作台和并行工作台资源。可以表示任意的加工活动,如顾客接收银行业务员服务活动,取号机取号活动等。如果只有一个柜台提供服务,则使用singleproc,如果有多个柜台且服务时间和服务方式相同,则使用ParallelProc。如果有多个柜台且服务时间和服务方式不同,则使用多个singleProc。
placebuffer,buffer,等候区。不同之处在于placebuffer进来的顺序和出来的顺序没有关系,而buffer则保证最先进来最先出去(FIFO,First In First Out),凡是需要排队等候的地方剧需要用buffer或者placebuffer,一般来说buffer更长用一些,实际的许多排队系统一般都是FIFO的排队规则。
lines,传送带资源。entity,container,transporter均可以在其上被传送。常用于运输皮带、链式输送机、辊子输送机等。
track,道路。上述资源中唯一不带动力的资源,只有主动体才可以在其上运动,entity和container则无法使用track资源。常用于道路、轨道。
flowcontrol,流控。实体在加工过程中根据不同的情况会有不同的流向。
method。前面已提及,除了source和drain,其他的资源可以表示一个活动(时间段),具有开始事件和结束事件。eM-Plant软件中有很多类和对象,可以简化构建仿真系统的过程,因此如果没有特殊的要求,一般系统会自动执行。但是,根据实际问题的需要,需要编制自己的开始事件和结束事件。如本实验中,在对顾客进行服务前(开始服务事件),需要考虑顾客的服务时间是多少,系统无法自动完成,则必须使用method创建一个开始服务事件,插入服务台资源中,通过编程实现任意顾客的服务时间。Method是编程工具,而编程则是对事件的编程。
Variable。全局变量,在C语言中,存在全局变量和局部变量,eM-Plant中与其相似,在method中定义的变量属于局部变量,但是,某些时候,某个变量需要在不同的mothod中使用,此时则用到全局变量。
table。表,用于储存数据。
chart,制作各种图表
3. Frame
Frame 是仿真系统的工作界面,在Frame中建模并运行仿真系统。银行系统中,顾客取号后排队等着叫号,根据不同的排队号类别被分成了多个排队队列,取号后分成多个队列则有flowcontrol控制。在Frame中如图所示:
顾客到达(source)后取号(singleproc)根据不同的顾客类型分类(flowcontrol),分为个人客户和企业客户,分别进入个人客户队列和企业客户队列进行排队。在系统中有3个个人客户服务台(singleproc),如果任何一个个人客户服务台为空,则查找个人客户队列如果不为空,则选择最早进入的客户进行服务。系统中有n个企业客户服务台,则使用一个多服务台资源(prallelproc)表示,任意一个服务台完成对顾客的服务后,顾客离开(drain),它们之间的关系用连接线表示(connection)。针对本实验的单服务台系统则可以简单表示为:
4. 资源管理器
资源管理器的功能是对资源进行管理;包括MaterialFlow、Resources、InformationFlow、UseInterFace、MUs、Tools、其功能与tools中的功能相同。用户可以自己创建新的文件夹,创建新的Frame来实现仿真系统的构建。
5. console
console,控制台,呈现编译和调式过程中的各种信息,包括出错信息、警告信息、输出信息等。
4.2 完成排队仿真系统
1. 启动eM-Plant Professional
开始>程序>Tecnomatix>eM-Plant 7.0 >eM-Plant Professional
打开后如图所示:
2. 创建新的模型,点选菜单栏File>New Model
出现下图:
3. 新增文件夹
点选Model,按鼠标右键,出现object的功能表,选择New > Folder
然后选中新建文件夹并右击出现快捷菜单,选择Rename进行重新名,名为“QueueSystem”。
4.创建新的Frame,命名为“QueueFrame”
选中QueueSystem文件夹,右击,选择New > Frame,然后右击Frame重命名
5. 创建主要控件(根据个人喜好,可将Frame最大化)
选中tools工具栏中的source按钮,然后在Frame中单击创建source控件。
用同样的方法创建buffer、singleproc、drain、eventcontroller等控件,同时用connection将其连接起来。
6. 创建一个实体
选中MUs目录下的Entity,然后按住Ctrl,并拖到QueueSystem目录下,就复制过来了,右击改名为person。
7.设置各控件属性
双击source,打开其属性对话框,修改Attributes选项卡里面的MU值,单击后面的按钮,打开select object对话框,选择前面新建的person,单击OK。
双击buffer按钮,先设置Attributes选项卡中的Capacity属性值,将其改为-1,表示无限量,单击Apply,然后选择times选项卡,将processing time改为0,单击OK。
双击Drain,将times选项卡中的processing time值改为0,单击OK。
双击Eventcontroller,选择settings选项卡,根据要求,设置Data为开始时间,End为结束时,单击OK。
8. 创建Method以及Tablefile
在tools工具栏中选择Method按钮和Tablefile按钮,然后在Frame中创建相应的Method和Tablefile,右击弹出快捷菜单,选择Rename进行改名,分别创建6个Method和3个Tablefile。
Method:reset、init、endsim、arrivalintervaltime、customsevertime、computequeuelength;
Tablefile:queueTab、customsTab、customs20Tab。
9.创建两个全局变量
在tools工具栏里面选择Variable按钮,创建两个全局变量:SimulationTimes、QueueNumberCount,将两个全局变量中Value选项卡中的Data Type都改为integer,单击OK。
10.修改person属性
在左边根目录下双击Person,弹出对话框,选择Custom Attributes选项卡。
单击new按钮,新建一个属性变量,Name为arrivaltime,Data Type为time。
单击OK,返回前面对话框,再新建两个类型为time的serverTime和waitTime的属性变量。
11.编辑表格属性
设置QueueTab第1列的Data Type为integer,第2列的data type为integer,第3列的Data Type为real,第4列的Data Type为integer,第5列的Data Type为integer。
设置CustomsTab第1列的Data Type为integer,第2列的Data Type为integer,第3列的Data Type为time,第4列的Data Type为time,第5列的Data Type为real。
设置customs20Tab的第1列的Data Type为integer,第2列的Data Type为time,第3列的Data Type为time,第4列的Data Type为time,第5列的Data Type为time。
操作:双击queuetab表,出现表格窗口。
单击表格菜单栏中的format >inherit format将其前面的勾去点。
选中第一列,单击format >format,出现list format对话框,将Data Type改为integer,单击OK。
其他表格按同样方法设置。
12. 编写代码
双击Method,在里面编写相应的代码,具体见后面代码。
13. 控制
编写完代码后需要把method放到相应的位置,来控制仿真的运行,双击source,选择controls选项卡,将Entrance属性值设为QueueSystem.QueueFrame. ArrivalIntervalTime。
双击singleproc,选择controls选项卡,将Entrance属性值设为 .Models.QueueSystem. QueueFrame.CustomServerTime
同样设置drain中entrance属性值为.Models.QueueSystem.QueueFrame. ComputeQueueLength
14. 代码
Reset代码:
is
do
deleteMovables;
QueueNumberCount:=0;
end;
Init代码
is
do
QueueNumberCount:=0;
end;
Endsim代码
is
tab:table;
do
tab.create;
Buffer.statistics(tab);
buffer.statistics;
QueueTab[1,SimulationTimes]:=SimulationTimes;
QueueTab[2,SimulationTimes]:=tab[4,1];
QueueTab[4,SimulationTimes]:=tab[9,1];
QueueTab[5,SimulationTimes]:=tab[6,1];
tab.delete;
singleProc.statistics(tab);
CustomsTab[1,SimulationTimes]:=SimulationTimes;
CustomsTab[2,SimulationTimes]:=tab[5,1];
CustomsTab[3,SimulationTimes]:=tab[20,1];
CustomsTab[4,SimulationTimes]:=tab[15,1];
CustomsTab[5,SimulationTimes]:=tab[17,1];
if SimulationTimes<30 then
.models.queuesystem.queueframe.EventController.reset;
SimulationTimes:=SimulationTimes+1;
.models.queuesystem.queueframe.EventController.start;
else
SimulationTimes:=1;
end;
end;
ArrivalIntervalTime代码
is
rand:real;
do
rand:=Z_uniform(SimulationTimes,0,1);
if rand>0.0 and rand<=0.125 then
Source.interval:=60*1;
elseif rand>0.125 and rand<=0.250 then
Source.interval:=60*2;
elseif rand>0.250 and rand<=0.375 then
Source.interval:=60*3;
elseif rand>0.375 and rand<=0.5 then
Source.interval:=60*4;
elseif rand>0.5 and rand<=0.625 then
Source.interval:=60*5;
elseif rand>0.625 and rand<=0.75 then
Source.interval:=60*6;
elseif rand>0.75 and rand<=0.875 then
Source.interval:=60*7;
elseif rand>0.875 and rand<=1.0 then
Source.interval:=60*8;
end;
@.arrivalTime:=eventcontroller.simtime;
end;
CustomServerTime代码
is
rand:real;
do
@.serverTime:=SingleProc.ProcTime;
rand:=Z_uniform(1,0,1);
if rand>0.0 and rand<=0.1 then
SingleProc.ProcTime:=60*1;
elseif rand>0.1 and rand<=0.3 then
SingleProc.ProcTime:=60*2;
elseif rand>0.3 and rand<=0.6 then
SingleProc.ProcTime:=60*3;
elseif rand>0.6 and rand<=0.85 then
SingleProc.ProcTime:=60*4;
elseif rand>0.85 and rand<=0.95 then
SingleProc.ProcTime:=60*5;
elseif rand>0.95 and rand<=1.0 then
SingleProc.ProcTime:=60*6;
end;
end;
ComputeQueueLength代码
is
do
QueueNumberCount:=QueueNumberCount+1;
QueueTab[3,SimulationTimes]:=(QueueTab[3,SimulationTimes]*(QueueNumberCount-1)+Buffer.numMU)/QueueNumberCount;
if simulationTimes=1 and QueueNumberCount=1 then
Customs20Tab[1,QueueNumberCount]:=QueueNumberCount;
Customs20Tab[2,QueueNumberCount]:=@.arrivalTime;
Customs20Tab[3,QueueNumberCount]:=0;
Customs20Tab[4,QueueNumberCount]:=@.serverTime;
Customs20Tab[5,QueueNumberCount]:=@.statAvgLifeSpan-@.serverTime;
elseif simulationTimes=1 and QueueNumberCount<=20 then
Customs20Tab[1,QueueNumberCount]:=QueueNumberCount;
Customs20Tab[2,QueueNumberCount]:=@.arrivalTime;
Customs20Tab[3,QueueNumberCount]:=@.arrivalTime-Customs20Tab[2,QueueNumberCount-1];
Customs20Tab[4,QueueNumberCount]:=@.serverTime;
Customs20Tab[5,QueueNumberCount]:=@.statavglifespan-@.serverTime;
end;
end;
5 实验要求
5.1 按照上面的介绍建立单服务台仿真模型,并给出各个表格中各数据的含义。
5.2 在练习上述排队系统仿真的基础上,调研真实的银行系统,增加以下几个功能:
(1) 服务窗口从一个增加为多个;
(2) 业务范围从一种增加为多种(一般客户、企业客户);
(3) 增加多个ATM取款机。
实验报告提纲:
(1) 仿真目标
(2) 系统调研
(3) 系统假设
(4) 系统建模
(5) 仿真模型
(6) 仿真结果分析
(7) 心得体会
展开阅读全文