数模(08)---排队论

matlab---排队论

    • 模型背景
    • 模型介绍
    • M/M/1 排队系统
    • M/M/1 模型举例
    • M/M/S 排队系统
    • M/M/S 模型举例
    • 附M/M/1第二种实现代码

模型背景

       排队现象
数模(08)---排队论_第1张图片

模型介绍

数模(08)---排队论_第2张图片
数模(08)---排队论_第3张图片
数模(08)---排队论_第4张图片
数模(08)---排队论_第5张图片
数模(08)---排队论_第6张图片
数模(08)---排队论_第7张图片
数模(08)---排队论_第8张图片
数模(08)---排队论_第9张图片
数模(08)---排队论_第10张图片
数模(08)---排队论_第11张图片
数模(08)---排队论_第12张图片
数模(08)---排队论_第13张图片
数模(08)---排队论_第14张图片
数模(08)---排队论_第15张图片
       其中 λ 表示单位时间内到达顾客的强度。u表示单位时间内服务的强度,s表示服务台个数。
数模(08)---排队论_第16张图片
数模(08)---排队论_第17张图片
数模(08)---排队论_第18张图片

M/M/1 排队系统

数模(08)---排队论_第19张图片
数模(08)---排队论_第20张图片

M/M/1 模型举例

数模(08)---排队论_第21张图片
       P=λ /us(此处s为1,因为是单服务台),一定是单队,单服务台。
数模(08)---排队论_第22张图片
数模(08)---排队论_第23张图片

M/M/S 排队系统

数模(08)---排队论_第24张图片
       n队n个服务系统,可以转换成1队1个服务系统来对待;不过此时的λ一定要改变。
数模(08)---排队论_第25张图片
数模(08)---排队论_第26张图片

M/M/S 模型举例

数模(08)---排队论_第27张图片
数模(08)---排队论_第28张图片
       下面用代码实现:

s=2;
mu=4;
lambda=3;
ro=lambda/mu
ros=ro/s;
sum1=0;
 
for i=0:(s-1)
    sum1=sum1+ro.^i/factorial(i);
end
 
sum2=ro.^s/factorial(s)/(1-ros);
p0=1/(sum1+sum2);
p=ro.^s.*p0/factorial(s)/(1-ros);
Lq=p.*ros/(1-ros);
L=Lq+ro;
W=L/lambda;
Wq=Lq/lambda;
fprintf('排队等待的平均人数为%5.2f人\n',Lq)
fprintf('系统内平均人数为%5.2f人\n',L)
fprintf('平均逗留时间为%5.2f分钟\n',W*60)
fprintf('平均等待时间为%5.2f分钟\n',Wq*60)

       当我们遇到相似问题时,只需要修改代码的前3行就可以。

数模(08)---排队论_第29张图片
数模(08)---排队论_第30张图片
       当我们用代码进行实现时,只需要修改s,lambda,mu即可。

附M/M/1第二种实现代码

       上面的代码能显示结果,下面的能够体现等待时间和到达时间等过程,而且你可以改变三个值,根据到达时间和等待时间的图可以知道最佳的服务台个数,服务强度等。下面附另一种实现代码:

Paidui2.m
% 只需要修改总仿真时间和lambda和mu的值即可
%初始化顾客源
%总仿真时间
Total_time = 10;
%队列最大长度
N= 10000000000;
%到达率与服务率
lambda = 10;
mu = 6;
%平均到达时间和平均服务时间
arr_mean = 1/lambda;
ser_mean = 1/mu;
arr_num = round(Total_time*lambda*2);
events = [];
%按负指数分布产生各顾客到达时间间隔
events(1,:) = exprnd(arr_mean,1,arr_num);
%各顾客的到达时刻等于时间间隔的累积和
events(1,:) = cumsum(events(1,:));
%按负指数分布产生各顾客服务时间
events(2,:) = exprnd(ser_mean,1,arr_num);
%计算仿真顾客个数,即到达时刻在仿真时间内的顾客数
len_sim = sum(events(1,:))<= Total_time;
%******************************
%计算第1个顾客的信息
%1个顾客进入系统后直接接受服务,无需等待
events(3,1) = 0;
%其离开时刻等于其到达时刻与服务时间之和
events(4,1) = events(1,1)+events(2,1);
%其肯定被系统接纳,此时系统内共有1个顾客,故标志位置1
events(5,1) = 1;
%其进入系统后,系统内已有成员序号为1
member = [1];
for i = 2:arr_num
    %如果第i个顾客的到达时间超过了仿真时间,则跳出循环
    if events(1,i) > Total_time
        break;
    else
        number = sum(events(4,member) > events(1,i));
        %如果系统已满,则系统拒绝第i个顾客,其标志位置0
        if number >= N+1
            events(5,i) = 0;
            %如果系统为空,则第i个顾客直接接受服务
        else
            if number == 0
                %其等待时间为0
                %PROGRAMLANGUAGEPROGRAMLANGUAGE
                events(3,i) = 0;
                % 其离开时刻等于到达时刻与服务时间之和
                events(4,i) = events(1,i) + events(2,i);
                %其标志位置1
                events(5,i) = 1;
                member = [member,i];
                %如果系统有顾客正在接受服务,且系统等待队列未满,则第i个顾客进入系统
                
            else
                len_mem = length(member);
                %其等待时间等于队列中前一个顾客的离开时刻减去其到达时刻
                events(3,i) = events(4,member(len_mem))-events(1,i);
                %其离开时刻等于队列中前一个顾客的离开时刻加上其服务时间
                events(4,i) = events(4,member(len_mem))+events(2,i);
                %标识位表示其进入系统后,系统内共有的顾客数
                events(5,i) = number + 1;
                member = [member,i];
            end
        end
    end
end
%仿真结束时,进入系统的总顾客数
len_mem = length(member);
%******************
%输出结果
%绘制在仿真时间内,进入系统的所有顾客的到达时间和离开时刻曲线图(stairs.绘制二阶阶梯图)
stairs([0 events(1,member)],0:len_mem);
hold on;
stairs([0 events(4,member)],0:len_mem,'.-r');
legend('到达时间','离开时间');
hold off;
grid on;
%绘制在仿真时间内,进入系统的所有顾客的停留时间和等待时间曲线图(plot:绘制二维曲线图)
figure;
plot(1:len_mem,events(3,member),'r-*',1:len_mem,events(2,member)+events(3,member),'k-');
legend('等待时间','停留时间');
grid on;

你可能感兴趣的:(数学建模)