【排队模拟火爆的CCNU新店——吾家吾锅】

撰文背景

俗话说新学期新气象CCNU南湖校区二楼食堂也有了改朝换代的店铺革新!笔者对于新开的几家餐饮店都有过初步的尝试,整体感觉不错,但是其中最大的黑马——“吾家吾锅”可谓是每天中午排得一个人山人海呐!

笔者和FZ同学两人一起去浅浅地排过一次队,笔者点的咖喱鸡排饭,FZ同学点的黑胡椒肥牛饭都让我们大块朵颐了一番。但是笔者仍然觉得排得太久了一点,所以经过了几次排队体验,笔者想看看吾家吾锅到底可以在一天满足多少人的需求?这也就是模拟排队的想法缘起。

大家感兴趣的可以去了解更多关于运筹学和排队论的基本知识,笔者只是运用模型,不会涉及其他术语分析。

笔者简介:CCNU计科,喜欢日漫唱歌看球和弹钢琴,以及梅老板。

排队模型建立

根据多番的实地考察,笔者可以以最简单的篇幅画出吾家吾锅的排队示意图如下:
在这里插入图片描述

笔者和FZ同学要先通过收银台去点菜取号,然后再次前往另一条队伍去等待铁板上餐。所以要排两条队,笔者曾经记过自己等到取号的时候花费的时间是10分钟,由此我们做出以下假设:

1.假设吾家吾锅的营业时间为上午11:00到下午2:00,下午4:30到晚上8:30共7个小时

