Anylogic模型搭建01:医院排队挂号模拟试验
作者:互联网
一、具体情境描述
患者到医院就诊,需要先挂号,再分流到对应的诊室就诊。在我们的模型中,有两种挂号方式:自助挂号机和人工窗口,以及两种诊室:内科和外科。患者根据不同的需求选择不同的挂号方式及诊室。
下边是我们模型搭建的最终效果展示:
图 1医院排队挂号整体框架
图 2 运行效果展示
图 3 3D效果图展示
二、模型搭建
2.1整体逻辑搭建:
基本逻辑框架如下,“面板”—“流程建模库”,选择相应模块。
图 4 基本逻辑框架
各模块的属性设置:
source:患者产生的条件。“定义到达通过”选择“速率”。
图 5 source属性设置
速率:每秒钟发生1个人;
间隔时间:每隔多长时间后会产生一个人;
数据库中的到达表:Anylogic自带的数据库;
速率/到达时间表:自定义时间、人数。eg:早上看病的人非常多,到了下午和晚上会比较少。具体操作:“流程建模库”-“时间表”,拖入一个“时间表”,并进行相应属性设置,然后将“source”的“到达通过”与该时间表关联即可。
图 6 速率、到达时间表具体操作方式
inject()函数调用:使用代码控制产生,没有代码则source没有人会产生。
selectOutput:分流。患者可能选择自助机器挂号(queue)或者人工窗口挂号(service)。
以指定概率:有百分之多少的概率会走第一/二条路;
如果条件为真:定义分流的条件。
这里我们使用指定概率,即有50%的人会选择到人工窗口挂号,50%的人选择自助挂号机挂号。
图 7 分流1
路径1
Queue:排队规则
Delay:延迟,即完成一次挂号所需要的时间。我们设置延迟时间为 triangular(0.5,1,1.5),即符合均值为1的三角分布,最多1.5s能完成挂号过程;
容量:1,即一个时间内只能处理1个人的挂号;
图 8 表示挂号过程的delay的设置
直至调用stopDelay含义为:只有发出调动命令时才会被调用,否则一直在队列中。
路径二
service:在这里表示人工窗口挂号。人工窗口挂号应该慢于自助机器挂号,所以将延迟时间设置为:triangular( 0.5, 1, 1.5 )*4。
自带queue和delay,但多了“资源集”概念。资源集:当调用service时,必须通过别的资源的辅助才能完成。Eg.仓储物流中,需要叉车将货运到货架上,即有叉车时才能完成该项服务,若没有叉车则等待。
图 9 人工窗口挂号的设置
在我们的情景中,通过service人工窗口挂号需要工作人员的辅助,所以还需要添加resourcePool。
“面板”–“流程建模库”—“resourcePool”。
图 10 建立resourcePool
定义容量:可自定义设置时间表或轮班,我们这里选择“直接”,容量选择3,即有3个人。然后将resourcePool关联到service中:点击service,选择资源集(替代)下的捕捉按钮,选择resourcepool,即可关联。
图 11 resourcePool关联到service
delay1:内科诊室。假设delay1为内科诊室,相对较慢,延迟时间设置为triangular( 0.5, 1, 1.5 )/分钟,容量设置为1,即每次只能处理一位患者。
图 12 delay1内科诊室设置
delay2:假设delay2为外科诊室,相对较慢,延迟时间设置为triangular( 0.5, 1, 1.5 )*2/分钟,容量设置为1,即每次只能处理一位患者。
图 13 delay2外科诊室设置
基本流程框架搭建完成。
2.2 可视化效果搭建
添加医院的布局、人的动画。
空间标记中的路径、点节点、矩形节点搭建图形,再使用面板-演示-文本,插入说明文本。
图 14 医院基本布局
人工挂号窗口中,矩形节点中的三个小符号是吸引子:如果不使用吸引子,人会乱跑。点击人工窗口挂号中的矩形节点,点击属性中的“吸引子”,在弹出的创建模式中选择“网格”,创建3X1为排列方式的吸引子。
图 15 吸引子设置
选择“面板”–“三维物体”–“超市”,拖入“自动柜员机”作为我们的挂号机器,选择“收银台”插入人工挂号窗口和内科、外科诊室中。
图 16 插入图形
可视化效果图与基本逻辑框架关联:queue与path(自助挂号机路径)相关联;delay与node(自助挂号机点节点)相关联;service与人工窗口的path1(路径)和node1(矩形节点)关联;queue1关联到内科path2,delay1关联到内科node2,queue2同理。
插入三维效果图
“面板”–“演示”–“三维窗口”
图 17 插入三维窗口
添加小人的形象:“Source”–“新智能体”–“创建自定义类型”,命名为“Person”。现在有“Main”和“Person”两个智能体。
图 18 新建Person智能体
对Person加一些参数,以区分不同的患者挂的是内科还是外科:“面板”–“智能体”,拖一个“parameter”进来,重命名为“type”。“type”等于1或2,1为内科,2为外科。
图 19 加入参数type
selectOutput1:分流。当智能体person的type为1时输出到queue1内科。图 20 挂完号的患者被分流到内科和外科
给智能体加入人的形象。“面板”–“三维物体”,选一个小人;添加文本标记,设置文本属性,文本:type的动态值。运行模型,检验是否type=1的人去了内科,type=2的人去了外科。
图 21 加小人
三、数据输出
在Person里添加两个参数:timeStart和timeStay。
source:离开时:agent.timeStart=time(),表示将离开source时的时间赋给timeStart;
sink,进入时:agent.timeStay=time()-agent.timeStart,将从进入到离开时的时间赋给timeStay。
输出excel:即在指定的excel表中能看到每个人的timeStay。
“工程”–右击文件夹–“打开”,打开我们模型存储位置所在的文件夹,新建excel表。
将excel关联到系统里:“面板”–“连接”–“Excel文件”,拖入一个excelFile,对excelFile属性进行设置,关联到刚才新建的excel表格。
添加一个函数row,类型为int,初始值为2.
设置sink,将数据输入到excel中。
agent.timeStay=time()-agent.timeStart;
excelFile.setCellValue(agent.type,1,row,1); 即将type值写入sheet1,第row行,第1列
excelFile.setCellValue(agent.timeStay,1,row,2); 将typeStay值写入sheet1,第row行,第2列
row++ 每写入一行后自动换行输入,这一行最后不加 ;
运行(运行前需先将要导入数据的excel关掉,否则无法运行)。Excel效果如图:
标签:01,窗口,内科,Anylogic,挂号,设置,诊室,type 来源: https://blog.csdn.net/weixin_62605842/article/details/121948828