1.算法仿真效果
matlab2022a仿真结果如下:
当结账窗口数量为22时:
到达顾客数:5863
服务顾客数:5863
损失顾客数:0
平均服务时间:0.497495
平均队长:11.661919
平均等待时长:0.000105
顾客不能马上得到服务的概率:0.000020
当结账窗口数量为23时:
到达顾客数:5396
服务顾客数:5396
损失顾客数:0
平均服务时间:0.512294
平均队长:11.050659
平均等待时长:0.000088
顾客不能马上得到服务的概率:0.000415
当结账窗口数量为24时:
到达顾客数:4694
服务顾客数:4694
损失顾客数:0
平均服务时间:0.503239
平均队长:9.437955
平均等待时长:0.000035
顾客不能马上得到服务的概率:0.000080
2.算法涉及理论知识概要
蒙特卡罗法也称统计模拟法、统计试验法。是把概率现象作为研究对象的数值模拟方法。是按抽样调查法求取统计值来推定未知特性量的计算方法。蒙特卡罗是摩纳哥的著名赌城,该法为表明其随机抽样的本质而命名。故适用于对离散系统进行计算仿真试验。在计算仿真中,通过构造一个和系统性能相近似的概率模型,并在数字计算机上进行随机试验,可以模拟系统的随机特性。
蒙特卡罗法 (又称统计试验法)是描述装备运用过程中各种随机现象的基本方法,而且它特别适用于一些解析法难以求解甚至不可能求解的问题,因而在装备效能评估中具有重要地位。
用蒙特卡罗法来描述装备运用过程是1950年美国人约翰逊首先提出的。这种方法能充分体现随机因素对装备运用过程的影响和作用。更确切地反映运用活动的动态过程。在装备效能评估中,常用蒙特卡罗法来确定含有随机因素的效率指标,如发现概率、命中概率、平均毁伤目标数等;模拟随机服务系统中的随机现象并计算其数字特征;对一些复杂的装备运用行动,通过合理的分解,将其简化成一系列前后相连的事件,再对每一事件用随机抽样方法进行模拟,最后达到模拟装备运用活动或运用过程的目的。
蒙特卡罗法的基本思想是:为了求解问题,首先建立一个概率模型或随机过程,使它的参数或数字特征等于问题的解:然后通过对模型或过程的观察或抽样试验来计算这些参数或数字特征,最后给出所求解的近似值。解的精确度用估计值的标准误差来表示。蒙特卡罗法的主要理论基础是概率统计理论,主要手段是随机抽样、统计试验。用蒙特卡罗法求解实际问题的基本步骤为:
(1)根据实际问题的特点.构造简单而又便于实现的概率统计模型.使所求的解恰好是所求问题的概率分布或数学期望;
(2)给出模型中各种不同分布随机变量的抽样方法;
(3)统计处理模拟结果,给出问题解的统计估计值和精度估计值。
在人们的日常生活中常常会碰到拥挤和排队现象。去医院看病、在邮局营业窗口等候服务等,这是有形排队。除了有形排队之外,还有无形的排队,比如,由于上网人数多,网速大大减慢,这也是因为在“排队”。
增加资源,如增加服务窗口,多设几条跑道,网站设备扩容等,可以减少顾客排队现象。但当顾客比较少时,必然会造成资源闲置。
由此可见,增加服务机构,当然可以减少排队现象,但却增加了服务成本;反之,减少服务机构,固然提高了服务机构的利用率,降低了成本,但却增加了顾客的排队等待时间。这是相互矛盾的。
我们把顾客和服务方构成的系统称为排队系统。电信网络中的信息流和信道,上网人员和网站设施等,都是顾客和服务员的系统。由于顾客到达和服务时间都是不确定的,绝大多数排队系统工作于随机状态。因此,研究排队系统的复杂性也就在于它的随机性。排队论利用概率论和随机过程理论,研究排队系统内的服务机构和顾客需求之间的关系,以便在所需的服务质量标准得到充分满足的条件下,服务机构的费用最为经济。这就是排队论研究的目的。
排队论就是试图通过详细的数学分析来回答这些问题:“顾客必须等待多久?”,“队列中有多少顾客?”,“需要多少服务窗口才能消除排队现象?”等。排队论的应用相当广泛,特别是在通信的应用中,最初排队论主要应用在话务理论上,随着通信网的发展,在分析网络的性能,如网络的时延、吞吐量、利用率等都要用到排队理论。
3.MATLAB核心程序
%exprnd生成服从指数lamda分布的随机数 arrive_time=exprnd(lamda); leave_time=[]; current_time=0; L=0; LMax=0; LL=[L]; tt=[current_time]; c=[]; b=[]; e=[]; a_count=0; b_count=0; e_count=0; lamda=1/lamda; mu=1/mu; %循环 while min([arrive_time,leave_time])<T current_time=min([arrive_time,leave_time]); tt=[tt,current_time]; %记录时间序列 if current_time==arrive_time %顾客到达子过程 arrive_time=arrive_time+exprnd(lamda); %刷新顾客到达事件 a_count=a_count+1; %累加到达顾客数 if L<s %有空闲服务台 L=L+1; %更新队长 if L>LMax LMax=L; end b_count=b_count+1; %累加服务顾客数 c=[c,current_time]; %记录顾客到达时间序列 b=[b,current_time]; %记录服务开始时间序列 leave_time=[leave_time,current_time+exprnd(mu)]; %产生新的顾客离开事件 leave_time=sort(leave_time); %离开事件表排序 elseif L<s+k %有空闲等待位 L=L+1; %更新队长 if L>LMax LMax=L; end b_count=b_count+1; %累加服务顾客数 c=[c,current_time]; %记录顾客到达时间序列 else e_count=e_count+1; %累加损失顾客数 end else %顾客离开子过程 leave_time(1)=[]; %从事件表中抹去顾客离开事件 e=[e,current_time]; %记录顾客离开事件序列 if L>s %有顾客等待 L=L-1; %更新队长 if L>LMax LMax=L; end b=[b,current_time]; %记录服务开始时间序列 leave_time=[leave_time,current_time+exprnd(mu)]; leave_time=sort(leave_time); %离开事件表排序 else %无顾客等待 L=L-1; %更新队长 end end LL=[LL,L]; %记录队长序列 end Ws=sum(e-c(1:length(e)))/length(e); Wq=sum(b-c(1:length(b)))/length(b); Wb=sum(e-b(1:length(e)))/length(e); Ls=sum(diff([tt,T]).*LL)/T; Lq=sum(diff([tt,T]).*max(LL-s,0))/T; fprintf('到达顾客数:%d\n',a_count); %到达顾客数 fprintf('服务顾客数:%d\n',b_count); %服务顾客数 fprintf('损失顾客数:%d\n',e_count); %损失顾客数 fprintf('平均服务时间:%f\n',Wb); %平均服务时间 fprintf('平均队长:%f\n',Ls); %平均队长 fprintf('平均等待时长:%f\n',Wq); %平均等待时间 if k~=inf for i=0:LMax p(i+1)=sum((LL==i).*diff([tt,T]))/T; %队长为i的概率 end end P=1-sum(p(1:LMax)); fprintf('顾客不能马上得到服务的概率:%f\n',P); %顾客不能马上得到服务的概率 out=[Ls,Wq,P,e_count];
标签:count,服务,排队,leave,等待时间,matlab,time,顾客,蒙特卡洛 From: https://www.cnblogs.com/51matlab/p/17372851.html