2.假设同学们到来的时间间隔按正态分布随机数随机产生,通过10000次随机产生的结果如下:(均值为2,方差为0.5的表达

在这里插入图片描述
3.假设对一个同学的服务时间也满足正态分布,并且我们考虑将两条队列看成一条队列对待,其中对一个人满足均值为10方差为0.2的正态分布。

4.我们暂且考虑每个时段到来的人数是均匀分布的,不存在一个时段人特多的情况。

5.没有插队现象出现,大家都按部就班地排队。

通过以上合理假设,我们暂时设计出了最基础的模拟排队模型。下面我们将进行简单的模拟。

模拟排队的原理

在这里插入图片描述
以银行客户为例,我们通过上面的一个手画的图像简单介绍一下排队中出现的一些简单术语和情况。

我们引入下列变量:
1.ci : 第i个客户到达时间。
2.bi : 第i个客户开始服务的时间。
3.ei:第i个客户服务结束时间。

4.w: 一天所有人的总等待时间。
5.wait(i): 平均每个人的等待时间。

6.xi: 第i-1个客户和第i个客户到达的间隔时间。
7.yi: 第i个客户的服务持续时间。

那你要说了,这是怎样运作的呢?所以,我们从案例图画入手,假设客户1号在5分钟时到达,这个时候服务台就可以开始为1号进行服务。1号结束服务时间在第8分钟,仍然有很长一段时间等待下一个客户到来。
在这里插入图片描述
第13分钟2号客户到来了,他也可以直接开始服务,但是对他服务的时间比较长,有10分钟的时间,这个时候在第21分钟,3号客户到来了,因为2号客户还在进行服务,所以3号要等到第23分钟的时候再开始服务。

所以我们可以看到,对于一个人来说,我们更看重的是当前者之前正在进行服务者开始服务的时间差异。要是你在前一个人正在服务的时候到来,那么你需要等待一段时间才能开始服务。于是我们列出下列表达式:

Ci = Ci-1 + xi ( 初始值 C0 = 0 )
ei = bi + yi ( 初始值e0 = 0 )
bi = max( ci , ei-1 ) ( 初始值b1 = c1 )

当我们知道如上的情况后就可以着手于模拟排队了

简单的模拟:排一天

我们基于先前的假设,利用MATLAB编写程序,代码如下:

i=1;
w=0;
e0=0;
c0=0;
x(1)=normrnd(2,0.5);%下一位同学到来的时间间隔(单位:分钟)
c(1)=c0+x(1);
b(1)=c(1);%第一个到的,可以直接进入取餐的队伍
while b(i)<=420%吾家吾锅窗口一天营业7小时
y(i)=normrnd(2,0.2);%对第i位同学的服务时间
e(i)=b(i)+y(i);%第i位同学的服务结束时间
wait(i)=b(i)-c(i);%第i位同学的等待时间
w=w+wait(i);%所有同学的等待时间累加
i=i+1;%下一位
x(i)=normrnd(2,0.5);%下一位的间隔时间
c(i)=c(i-1)+x(i);%下一位的到达时间
b(i)=max(e(i-1),c(i));%下一位的开始时间(结合上述表达式理解)
end
n = i-1; % n表示一天8小时一共服务的客户人数
t = w/n; % 学生的平均等待时间
disp(['吾家吾锅一天7小时营业一共服务的学生人数为: ',num2str(n)])
disp(['学生的平均等待时间为: ',num2str(t)])
 t=[(1:length(b))];
 tt=[(1:length(e))];
 plot(t,b,'--r',t,c,'--b',tt,e,'--g','LineWidth',1.5)
legend('开始时间','到达时间','结束时间')
title("吾家吾锅一天7小时营业接待同学的开始时间到达时间结束时间")
xlabel('顾客数量');
ylabel('时间');

由于是蒙特卡洛模拟的形式,每次的结果随机且不尽相同,但是大致答案取值范围是相近的。我们可以得到下列图表:

在这里插入图片描述
我们可以发现,随着顾客数量增加,到达时间和开始时间的差距将逐渐增大,并且吾家吾锅一天7小时营业一共服务的学生人数大致为209人次,但是,我们对于时间的处理是无差异化的,也就是说实际上有的时间段可能会十分十分忙碌!!!

排队的模拟模型能否进一步改进呢?

修改时间段后:模拟一天排队

在这里插入图片描述
我们尝试让时间动起来:假设每个时间段的人流量(时间间隔衡量)和服务效率 (每一个同学的服务时间)都有一定的变化,且满足上述图像的表达方式,我们可以给出表格如下:(其中normrnd为均值和方差的正态分布随机数表达式)

时间间隔每一个同学的服务时间
normrnd(2,0.5) 【第1小时】normrnd(2,0.2)
normrnd(0.7,0.05) 【第2-3小时】normrnd(1,0.2)
normrnd(10,0.5) 【第4小时】normrnd(10,0.2)
normrnd(0.8,0.1) 【第5-6小时】normrnd(1.2,0.2)
normrnd(10,0.5)【第7小时】normrnd(8,0.2)

然后我们可以得到相应的折线图如下:
在这里插入图片描述
其中标出的四个转折点分别对应我们假设时间段的改变位置。并且我们可以大致知道修改时间段后的结果为
吾家吾锅一天7小时营业一共服务的学生人数为: 272人次
学生的平均等待时间为: 16.9186分钟
在这里插入图片描述
我们可以看出在第1小时阶段到达时间和开始时间差距不大,随着人流量逐渐增加到达时间和开始时间逐渐拉开距离,最后到打烊阶段到达时间和开始时间基本维持一致。较为贴切实际,只是说其中正态分布随机数的参数需要根据实验(多排几次队来确认)确定。

修改时间段的MATLAB代码将在代码区全部展示

至此模拟的排队模型可以告一段落了!

代码区

 i=1;
w=0;
e0=0;
c0=0;
x(1)=normrnd(2,0.5);%下一位同学到来的时间间隔(单位:分钟)
c(1)=c0+x(1);
b(1)=c(1);%第一个到的,可以直接进入取餐的队伍
while b(i)<=60%吾家吾锅窗口一天营业第1小时
y(i)=normrnd(2,0.2);%对第i位同学的服务时间
e(i)=b(i)+y(i);%第i位同学的服务结束时间
wait(i)=b(i)-c(i);%第i位同学的等待时间
w=w+wait(i);%所有同学的等待时间累加
i=i+1;%下一位
x(i)=normrnd(2,0.5);%下一位的间隔时间
c(i)=c(i-1)+x(i);%下一位的到达时间
b(i)=max(e(i-1),c(i));%下一位的开始时间(结合上述表达式理解)
end

x(i)=normrnd(0.7,0.05);%下一位同学到来的时间间隔(单位:分钟)
c(i)=c(i-1)+x(i);
b(i)=c(i);%第一个到的,可以直接进入取餐的队伍
while b(i)<=180%吾家吾锅窗口一天营业2-3小时
y(i)=normrnd(1,0.2);%对第i位同学的服务时间
e(i)=b(i)+y(i);%第i位同学的服务结束时间
wait(i)=b(i)-c(i);%第i位同学的等待时间
w=w+wait(i);%所有同学的等待时间累加
i=i+1;%下一位
x(i)=normrnd(0.7,0.05);%下一位的间隔时间
c(i)=c(i-1)+x(i);%下一位的到达时间
b(i)=max(e(i-1),c(i));%下一位的开始时间(结合上述表达式理解)
end

x(i)=normrnd(10,0.5);%下一位同学到来的时间间隔(单位:分钟)
c(i)=c(i-1)+x(i);
b(i)=c(i);%第一个到的,可以直接进入取餐的队伍
while b(i)<=240%吾家吾锅窗口一天营业第4小时
y(i)=normrnd(10,0.2);%对第i位同学的服务时间
e(i)=b(i)+y(i);%第i位同学的服务结束时间
wait(i)=b(i)-c(i);%第i位同学的等待时间
w=w+wait(i);%所有同学的等待时间累加
i=i+1;%下一位
x(i)=normrnd(10,0.5);%下一位的间隔时间
c(i)=c(i-1)+x(i);%下一位的到达时间
b(i)=max(e(i-1),c(i));%下一位的开始时间(结合上述表达式理解)
end

x(i)=normrnd(0.8,0.1);%下一位同学到来的时间间隔(单位:分钟)
c(i)=c(i-1)+x(i);
b(i)=c(i);%第一个到的,可以直接进入取餐的队伍
while b(i)<=360%吾家吾锅窗口一天营业5-6小时
y(i)=normrnd(1.2,0.2);%对第i位同学的服务时间
e(i)=b(i)+y(i);%第i位同学的服务结束时间
wait(i)=b(i)-c(i);%第i位同学的等待时间
w=w+wait(i);%所有同学的等待时间累加
i=i+1;%下一位
x(i)=normrnd(0.8,0.1);%下一位的间隔时间
c(i)=c(i-1)+x(i);%下一位的到达时间
b(i)=max(e(i-1),c(i));%下一位的开始时间(结合上述表达式理解)
end


x(i)=normrnd(10,0.5);%下一位同学到来的时间间隔(单位:分钟)
c(i)=c(i-1)+x(i);
b(i)=c(i);%第一个到的,可以直接进入取餐的队伍
while b(i)<=420%吾家吾锅窗口一天营业第7小时
y(i)=normrnd(8,0.2);%对第i位同学的服务时间
e(i)=b(i)+y(i);%第i位同学的服务结束时间
wait(i)=b(i)-c(i);%第i位同学的等待时间
w=w+wait(i);%所有同学的等待时间累加
i=i+1;%下一位
x(i)=normrnd(10,0.5);%下一位的间隔时间
c(i)=c(i-1)+x(i);%下一位的到达时间
b(i)=max(e(i-1),c(i));%下一位的开始时间(结合上述表达式理解)
end

n = i-1; % n表示一天7小时一共服务的客户人数
t = w/n; % 学生的平均等待时间
disp(['吾家吾锅一天7小时营业一共服务的学生人数为: ',num2str(n)])
disp(['学生的平均等待时间为: ',num2str(t)])
 t=[(1:length(b))];
 tt=[(1:length(e))];
 plot(t,b,'--r',t,c,'--b',tt,e,'--g','LineWidth',1.5)
legend('开始时间','到达时间','结束时间')
title("吾家吾锅一天7小时营业接待同学的开始时间到达时间结束时间")
xlabel('顾客数量');
ylabel('时间');
grid on
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值