首页 > 其他分享 >蒙特卡洛模拟(2)————排队问题

蒙特卡洛模拟(2)————排队问题

时间:2024-08-04 15:28:50浏览次数:11  
标签:初始化 服务 排队 客户 时间 模拟 蒙特卡洛 循环

目录

一、基础知识补充

1.normrnd(MU,SIGMA)

生成一个服从正态分布(MU参数代表均值,SIGMA参数代表标准差)的随机数

2.exprnd(M)

表示生成一个均值为M的指数分布随机数(其对应的参数为1/M)

3.tic与toc

tic函数和toc函数可以用来返回代码运行的时间

二、问题提出

三、模型建立

我们可以先自己建立一个表,然后从中找出一些规律,便于我们进行建模

1.引入符号


2.引入符号后,我们可以由题目得到一些递推关系,由这个递推关系做出一个循环进行我们的模拟

(1)下一个客户到达的时间点等于前一个客户到达的时间点加上时间间隔
(2)下一个客户开始服务的时间点等于前一个服务开始服务的时间点加上前一个客户的服务时间
(3)下一个客户开始服务的时间取决于该客户的到达时间和上一个客户服务结束的时间,为两者的最大值

四、第一问代码求解

1.字符初始化

把模型中的符号全部初始化

i = 1;  % i表示第i个客户,最开始取i=1
w = 0;  % w用来表示所有客户等待的总时间,初始化为0
e0 = 0;  c0 = 0;   % 初始化e0和c0为0
x(1) = exprnd(10);  % 第0个客户(假想的)和第1个客户到达的时间间隔
c(1) = c0 + x(1);  % 第1个客户到达的时间
b(1) = c(1); % 第1个客户的开始服务的时间

2.带入模型进行循环

循环的跳出环境为到达8个小时的工作时长,也就是480分钟

while b(i) <= 480  % 开始设置循环,只要第i个顾客开始服务的时间(时刻)小于480,就可以对其服务(银行每天工作8小时,折换为分钟就是480分钟)
    y(i) = normrnd(10,2); % 第i个客户的服务持续时间,服从均值为10方差为4(标准差为2)的正态分布
    if y(i) < 1  % 根据题目的意思:若服务持续时间不足一分钟,则按照一分钟计算
        y(i) = 1;
    end
    e(i) = b(i) + y(i); % 第i个客户结束服务的时间 = 第i个客户开始服务的时间 + 第i个客户的服务持续时间
    wait(i) = b(i) - c(i); % 第i个客户等待的时间 = 第i个客户开始服务的时间 - 第i个客户到达银行的时间
    w = w + wait(i); % 更新所有客户等待的总时间
    i = i + 1; % 增加一名新的客户
    x(i) = exprnd(10); % 这位新客户和上一个客户到达的时间间隔
    c(i) = c(i-1) + x(i); % 这位新客户到达银行的时间 = 上一个客户到达银行的时间 + 这位新客户和上一个客户到达的时间间隔
    b(i) = max(c(i),e(i-1)); % 这个新客户开始服务的时间取决于其到达时间和上一个客户结束服务的时间
end

3.输出结果

n为总服务人数,之所以是i-1是因为我们循环的问题,i是先+1再进行判断是否跳出循环的,因此并没有对最后一名客户进行服务,所以要减少1

n = i-1; % n表示银行一天8小时一共服务的客户人数
t = w/n; % 客户的平均等待时间
disp(['银行一天8小时一共服务的客户人数为: ',num2str(n)])
disp(['客户的平均等待时间为: ',num2str(t)])

五、第二问代码求解

数值模拟具有偶然性,这个问题就是为了让我们增加模拟次数,如果要实现,只需要再循环外面再套一个循环,然后增加一个能够储存每天得到数据的容器,最后求平均即可

标签:初始化,服务,排队,客户,时间,模拟,蒙特卡洛,循环
From: https://www.cnblogs.com/dlmuwxw/p/18330877

