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

一、基础知识补充

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)])

五、第二问代码求解

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

posted @ 2024-08-04 15:27  卢宇博  阅读(15)  评论(0编辑  收藏  举报