排队论及其代码


排队论(Queuing Theory)也称随机服务系统理论。
本文主要讨论先到先服务 FCFS的情形,顾客流设定为泊松流(一种非负随机变量的分布)

泊松流

  1. 在不相互重叠的时间区间内,到达顾客数相互独立(无后效性)。
  2. 对于充分小的时间间隔内,到达1个顾客的概率与t无关,仅与时间间隔成正比(平稳性)。
  3. 对于充分小的时间间隔,2个及以上顾客到达的概率可忽略不计(普通性)。

泊松流到达间隔服从负指数分布。

系统运行指标

为了研究排队系统运行的效率,估计其服务质量,确定系统的优参数,评价系统 的结构是否合理并研究其改进的措施,必须确定用以判断系统运行优劣的基本数量指标,这些数量指标通常是:

  1. 平均队长:指系统内顾客数(包括正被服务的顾客与排队等待服务的顾客)的数学期望,记作 L s L_s Ls
  2. 平均排队长:指系统内等待服务的顾客数的数学期望,记作 L q L_q Lq
  3. 平均逗留时间:顾客在系统内逗留时间(包括排队等待的时间和接受服务的时间)的数学期望,记作 W s W_s Ws
  4. 平均等待时间:指一个顾客在排队系统中排队等待时间的数学期望,记作 W q W_q Wq
  5. 平均忙期:指服务机构连续繁忙时间(顾客到达空闲服务机构起,到服务机构再次空闲止的时间)长度的数学期望,记为 T b T_b Tb

单服务台系统

模型的条件是:

  1. 输入过程――顾客源是无限的,顾客到达完全是随机的,单个到来,到达过程服从泊松分布,且是平稳的。
  2. 排队规则――单队,且队长没有限制,先到先服务;
  3. 服务机构――单服务台,服务时间的长短是随机的,服从相同的指数分布。
clear 
clc 
%***************************************** 
%初始化顾客源 
%***************************************** 
%总仿真时间 
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

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;

多服务台系统

此模型与M/M/1模型不同之处在于有S个服务台,各服务台的工作相互独立,服务率相等,如果顾客到达时,S个服务台都忙着,则排成一队等待,先到先服务的单队模型。

% 多服务台模型
% 设顾客单个到达,相继到达时间间隔服从参数为λ 的负指数分布
% 每个服务台的服务时间相互独立,且服从参数为 μ 的负指数分布

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)
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MATLAB是一款非常强大的数学软件,可以用来进行各种科学计算和数据分析。排队论是MATLAB中的一个重要应用领域,可以用来模拟和分析各种排队系统,如MM1排队系统。 以下是一个简单的MATLAB代码示例,用于模拟MM1排队系统: ```matlab % MM1 Queue Simulation % Number of customers to simulate numCustomers = 100; % Inter-arrival times (exponential distribution) interArrivalTimes = exprnd(5, 1, numCustomers); % Service times (exponential distribution) serviceTimes = exprnd(4, 1, numCustomers); % Arrival times arrivalTimes = zeros(1, numCustomers); for i = 2:numCustomers arrivalTimes(i) = arrivalTimes(i-1) + interArrivalTimes(i); end % Service start times serviceStartTimes = zeros(1, numCustomers); for i = 2:numCustomers serviceStartTimes(i) = max(arrivalTimes(i), serviceStartTimes(i-1) + serviceTimes(i-1)); end % Service end times serviceEndTimes = serviceStartTimes + serviceTimes; % Waiting times waitingTimes = serviceStartTimes - arrivalTimes; % Total time in system totalTimes = serviceEndTimes - arrivalTimes; % Average waiting time avgWaitingTime = mean(waitingTimes); % Average total time in system avgTotalTime = mean(totalTimes); disp(['Average waiting time: ' num2str(avgWaitingTime)]); disp(['Average total time in system: ' num2str(avgTotalTime)]); ``` 该代码可以模拟一个包含100个顾客的MM1排队系统,并计算平均等待时间和平均总时间。具体实现过程可以参考代码注释。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值