相关文章

  • 模拟退火
    接受的概率是\(e^{\frac{\Deltaf}{t}}\times100\%\)代码exp(df/t)*RAND_MAX>rand()\(\Deltaf\)是负数!模板doublet,d=0.999;voidsa(){ for(inti=1;i<=100;i++) { doublef1=fun(); /* 随机乱搞变化状态 生成[-randmax,randmax]的随机数:rand()*2-RAND_MA......
  • 模拟实现strcmp,判断二个字符串是否相等
    1.判断二个字符串是否相等,可以模仿strcmp.当二个字符串相等的时候ruturn0.,当二个字符串小于时返回为小于0,当二个字符串大于时返回为大于0。const为不可以更改。//方法一intmy_strcmp(constchar*arr1,constchar*arr2){ assert(arr1&&arr2); while(*arr1==*arr2)......
  • Day 8.2 NOIP2024 模拟赛 总结
    Day8.2NOIP模拟赛总结T1T1赛时打表输出发现了等差数列的性质(好像不需要打表也能知道),然后我码完T2过后剩不到2个小时了,于是连T3T4暴力都没码就过来推了,但也没推出来,时间倒是耽误了不少,剩一个小时的时候去开始去码后面的暴力了。T2水题一道,做法,性质全给了。只不过比较玄学的......
  • Day 8.1 NOIP2024 模拟赛 总结
    ​Day8.1NOIP2024模拟赛总结T1开赛后首先是码了本题的暴力,想了想之后只是感觉这个结构很像二叉树,然后没有细想,想着先码完后面的暴力再回来。T2Subtask2就是简单推性质,优化一下循环枚举顺序就可以了。当时想Subtask1的时候,本身是考虑枚举每一个点然后暴力向外拓展,时间......
  • 【思科模拟器Packet Tracer的一些操作】你见过这样PacketTracer吗
    你见过这样PacketTracer吗?机柜抓包模拟城域网各位网工朋友应该都用过思科模拟器吧PacketTracer是思科系统开发的一款网络模拟器,用于模拟计算机网络中的设备和网络环境。它可以帮助网络工程师或学生在没有真实设备的情况下学习和实验各种网络配置和协议。Pac......
  • 2024集训8.2模拟赛题解
    考试历程8:30开始考试8:40快速浏览了T1并想了一下,是一道质数的题目,准备打表,打到一半的时候发现空间复杂度会爆,于是改打质数筛暴力了9:30打完T1开始看T2刚开始没思路,先看了T3,跟着样例打了一点,估计可以拿点分吧9:50打完了T3会看T2发现了一点规律(后来知道是错的)跟着思路写了一......
  • NOIP2024模拟赛#2 总结
    NOIP2024模拟赛#2总结老师:比昨天简单不少。得分:\(30+100+20+10=160\),rk5。赛时正序开题,A题很好懂,但是一看数据范围立马寄掉,发现自己只会\(T\le10,r-l+1\le10^5\)这一档暴力,飞快地写了\(30\text{pts}\)跑路。此时大概是8:30。B题题面很长,但是不影响阅读,题面通俗易......
  • 盖世计划--0731--AB班模拟
    今天的题不算难,但是没做出一题,有点失败。A你打完表之后发现并没有什么出色的性质。只能考虑爆搜。代码好写,但是你要分析复杂度。最关键的一点是每一次递归至少多一个\(1\),而\(1\)可以直接return,所以最多递归\(m\)次就够了。#include<bits/stdc++.h>#definepiistd:......
  • 8.1 NOIP 模拟赛总结
    8.1NOIP模拟赛总结T1给你一个含有\(n\)个问号的形如max(?,max(?,min(?,?)))的表达式,将\(1...n\)填入\(n\)个问号中,求表达式一共有多少种可能的答案。首先写的\(10\pts\)的全排列,然后想了一会想不出来,就直接扬了。直接是二叉树,很神奇。T2首先想暴力。发现每回......
  • Day 26 - 模拟赛
    热门景点(hot)题目描述输入格式输出格式\(\text{input1}\)10517409488246628223678\(\text{output1}\)YNYNY数据范围#include<iostream>#include<cstdio>#include<ctime>usingnamespacestd;#defineMAXN5000005intread......