基于蒙特卡洛循环和排队理论的客户结账等待时间模拟优化matlab仿真

简介: 基于蒙特卡洛循环和排队理论的客户结账等待时间模拟优化matlab仿真

1.算法仿真效果
matlab2022a仿真结果如下:
395652742b0742cbc3e171c8556ab239_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

当结账窗口数量为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核心程序

    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];
相关文章
|
3月前
|
数据可视化
基于MATLAB的OFDM调制发射与接收仿真
基于MATLAB的OFDM调制发射与接收仿真
|
2月前
|
5G
基于IEEE 802.11a标准的物理层MATLAB仿真
基于IEEE 802.11a标准的物理层MATLAB仿真
193 0
|
2月前
|
算法
基于MATLAB/Simulink平台搭建同步电机、异步电机和双馈风机仿真模型
基于MATLAB/Simulink平台搭建同步电机、异步电机和双馈风机仿真模型
|
2月前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
2月前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
3月前
|
监控
基于MATLAB/Simulink的单机带负荷仿真系统搭建
使用MATLAB/Simulink平台搭建一个单机带负荷的电力系统仿真模型。该系统包括同步发电机、励磁系统、调速系统、变压器、输电线路以及不同类型的负荷模型。
494 5
|
3月前
|
机器学习/深度学习 边缘计算 算法
【无人机】无人机群在三维环境中的碰撞和静态避障仿真(Matlab代码实现)
【无人机】无人机群在三维环境中的碰撞和静态避障仿真(Matlab代码实现)
206 0
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
272 0
|
2月前
|
算法 定位技术 计算机视觉
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
132 0
|
2月前
|
算法 机器人 计算机视觉
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
118 0

热门文章

最新文章