【数学建模】排队论(最优化)

文章目录

  • 一、算法介绍
    • 1.算法介绍
    • 2.模型介绍
  • 二、适用问题
  • 三、算法总结
    • 1.M/M/1排队系统
    • 2.M/M/S排队系统
  • 四、应用场景举例
    • 1.M/M/1排队系统
    • 2.M/M/S排队系统1
    • 2.M/M/S排队系统2
  • 五、MATLAB代码
    • 1.M/M/1
    • 2.M/M/S
  • 六、实际案例
  • 七、论文案例片段(待完善)

排队论主要针对数学建模问题中的一些小的子问题进行求解,如果想直接使用请跳转至——
视频回顾

一、算法介绍

1.算法介绍

 排队论发源于上世纪初。当时美国贝尔电话公司发明了自动电话,以适应日益繁忙的工商业电话通讯需要。这个新发明带来了一个新问题,即通话线路与电话用户呼叫的数量关系应如何妥善解决,这个问题久久未能解决。
 1909年,丹麦的哥本哈根电话公司A. K.埃尔浪(Er lang)在热力学统计平衡概念的启发下解决了这个问题。
 (1)由于顾客到达和服务时间的随机性,现实中的排队现象几乎不可避免;
 (2)排队过程,通常是一个随机过程,排队论又称“随机服务系统理论”
【数学建模】排队论(最优化)_第1张图片

2.模型介绍

  • 排队系统的要素

 (1)顾客输入过程;
【数学建模】排队论(最优化)_第2张图片
 (2)排队结构与排队规则;
【数学建模】排队论(最优化)_第3张图片
 (3)服务机构与服务规则;
【数学建模】排队论(最优化)_第4张图片

  • 服务台(员)为顾客服务的顺序:
    a)先到先服务(FCFS);
    b)后到先服务(LCFS);
    c)随机服务;
    d)优先服务;
  • 到达间隔和服务时间典型分布
    (1)泊松分布M ;
    (2)负指数分布M ;
    (3)k阶爱尔朗分布Ek;
    (4)确定型分布D;
    (5)一般服务时间分布G;
  • 排队模型示例
    ——M/M/1,M/D/1,M/ Ek /1;
    ——M/M/c,M/M/c/∞/m,
    ——M/M/c/N/∞,。。。
    【数学建模】排队论(最优化)_第5张图片
    【数学建模】排队论(最优化)_第6张图片
    【数学建模】排队论(最优化)_第7张图片
  • 评价参数⭐⭐⭐
    ⭐1、队长与排队长
     (1)队长: 系统中的顾客数(n)期望值记为Ls ;
     (2)排队长: 系统中排队等待服务的顾客数;期望值记为Lq
    ⭐2、逗留时间与等待时间
     (1)逗留时间:指一个顾客在系统中的全部停留时间;期望值,记为Ws
     (2)等待时间:指一个顾客在系统中的排队等待时间;期望值,记为Wq
    Ws = Wq + E[服务时间]
    3、其他相关指标
     (1)忙期: 指从顾客到达空闲服务机构起到服务
    机构再次空闲的时间长度;
     (2)忙期服务量:指一个忙期内系统平均完成
    服务的顾客数;
     (3)损失率: 指顾客到达排队系统,未接受服务
    而离去的概率;
    ⭐ (4)服务强度:ρ= λ/sμ;
    【数学建模】排队论(最优化)_第8张图片
    【数学建模】排队论(最优化)_第9张图片
    【数学建模】排队论(最优化)_第10张图片

二、适用问题

  • 排队问题
  • 例如:
  1. 【数学建模】排队论(最优化)_第11张图片

三、算法总结

1.M/M/1排队系统

【数学建模】排队论(最优化)_第12张图片
【数学建模】排队论(最优化)_第13张图片

2.M/M/S排队系统

【数学建模】排队论(最优化)_第14张图片
【数学建模】排队论(最优化)_第15张图片
【数学建模】排队论(最优化)_第16张图片

四、应用场景举例

1.M/M/1排队系统

【数学建模】排队论(最优化)_第17张图片
【数学建模】排队论(最优化)_第18张图片
【数学建模】排队论(最优化)_第19张图片

2.M/M/S排队系统1

【数学建模】排队论(最优化)_第20张图片
【数学建模】排队论(最优化)_第21张图片

2.M/M/S排队系统2

【数学建模】排队论(最优化)_第22张图片
【数学建模】排队论(最优化)_第23张图片

五、MATLAB代码

1.M/M/1

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

2009.1516

%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;

2.M/M/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)

六、实际案例


七、论文案例片段(待完善)

你可能感兴趣的:(MATLAB学习笔记)