某家小型市场,分为生食区和熟食区。生食区提供新鲜的肉和鱼,熟食区为需要午餐的人提供附餐及三明治。生食区和熟食区前分别有一个等待队列,顾客在进入市场时,根据需要选择要加入的队列,并取号等待,取号时间为0.5分钟。如果是午餐顾客,且市场内顾客总人数不超过30时,直接进入熟食队列等待,如果是普通顾客,要分两种情况:(1)只买生食:市场内顾客总人数不超过30,进入生食队列等待;(2)买生食和熟食:判断顾客总人数,选择生食队列与熟食队列中较短的一个,取号等待。午餐顾客到达时间服从triangle(2,5,7)*uniform(0.85,1.15);普通顾客到达时间服从triangle(3,8,15)。假设一天工作8小时,模拟顾客到达并进行服务的情况,了解生食区和熟食区的工作忙率,顾客等待时间等数据。模型最终界面如图1所示,模型下载。
图1 模型最终界面
(1) 元素说明
模型中涉及的建模元素名称、类型、作用见表1。
表1 零售店建模元素表
名 称 |
类 型 |
数量 |
作 用 |
|
Normalcustomer |
Part |
1 |
模拟普通顾客,只买生食或者生食熟食都买 |
|
Lunchcustomer |
Part |
1 |
模拟熟食顾客,只买熟食 |
|
Freshwaitno |
Buffer |
1 |
模拟生食队伍取号机前的队列 |
|
Cookedwaitno |
Buffer |
1 |
模拟熟食队伍取号机前的队列 |
|
Freshmachine |
Machine |
1 |
模拟生食柜台前的取号机 |
|
Cookedmachine |
Machine |
1 |
模拟熟食柜台前的取号机 |
|
Freshline |
Buffer |
1 |
模拟生食柜台前的等待队列 |
|
Cookedline |
Buffer |
1 |
模拟熟食柜台前的等待队列 |
|
freshbar |
Machine |
9 |
模拟生食柜台服务 |
|
cookedbar |
Machine |
6 |
模拟熟食柜台服务 |
|
buykind |
Attribute |
1 |
表示普通顾客的类型,buykind=1,顾客只买生食,buykind=2,顾客生食与熟食都买 |
|
needtoserve |
attribute |
1 |
表示buykind=2的顾客已经接受的服务次数,needtoserve=1,表示该顾客只接受了一次服务。Needtoserve=2,表示该顾客接受两次服务,完成服务过程,退出系统。 |
|
(2) 系统终止运行条件
8小时,480分钟的工作时间。
(3) 系统流程图形化描述
图2零售店运作流程图
(1) 元素的定义
通过设计者窗口“Designer Window”定义2个Part元素、4个Buffer元素、4个Machine元素。然后对照上表修改这些元素名称和freshbar和cookedbar名称的Machine的数量分别改为9和6,设计完毕后的窗口界面如图1所示。
在布局窗口通过:右键—〉Define方式定义两个属性needtoserve和buykind,这两个属性的设计界面如图4。
图3 属性元素定义界面
该系统仿真模型构成元素定义完毕之后,需要对元素的细节进行设计,以实现系统的运作流程。
(2) 建模元素细节Detail设置
l Part类型元素normalcustomer的细节设计
对该元素细节设计需要达到的效果是:实现normalcustomer以表2的分布为基准的间隔时间分布。
顾客到达后首先判断店里的总顾客数量是否大于30,如果店里的总顾客数量大于30,该顾客马上离开。如果总顾客人数不大于30,则该顾客选择接受服务。
其次,我们要对顾客的属性buykind进行判断,如果顾客不是在午餐时间到,那么该顾客只买生食,buykind=1,而如果该顾客是在午餐时间到达的,那么buykind=2.
最后,我们要判断该顾客去往哪里接受服务。对于buykind=1的顾客,直接在生食区进行服务即可,buykind=2的顾客要选择生食区和熟食区队列最少的一区进行服务,服务完成后再接受另外一区的服务。
表2 普通顾客到达时间分布
时间 |
到达率 |
时间 |
到达率 |
9:00——9:30 |
10 |
13:00——13:30 |
55 |
9:30——10:00 |
25 |
13:30——14:00 |
40 |
10:00——10:30 |
30 |
14:00——14:30 |
35 |
10:30——11:00 |
30 |
14:30——15:00 |
35 |
11:00——11:30 |
35 |
15:00——15:30 |
40 |
11:30——12:00 |
45 |
15:30——16:00 |
45 |
12:00——12:30 |
65 |
16:00——16:30 |
50 |
12:30——13:00 |
60 |
16:30——17:00 |
60 |
下面是对normalcustomer进行detail设计的过程:
首先我们打开normalcustomer的detail设计对话框,如图4所示:
图4 normalcustomer元素细节设计界面
然后首先将Type项改为active with profile,然后在对话框上方选择arrival profile选项,将time display改为8 hours,然后按照表2的内容输入左边对话框中,如图5所示,
图5 顾客到达分布设置
最后按照设计要求将程序代码依次填入图4的对话框中,图4界面中按钮中的代码及其含义说明如下:
按钮名称 |
代 码 |
代码功能 |
To... |
IF NPARTS (freshline) + NPARTS (cookedline) < 30 IF buykind = 1 PUSH to freshwaitno ELSE IF NPARTS (freshline) < NPARTS (cookedline) PUSH to freshwaitno ELSE PUSH to cookedwaitno ENDIF ENDIF ELSE PUSH to SHIP ENDIF
|
判断店里总顾客数是否大于30,如果小于30,接受服务,如果顾客只买生食,直接将该顾客送到生食区进行取号排队,如果顾客两者都买,则顾客选择两个区中队列较短的一区先接受服务。 |
Actions on Create...
|
ICON = 24 IF MOD (TIME,480) < 270 AND MOD (TIME,480) > 120 buykind = 2 ELSE buykind = 1 ENDIF
|
界定顾客的种类,当顾客在午餐时间段外到达的话,buykind=1,即顾客只买生食其余的就是两者都买,即buykind=2. |
注:按钮Actions on Create中的程序在每个normalcustomer进入系统是都执行一次,属性元素的值将是针对当前进入系统的normalcustomer。