排队论经典程序MM1代码
MM1模型
分组到达时间不是独立和指数分布的,而是一群一群地到达的(即分组有成群的特性)。
而用户发起访问某种网络资源的行为具有独立、随机的泊松特性,即会话到达过程仍服从泊松分布。
通常,网络性能评估的第一步是先进行理论上的评估,而这需要以一种较好的分析模型和分析方法为基础。
被广泛应用的排队论模型是用于分析网络性能最经典的理论之一。
其中,
M/M/1模型是分析分组交换网络性能的主要模型。
当使用M/M/1排队论模型分析网络性能时,
每个资源的利用率ρ=λ/μ,其中λ表示单位时间内到达的分组数,μ表示该资源单位时间内能够完成的分组数;每个处理中的平均分组数l=ρ/(1-ρ)= λ/(λ-μ);
平均系统时间S=1/(μ-λ);
每个处理的平均等待时间W=ρ/(μ-λ)
从这些计算各种性能指标的公可知,对结果影响最大的参数是分组平均到达率λ。
mm1n排队论模型参数
mm1n排队论模型参数
M/M/1 排队论模型是一种简单的排队系统模型,用于分析单一服务台、顾客到达服从泊松分布、服务时间服从指数分布的系统。
在M/M/1 模型中,有三个主要参数:
1. 到达率(λ):表示单位时间内到达系统的顾客数的期望值,服从参数为λ的泊松分布。
到达率决定了系统中的顾客数量变化速率。
2. 服务率(μ):表示单位时间内一个顾客被服务完成的期望值,服从参数为μ的指数分布。
服务率决定了系统中顾客等待服务的速度。
3. 顾客到达和服务时间是独立的:这个条件表明顾客的到达和服务的完成之间没有影响,使得模型更具有现实意义。
通过平衡方程法,可以对M/M/1 模型进行稳态分析,计算出以下几个重要性质:
1. 队长(Ls):表示系统中的顾客数(n)的期望值。
2. 排队长(Lq):表示系统中排队等待服务的顾客数(n)的期望值。
3. 逗留时间(Ws):指一个顾客在系统中的全部停留时间,为期望值。
4. 等待时间(Wq):指顾客在系统中等待服务的時間,为期望值。
了解这些参数后,可以对M/M/1 模型进行评估和优化,以提高系统的效率和服务质量。
M/M/1 模型虽然简单,但在实际应用中具有广泛的价值,如电话交换系统、计算机网络、银行窗口等。
掌握M/M/1 模型的基本原理和分析方法对于学习排队论和实际应用具有重要意义。
排队模型掌握mm1,mmc,mm1k ppt课件
GI——一般相互独立的时间间隔分布
G——一般服务时间分布
四、排队模型的数量指标
1、平均队长(Ls): 指在系统中的顾客数(包括正被服务的顾客 和排队等待的顾客)的期望值。 2、平均排队长(Lq): 指系统中排队等候服务的顾客数的期望值。
Ls=Lq+正被服务的顾客数 3、平均逗留时间(Ws):指一个顾客在系统中的停留时间期望值。
4、平均等待时间(Wq):指一个顾客在系统中排队等待的时间的期望值。 Ws=Wq+服务时间
5、忙期:指从顾客到达空闲服务机构起到服务机构再次空闲止 这段时间长度,即服务机构连续繁忙的时间长度。
6、系统的状态概率[Pn( t )] :指系统中的顾客数为n的概率。
7、稳定状态:limPn(t)→Pn
四、排队模型的数量指标
排队模型
凯里学院 余英
模型要点
1、掌握排队模型的基本概念 2、了解常见的分布函数及生灭过程 3、掌握典型排队系统模型的结构及应用
排队模型的基本概念
一、引言 1、什么是排队模型(排队论)? 排队论是研究拥挤现象的一门学科。
它是在研究各种排队系统概率规律性的基础上, 解决有关排队系统的最优化设计(静态)和最 优控制(动态)问题。
的,它们之间可以是平行排列(并列)的,也可以 是前后排列(串列)的,也可以是混合的; b、服务时间可以是确定的,也可以是随机的,对于 后者要知道它的概率分布; c、服务时间可以是平稳的,也可以是非平稳的,我 们研究前者; d、对于等待制,服务规则又可以分为先到先服务 (FCFS),后到先服务(LCFS),随机服务和有 优先权的服务。
二、排队系统的特征及其组成
1、排队系统的特征即拥挤现象的共性 1)、有请求服务的人或物 2)、有为顾客服务的人或物 3)、具有随机性 4)、服务的数量超过服务机构的容量
3.3 MMm型排队系统
P Q 1 p0
系统中的平均用户数N
N npn np (1 )
n n 0 n 0
1
* 掌握
平均时延T,平均等待时延W ,系统中的平均排队队长NQ
1 T
N
W T
1
NQ W . 1
没有第四个字母,则表示系统的容量是无限大的。
2015-3-25 3
第三章 内容概述
3.1 Little定理 3.2 数学基础 3.3 M/M/m型排队系统
– –
3.3.1 M/M/1排队系统 3.3.2 M/M/m排队系统
3.4 M/G/1型排队系统 3.5 排队网络
2015-3-25
331mm1型排队系统8331mm1型排队系统8将一个高速信道分解为k个低速信道之后传输201552513第三章内容概述31little定理32数学基础33mmm型排队系统331mm1排队系统332mmm排队系统34mg1型排队系统35排队网络201552514332mmm型排队系统1332mmm型排队系统1mmm排队系统的示意图如图所示
4
3.3.1 M/M/1型排队系统 (1)
M/M/1排队系统的示意图如图所示:
到达过程为Poisson过程,到达率为λ; 服务员的数目为1,到达过程与服务过程相互独立。
服务过程为指数过程,服务速率为μ(平均服务时间
为1/μ)。
系统允许排队的队长可以是无限的(系统的缓存容量
无限大); λ
k 分解信道之后平均分组数和平均时延为: k ' ' N T kT
may排队论--将MM1类型的理论和习题自己多看看
P0
1
1 N1
1
2 3
1
2 3
6
0.356
e (1 PN ) (1 N P0 ) 4 1
2 3
5 0.356
3.808
L
(N 1)N1
2 3
(5 1)
2 3
6
2 0.577 1.423
1 1 N1
1
2 3
1
2 3
6
Lq
L e
1.423 3.808 6
顾客到达
进入队列
...
因队列满而离去
服务台
顾客接受服务后离去
...
系统的状态转移图
系统的状态概率平衡方程
对于状态0: … 对于状态k: … 对于状态N:
P0=P1 …
Pk-1+Pk+1=(+)Pk …
PN-1=PN
0<k<N
系统的状态概
率
Pk
Pk 1
k P0
k 1,2, , N
由
N
Pk 1
Sn t +t时刻
Pn(t t) Pn(t)(1t)(1 t) Pn1(t)t(1 t) Pn1(t)(1t)t o(t)
Pn
(t
t) t
Pn
(t)
Pn
(t
)(
)
Pn1(t
)
Pn1(t)
o(t) t
令t 0得:
dP0 (t)
dt dPn (t)
dt
P0 Pn
(t) P1(t) (t)( ) Pn1(t)
动态
即与特定顾 客特征选择
等待的 顾客数
协商
优先级
MM1排队系统仿真matlab实验报告
M/M/1排队系统实验报告一、实验目的本次实验要求实现M/M/1单窗口无限排队系统的系统仿真,利用事件调度法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比。
二、实验原理根据排队论的知识我们知道,排队系统的分类是根据该系统中的顾客到达模式、服务模式、服务员数量以及服务规则等因素决定的。
1、 顾客到达模式设到达过程是一个参数为λ的Poisson 过程,则长度为t 的时间内到达k 个呼叫的概率 服从Poisson 分布,即etkk k t t p λλ-=!)()(,⋅⋅⋅⋅⋅⋅⋅⋅⋅=,2,1,0k ,其中λ>0为一常数,表示了平均到达率或Poisson 呼叫流的强度。
2、 服务模式设每个呼叫的持续时间为i τ,服从参数为μ的负指数分布,即其分布函数为{}1,0t P X t e t μ-<=-≥3、 服务规则先进先服务的规则(FIFO ) 4、 理论分析结果在该M/M/1系统中,设λρμ=,则稳态时的平均等待队长为1Q ρλρ=-,顾客的平均等待时间为T ρμλ=-。
三、实验内容M/M/1排队系统:实现了当顾客到达分布服从负指数分布,系统服务时间也服从负指数分布,单服务台系统,单队排队,按FIFO (先入先出队列)方式服务。
四、采用的语言MatLab 语言 源代码:clear; clc;%M/M/1排队系统仿真SimTotal=input('请输入仿真顾客总数SimTotal='); %仿真顾客总数;Lambda=0.4; %到达率Lambda;Mu=0.9; %服务率Mu;t_Arrive=zeros(1,SimTotal);t_Leave=zeros(1,SimTotal);ArriveNum=zeros(1,SimTotal);LeaveNum=zeros(1,SimTotal);Interval_Arrive=-log(rand(1,SimTotal))/Lambda;%到达时间间隔Interval_Serve=-log(rand(1,SimTotal))/Mu;%服务时间t_Arrive(1)=Interval_Arrive(1);%顾客到达时间ArriveNum(1)=1;for i=2:SimTotalt_Arrive(i)=t_Arrive(i-1)+Interval_Arrive(i);ArriveNum(i)=i;endt_Leave(1)=t_Arrive(1)+Interval_Serve(1);%顾客离开时间LeaveNum(1)=1;for i=2:SimTotalif t_Leave(i-1)<t_Arrive(i)t_Leave(i)=t_Arrive(i)+Interval_Serve(i);elset_Leave(i)=t_Leave(i-1)+Interval_Serve(i);endLeaveNum(i)=i;endt_Wait=t_Leave-t_Arrive; %各顾客在系统中的等待时间t_Wait_avg=mean(t_Wait);t_Queue=t_Wait-Interval_Serve;%各顾客在系统中的排队时间t_Queue_avg=mean(t_Queue);Timepoint=[t_Arrive,t_Leave];%系统中顾客数随时间的变化Timepoint=sort(Timepoint);ArriveFlag=zeros(size(Timepoint));%到达时间标志CusNum=zeros(size(Timepoint));temp=2;CusNum(1)=1;for i=2:length(Timepoint)if (temp<=length(t_Arrive))&&(Timepoint(i)==t_Arrive(temp)) CusNum(i)=CusNum(i-1)+1;temp=temp+1;ArriveFlag(i)=1;elseCusNum(i)=CusNum(i-1)-1;endend%系统中平均顾客数计算Time_interval=zeros(size(Timepoint));Time_interval(1)=t_Arrive(1);for i=2:length(Timepoint)Time_interval(i)=Timepoint(i)-Timepoint(i-1);endCusNum_fromStart=[0 CusNum];CusNum_avg=sum(CusNum_fromStart.*[Time_interval 0] )/Timepoint(end);QueLength=zeros(size(CusNum));for i=1:length(CusNum)if CusNum(i)>=2QueLength(i)=CusNum(i)-1;elseQueLength(i)=0;endendQueLength_avg=sum([0 QueLength].*[Time_interval 0] )/Timepoint(end);%系统平均等待队长%仿真图figure(1);set(1,'position',[0,0,1000,700]);subplot(2,2,1);title('各顾客到达时间和离去时间');stairs([0 ArriveNum],[0 t_Arrive],'b');hold on;stairs([0 LeaveNum],[0 t_Leave],'y');legend('到达时间','离去时间');hold off;subplot(2,2,2);stairs(Timepoint,CusNum,'b')title('系统等待队长分布');xlabel('时间');ylabel('队长');subplot(2,2,3);title('各顾客在系统中的排队时间和等待时间');stairs([0 ArriveNum],[0 t_Queue],'b');hold on;stairs([0 LeaveNum],[0 t_Wait],'y');hold off;legend('排队时间','等待时间');%仿真值与理论值比较disp(['理论平均等待时间t_Wait_avg=',num2str(1/(Mu-Lambda))]);disp(['理论平均排队时间t_Wait_avg=',num2str(Lambda/(Mu*(Mu-Lambda)))]);disp(['理论系统中平均顾客数=',num2str(Lambda/(Mu-Lambda))]);disp(['理论系统中平均等待队长=',num2str(Lambda*Lambda/(Mu*(Mu-Lambda)))]);disp(['仿真平均等待时间t_Wait_avg=',num2str(t_Wait_avg)])disp(['仿真平均排队时间t_Queue_avg=',num2str(t_Queue_avg)])disp(['仿真系统中平均顾客数=',num2str(CusNum_avg)]);disp(['仿真系统中平均等待队长=',num2str(QueLength_avg)]);五、数据结构1.仿真设计算法(主要函数)利用负指数分布与泊松过程的关系,产生符合泊松过程的顾客流,产生符合负指数分布的随机变量作为每个顾客的服务时间:Interval_Arrive=-log(rand(1,SimTotal))/Lambda;%到达时间间隔,结果与调用exprnd(1/Lambda,m)函数产生的结果相同Interval_Serve=-log(rand(1,SimTotal))/Mu;%服务时间间隔t_Arrive(1)=Interval_Arrive(1);%顾客到达时间时间计算t_Wait=t_Leave-t_Arrive;%各顾客在系统中的等待时间t_Queue=t_Wait-Interval_Serve; %各顾客在系统中的排队时间由事件来触发仿真时钟的不断推进。
排队模型(掌握mm1,mmc,mm1k)
Pn(t+Δt)= Pn(t)(1-λΔt )+Pn-1(t)λΔt+ o(Δt) [Pn(t+Δt)-Pn(t)]/Δt =-λPn(t)+λPn-1(t)+[o(Δt)]/Δt
令Δt0
d Pn(t)/dt= -λPn(t) +λPn-1(t)
Pn(0)=0
(n1)
d P0(t)/dt= -λP0(t)
T= v1+v2+...+ vk 服从k阶爱尔朗分布。
五、常见的分布函数及生灭过程
5、生灭过程 定义:设{N(t),t≥0}为一随机过程,若N(t)的概
率分布具有以下性质: a、假设N(t)=n,则从时刻t起到下一个顾客到达时刻 止的时间服从参数为λn的负指数分布,n=0,1,2,… b、假设假设N(t)=n,则从时刻t起到下一个顾客离 去时刻止的时间服从参数为μn的负指数分布, n=0,1,2,… c、同一时刻时只有一个顾客到达或离去。 则称{N(t),t≥0}为一个生灭过程。
…
…
n-1
pn =λn-1pn-1/μn+(μn-1pn-1- pn-2λn-2)/μn
=p0λn-2λn-1…λ0/(μnμn-1…μ1)
n
p3 =λnpn/μn+1+(μnpn- pn-1λn-1)/μn+1
=p0λnλn-1…λ0/(μn+1μn…μ1)
五、常见的分布函数及生灭过程
记
cn
n 1 n2...0 n n1...0
平均服务率: 41/127=0.32(人/分钟)
六、典型排队系统模型的结构及应用
M/M/C等待制排队模型研究要点: a、系统意义 b、状态转移速度图与状态转移速度矩阵 c、状态概率方程 d、系统的基本数量指标
第六章 排队论
对于S0
1P10P0
Pt0 h t Ph t0
t0
Ph
t t0 Ph Ph t0
t0
1
e (tt0 ) (1 e 1 (1 e t0 )
t0
)
1
e
t
Q .E.D
21
6.3.3 小结
• 如果顾客的到达过程服从最简单流,则顾客单 位时间内的到达数服从泊松分布。
• 如果顾客的到达过程服从最简单流,则顾客到 达的时间间隔服从负指数分布。
iP iiP i (ii)P i
转入率的期望值为
P P i1i1 i1i1
λ0
λ1
λ2
λi-2
λi-1
λi
λi+1
λk-2
λk-1
S0
S1
S2
…
Si-1
Si
Si+1
…
Sk-1
Sk
μ1
μ2
μ3
μi-1
μi
μi+1
μi+2
μk-1
μk
P0
P1
P2
Pi
30
则
( i i)Pi P P i1i1 i1i1
Pn(t)(n! t)n et n=0
可知: P0(h >△t)= P{h >△t}=e△t
故间隔时间 h 的分布为 P{ h △t}=1e△t
F (t) 1 et
f (t ) et h t et dt 1 / 0
0
F(t)
f(t)
t
20
(2)负指数分布的特点
• 负指数分布之所以常用,是因为它有很好的特性,使数学 分析变得方便
12
运筹学教案_排队论1
3. 服务机构
1 )服务机构可以是单服务员和多服务员服务, 这种服务形式与队列规则联合后形成了多种不同队 列,不同形式的排队服务机构,如:
1 1 . . 2 n . . 1 2 ¡ ¡ £ £ £ ¡ n ¤ ¶ µ Ó ¶ à · þ Î ñ Ì ¨£ ¨² ¢ Á Ð £ ©
¤ ¶ µ Ó µ ¤ · þ Î ñ Ì ¨
fcfs13?mmc型系统和c个mm1型系统?系统容量有限制的多服务台模型mmcn?顾客源为有限的多服务台模型mmcm?一般服务时间的mg11模型pollaczekkhintchinepk公式间定长服务时间md11模型?爱尔朗服务时间mek1模型?排队系统优化?mm1模型中的最优服务率u标准的mm1model系统容量为n的情形?mmc模型中最优服务台数c143到达间隔时间分布和服务时间的分布一个排队系统的最主要特征参数是顾客的到达间隔时间分布与服务时间分布
12
• • • •
• • •
•
M/M/C型系统和C个M/M/1型系统 系统容量有限制的多服务台模型(M/M/C/N/∞) 顾客源为有限的多服务台模型(M/M/C/∞/M) 一般服务时间的(M/G/1)模型 – Pollaczek-Khintchine(P-K) 公式 –定长服务时间 M/D/1模型 爱尔朗服务时间M/Ek/1模型 排队系统优化 M/M/1 模型中的最优服务率u – 标准的M/M/1Model – 系统容量为N的情形 M/M/C模型中最优服务台数C 13
§3 到达间隔时间分布和服务时间 的分布
一个排队系统的最主要特征参数是 顾客的到达间隔时间分布与服务时间分 布。要研究到达间隔时间分布与服务时 间分布需要首先根据现存系统原始资料 统计出它们的经验分布(见P315—319), 然后与理论分布拟合,若能照应,我们 就可以得出上述的分布情况。
排队论经典程序MM1代码
修理店仿真报告一.问题:①修理店空闲的概率;②店内有三个顾客的概率;③店内至少有一个顾客的概率;④在店内顾客的平均数;⑤顾客在店内的平均逗留时间;⑥顾客必须在店内消耗15分钟以上的概率。
二.求解问题的方法:①修理店空闲的概率:(sim_time-area_server_status) / sim_time);②店内有三个顾客的概率:area_3_in_q/sim_time);③店内至少有一个顾客的概率:abv_1/sim_time);④在店内顾客的平均数:area_num_in_h/sim_time);⑤顾客在店内的平均逗留时间:(total_of_delays+total_of_server)/ num_custs_delayed );⑥顾客必须在店内消耗15分钟以上概率:abv_15/num_custs_delayed);三。
求解过程中计算统计量的方法:①area_server_status += server_status * time_since_last_event;②//店内有三个顾客的概率if(server_status == BUSY)//服务台忙,则有队列中有两个顾客if(num_in_q == 2)area_3_in_q += time_since_last_event;③//店内至少有一个顾客的概率if(server_status == BUSY) //服务台忙,则店内至少有一个顾客abv_1 += time_since_last_event;④//在店内顾客的平均数if(server_status == BUSY) //服务台忙,总的顾客数为排队顾客数加一area_num_in_h += (num_in_q+1) * time_since_last_event;⑤total_of_server += time_next_event[2]-sim_time;//总的服务时间加一个服务时间为新的服务总时间delay = sim_time - time_arrival[1];//排队时间=当前时间-这个人来的时间total_of_delays += delay;⑥//离开时总的消耗时间大于15,必须在店内消耗15分钟以上的顾客数加一if((delay+time_next_event[2]-sim_time)>15)abv_15++;//到达时总的服务时间大于15,必须在店内消耗15分钟以上的顾客数加一if((time_next_event[2]-sim_time)>15)abv_15++;程序代码:/* External definitions for single-server queueing system. */#include <stdio.h>#include <math.h>/*#include "lcgrand.h" Header file for random-number generator. */#define Q_LIMIT 100 /* Limit on queue length.队伍最长100人*/ #define BUSY 1 /* Mnemonics for server's being busy 忙碌状态*/#define IDLE 0 /* and idle.空闲状态*/int next_event_type, //下一个事件类型num_custs_delayed, //已模拟的顾客数num_delays_required, //模拟的顾客数num_events,//事件数num_in_q, //队列中的顾客数server_status;//服务状态float area_num_in_q,//有顾客的时间area_server_status,//总的服务时间mean_interarrival,//平均顾客到达时间间隔mean_service,//平均服务时间sim_time, //模拟时间time_arrival[Q_LIMIT + 1], //到来的时间time_last_event, //上一个事件的时间time_next_event[3],//下一个事件的时间total_of_delays; //总的排队时间//////////////////////////////////////////////////////////////////////////////////////添加的变量float abv_15, //15分钟以上的顾客数量total_of_server, //所有顾客的总的服务时间area_3_in_q, //有3个顾客的时间abv_1, //至少有一个顾客的时间area_num_in_h; //顾客总数////////////////////////////////////////////////////////////////////////////////////FILE *infile, *outfile;/* The following 3 declarations are for use of the random-number generatorlcgrand and the associated functions lcgrandst and lcgrandgt for seed management. This file (named lcgrand.h) should be included in anyprogramusing these functions by executing #include "lcgrand.h"before referencing the functions. */float lcgrand(int stream);void lcgrandst(long zset, int stream); long lcgrandgt(int stream);void initialize(void);void timing(void);void arrive(void);void depart(void);void report(void);void update_time_avg_stats(void); float expon(float mean);main() /* Main function. */{/* Open input and output files. */infile = fopen("mm1.in", "r");outfile = fopen("mm1.out", "w");/* Specify the number of events for the timing function. */num_events = 2;//两种事件/* Read input parameters. */fscanf(infile, "%f %f %d", &mean_interarrival, &mean_service, &num_delays_required);/* Write report heading and input parameters. 输出*/fprintf(outfile, "Single-server queueing system\n\n");fprintf(outfile, "Mean interarrival time%11.3f minutes\n\n",mean_interarrival);fprintf(outfile, "Mean service time%16.3f minutes\n\n", mean_service);fprintf(outfile, "Number of customers%14d\n\n", num_delays_required);/* Initialize the simulation.初始化仿真*/initialize();//初始化/* Run the simulation while more delays are still needed.没服务完,仿真继续*/while (num_custs_delayed < num_delays_required) {//当已服务顾客数小于1000时/* Determine the next event. 确定下一事件*/timing();/* Update time-average statistical accumulators.时间记录更新*/update_time_avg_stats();/* Invoke the appropriate event function. 根据事件的不同,调用不同的函数*/switch (next_event_type) {case 1:arrive();//到达break;case 2:depart();//离开break;}}/* Invoke the report generator and end the simulation. */ report();fclose(infile);fclose(outfile);return 0;}void initialize(void) /* Initialization function. */{/* Initialize the simulation clock. 仿真时间置为0*/sim_time = 0.0;/* Initialize the state variables.最开始状态初始化*/server_status = IDLE;//服务空闲num_in_q = 0; //队伍里无人排队time_last_event = 0.0; //上一个事件的时间,最开始肯定是0开始/* Initialize the statistical counters. */num_custs_delayed = 0; //已经服务的人数total_of_delays = 0.0;//总的排队时间area_num_in_q = 0.0;//有顾客的时间area_server_status = 0.0;//总的服务时间///////////////////////////////////////////////////////////////////////////////////添加的变量的初始化area_3_in_q = 0.0;//有3个顾客的时间abv_1 = 0.0;//有顾客的时间area_num_in_h = 0.0;//顾客的总数total_of_server = 0.0;//所有顾客的所有的服务的时间abv_15 = 0.0;//消耗15分钟以上的顾客数//////////////////////////////////////////////////////////////////////////////////* Initialize event list. 初始化事件列表Since no customers are present, the departure(service completion) event is eliminated from consideration. 无顾客存在和离开*/time_next_event[1] = sim_time + expon(mean_interarrival);//下一事件是来的时间time_next_event[2] = 1.0e+30; //下一事件是离开的时间}void timing(void) /* Timing function. */{int i;float min_time_next_event = 1.0e+29; //像指针一样的对于当前服务的人来说下一个事件的时间next_event_type = 0;/* Determine the event type of the next event to occur.接下来将要发生的事件的类型*/for (i = 1; i <= num_events; ++i)if (time_next_event[i] < min_time_next_event) {//下一事件是来的时间跟离开时间比较min_time_next_event = time_next_event[i];next_event_type = i;}/* Check to see whether the event list is empty. */if (next_event_type == 0) {/* The event list is empty, so stop the simulation. 无事件,停止仿真过程*/fprintf(outfile, "\nEvent list empty at time %f", sim_time);exit(1);}/* The event list is not empty, so advance the simulation clock. 有事件,进行仿真过程*/sim_time = min_time_next_event; //仿真的时间就是当前事件的时间}void arrive(void) /* Arrival event function. */{float delay;/* Schedule next arrival.计划下一次的到来*/time_next_event[1] = sim_time + expon(mean_interarrival);/* Check to see whether server is busy. 检测是否在服务状态*/if (server_status == BUSY) {/* Server is busy, so increment number of customers in queue. 在服务则排队多一人*/++num_in_q;/* Check to see whether an overflow condition exists. 检测人数是否超出*/if (num_in_q > Q_LIMIT) {/* The queue has overflowed, so stop the simulation. */fprintf(outfile, "\nOverflow of the array time_arrival at");fprintf(outfile, " time %f", sim_time);exit(2);}/* There is still room in the queue, so store the time of arrival of thearriving customer at the (new) end of time_arrival. 队列中仍有空间时,记录新到达的时间*/time_arrival[num_in_q] = sim_time;//在这个时间的时候有这么多的排队人数,用于计算3顾客的问题}else { //服务空闲的状况/* Server is idle, so arriving customer has a delay of zero. (Thefollowing two statements are for program clarity and do not affectthe results of the simulation.) */delay = 0.0;total_of_delays += delay; //总的排队时间/* Increment the number of customers delayed, and make server busy. */++num_custs_delayed; //已经模拟的顾客数加1server_status = BUSY; //人到来,服务开始/* Schedule a departure (service completion). 服务完成*/time_next_event[2] = sim_time + expon(mean_service);//这个人离开的时间为现在时间+服务时间///////////////////////////////////////////////////////////////////////////////////总的服务时间加上当前服务时间,更新总的服务时间total_of_server += time_next_event[2]-sim_time;//总的服务时间加一个服务时间为新的服务总时间//总的服务时间大于15,必须在店内消耗15分钟以上的顾客数加一if((time_next_event[2]-sim_time)>15)//如果这个人服务时间超过15分钟则耗费15分钟人数加1abv_15++;/////////////////////////////////////////////////////////////////////////////////}}void depart(void) /* Departure event function. 讨论离开事件*/{int i;float delay;/* Check to see whether the queue is empty.检测队列是否为空*/if (num_in_q == 0) {/* The queue is empty so make the server idle and eliminate the departure (service completion) event from consideration. 队列空,服务空闲*/server_status = IDLE;time_next_event[2] = 1.0e+30; //离开的时间无限大(无人离开)}else {/* The queue is nonempty, so decrement the number of customers inqueue. 有人离开,队列人数减少*/--num_in_q;/* Compute the delay of the customer who is beginning serviceand updatethe total delay accumulator. */delay = sim_time - time_arrival[1];//排队时间=当前时间-这个人来的时间total_of_delays += delay;/* Increment the number of customers delayed, and schedule departure.已经服务人数+1 */++num_custs_delayed; //服务人数加1time_next_event[2] = sim_time + expon(mean_service);//当前接受服务的人的离开时间///////////////////////////////////////////////////////////////////////////////////总的服务时间加上当前服务时间,更新总的服务时间total_of_server += time_next_event[2]-sim_time;//总的消耗时间大于15,必须在店内消耗15分钟以上的顾客数加一if((delay+time_next_event[2]-sim_time)>15)abv_15++;//////////////////////////////////////////////////////////////////////////////////* Move each customer in queue (if any) up one place.有人离开,队列前移*/for (i = 1; i <= num_in_q; ++i)time_arrival[i] = time_arrival[i + 1];//人的到达时间也前移}}void report(void) /* Report generator function. */{/* Compute and write estimates of desired measures of performance. */fprintf(outfile, "\n\nAverage delay in queue%11.3f minutes\n\n",total_of_delays / num_custs_delayed);fprintf(outfile, "Average number in queue%10.3f\n\n",area_num_in_q / sim_time);fprintf(outfile, "Server utilization%15.3f\n\n",area_server_status / sim_time);fprintf(outfile, "Time simulation ended%12.3f minutes", sim_time);printf("统计量:\n");//////////////////////////////////////////////////////////////////////////总时间减去服务台忙的时间除以总时间,得到服务台空闲的概率printf("①修理店空闲的概率:%24.3f\n",(sim_time-area_server_status) / sim_time);printf("②店内有三个顾客的概率:%20.3f\n",area_3_in_q/sim_time);printf("③店内至少有一个顾客的概率:%16.3f\n",abv_1/sim_time);printf("④在店内顾客的平均数:%22.3f\n",area_num_in_h/sim_time);printf("⑤顾客在店内的平均逗留时间:%16.3f\n",(total_of_delays+total_of_server)/ num_custs_delayed );printf("⑥顾客必须在店内消耗15分钟以上概率:%8.3f\n\n", abv_15/num_custs_delayed);printf("仿真时间:%12.3f minutes\n\n", sim_time);//////////////////////////////////////////////////////////////////////}void update_time_avg_stats(void) /* Update area accumulators fortime-averagestatistics.更新时间平均时间统计*/{float time_since_last_event;/* Compute time since last event, and update last-event-time marker.上个事件到现在的时间并更新最后事件的标记*/time_since_last_event = sim_time - time_last_event;//两个事件的时间差time_last_event = sim_time;/* Update area under number-in-queue function. 有顾客的时间=队列中的人数*时间差*/area_num_in_q += num_in_q * time_since_last_event;/* Update area under server-busy indicator function. 总的服务时间=所有时间差相加*/area_server_status += server_status * time_since_last_event;///////////////////////////////////////////////////////////////////////////////////店内有三个顾客的概率if(server_status == BUSY) //服务台忙,则有队列中有两个顾客if(num_in_q == 2)area_3_in_q += time_since_last_event;//if(server_status == IDLE) //服务台空闲,则有队列中有三个顾客// if(num_in_q == 3)// area_3_in_q += time_since_last_event;//店内至少有一个顾客的概率if(server_status == BUSY) //服务台忙,则店内至少有一个顾客abv_1 += time_since_last_event;//if(server_status == IDLE) //服务台空闲,则有队列中至少有一个顾客// if(num_in_q>0)// abv_1 += time_since_last_event;//在店内顾客的平均数if(server_status == BUSY) //服务台忙,总的顾客数为排队顾客数加一area_num_in_h += (num_in_q+1) * time_since_last_event;//if(server_status == IDLE) //服务台空闲,总的顾客数为排队顾客数// area_num_in_h += num_in_q * time_since_last_event;/////////////////////////////////////////////////////////////////////////////////}float expon(float mean) /* Exponential variate generation function. */ {/* Return an exponential random variate with mean "mean". */return -mean * log(lcgrand(10));//自己学号的后两位}/* Prime modulus multiplicative linear congruential generator Z[i] = (630360016 * Z[i-1]) (mod(pow(2,31) - 1)), based on Marse and Roberts'portable FORTRAN random-number generator UNIRAN. Multiple(100) streams aresupported, with seeds spaced 100,000 apart. Throughout, input argument"stream" must be an int giving the desired stream number. The header filelcgrand.h must be included in the calling program (#include "lcgrand.h")before using these functions.Usage: (Three functions)1. To obtain the next U(0,1) random number from stream "stream," executeu = lcgrand(stream);where lcgrand is a float function. The float variable u will contain thenext random number.2. To set the seed for stream "stream" to a desired value zset, executelcgrandst(zset, stream);where lcgrandst is a void function and zset must be a long set to thedesired seed, a number between 1 and 2147483646 (inclusive). Defaultseeds for all 100 streams are given in the code.3. To get the current (most recently used) integer in the sequence beinggenerated for stream "stream" into the long variable zget, execute zget = lcgrandgt(stream);where lcgrandgt is a long function. *//* Define the constants. */#define MODLUS 2147483647#define MULT1 24112#define MULT2 26143/* Set the default seeds for all 100 streams. */static long zrng[] ={ 1,1973272912, 281629770, 20006270,1280689831,2096730329,1933576050,913566091, 246780520,1363774876, 604901985,1511192140,1259851944,824064364, 150493284, 242708531, 75253171,1964472944,1202299975,233217322,1911216000, 726370533, 403498145, 993232223,1103205531,762430696,1922803170,1385516923, 76271663, 413682397, 726466604,336157058,1432650381,1120463904, 595778810, 877722890,1046574445,68911991,2088367019, 748545416, 622401386,2122378830, 640690903,1774806513,2132545692,2079249579, 78130110, 852776735,1187867272,1351423507,1645973084,1997049139, 922510944,2045512870, 898585771,243649545,1004818771, 773686062, 403188473, 372279877,1901633463,498067494,2087759558, 493157915, 597104727,1530940798,1814496276,536444882,1663153658, 855503735, 67784357,1432404475, 619691088,119025595, 880802310, 176192644,1116780070, 277854671,1366580350,1142483975,2026948561,1053920743,786262391,1792203830,1494667770,1923011392,1433700034,1244184613,1147297105,539712780,1545929719,190641742,1645390429, 264907697, 620389253,1502074852, 927711160,364849192,2049576050, 638580085, 547070247 };/* Generate the next random number. */float lcgrand(int stream){long zi, lowprd, hi31;zi = zrng[stream];lowprd = (zi & 65535) * MULT1;hi31 = (zi >> 16) * MULT1 + (lowprd >> 16);zi = ((lowprd & 65535) - MODLUS) +((hi31 & 32767) << 16) + (hi31 >> 15);if (zi < 0) zi += MODLUS;lowprd = (zi & 65535) * MULT2;hi31 = (zi >> 16) * MULT2 + (lowprd >> 16);zi = ((lowprd & 65535) - MODLUS) +((hi31 & 32767) << 16) + (hi31 >> 15);if (zi < 0) zi += MODLUS;zrng[stream] = zi;return (zi >> 7 | 1) / 16777216.0;}void lcgrandst (long zset, int stream) /* Set the current zrng for stream"stream" to zset. */ {zrng[stream] = zset;}long lcgrandgt (int stream) /* Return the current zrng for stream "stream". */{return zrng[stream];}。
通信网络原理与技术—4-2排队系统(MM1)
余寿命的分布与总寿命的分布完全 相同,那么这种寿命分布是无记忆 的,体现了“永远年轻”。
5
一、M/M/1排队系统
❖是指到达间隔(到达数)服从无 记忆Poisson过程,服务时间服 从负指数分布,服务窗口数为1 的、呼叫来源无限、容量无限排 队系统。
6
一、M/M/1排队系统
M/M/1排队系统的示意图如图所示。其特征:
❖顾客到达过程为Poisson过程,到达率为 ;
❖ 系统允许排队的队长可以是无限的(系统的缓 存容量无限大);
❖ 服务过程为指数过程,服务速率为(平均服 务时间为1/ );
❖ 服务员的数目为1(m);
❖ 到达过程与服务过
排队系统
程相互独立。
无限容量
负指数分布
Utilization P(0), probability that the system is empty Lq, expected queue length L, expected number in system Wq, expected time in queue W, expected total time in system
在时间[t, t+t]内 在时刻t+t
到达
离去 呼叫数
出现该情况的概率
A0
无
无
0
p0(t). (1-t).(1-t)
B 0+1 无
有
0
p1(t). (1-t). t
❖ 所以p0(t+t)等于A、B两种情况概率之和,即:
16
p0(t+t) =p0(t)(1-t)(1-t)+p1(t)(1-t)t 由于t<<1,1-t1,所以
排队模型(掌握mm1,mmc,mm1k)
现实生活中的排队系统
序 到达的顾客 号
要求服务内容
服务机构
1 不能运转的机器 修理
修理技工
2 修理技工
领取修配零件 发放修配零件的管理员
3 病人
诊断或做手术 医生(或包括手术台)
4 电话呼唤
通话
交换台
5 文件搞
打字
打字员
6 提货单
提取存货
仓库管理员
7 驶入港口的货船 装(卸)货
装(卸)货码头(泊位)
3 6 1 5 6 7 22 3 4 6 11 45 5 2 0 4 11 9 1 2 8 26 3 10 5 12 47 4 2 3
(1) (2) (3) (4) (5) (1) (2) (3) (4) (5) (1) (2) (3) (4) (5) i τi si ti wi i τi si ti wi i τi si ti wi 13 49 1 3 5 23 86 6 2 2 33 117 4 4 7
二、排队系统的特征及其组成
1、排队系统的特征即拥挤现象的共性 1)、有请求服务的人或物 2)、有为顾客服务的人或物 3)、具有随机性 4)、服务的数量超过服务机构的容量
2、排队系统的三大基本组成部分
1)、输入过程(顾客到达的方式) a、顾客的总体(顾客源)的组成可能是有限的,也
可能是无限的; b、顾客相继到达的时间间隔可以是确定的,也可以
8 上游河水进入水库 放水,调整水位 水闸管理员
2、排队论的起源与应用领域
1)、20世纪初Bell电话公司为减少用户呼叫, 研究电话线路合理配置问题;
2)、1909年丹麦工程师A.K.Erlang受热力 学统计平衡概念启发发表论文《概率论与电 话交换》,解决上述问题;
北邮信息工程通信网理论基础实验2报告——M 排队系统
信息与通信工程学院通信网理论基础实验报告班级:姓名:学号:序号:日期:通信网理论基础实验报告实验二M/M/1 排队系统一、实验目的M/M/1 是最简单的排队系统,其假设到达过程是一个参数为的Poisson 过程,服务时间是参数为的负指数分布,只有一个服务窗口,等待的位置有无穷多个,排队的方式是FIFO。
M/M/1 排队系统的稳态分布、平均队列长度,等待时间的分布以及平均等待时间,可通过泊松过程、负指数分布、生灭过程以及Little 公式等进行理论上的分析与求解。
本次实验要求实现M/M/1 单窗口无限排队系统的系统仿真,利用事件调度法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比。
二、实验内容根据排队论的知识我们知道,排队系统的分类是根据该系统中的顾客到达模式、服务模式、服务员数量以及服务规则等因素决定的。
1、顾客到达模式设到达过程是一个参数为的Poisson 过程,则长度为的时间内到达k 个呼叫的概率服从Poisson 分布,即,其中λ0为一常数,表示了平均到达率或Poisson 呼叫流的强度。
2、服务模式设每个呼叫的持续时间为,服从参数的负指数分布,即其分布函数为。
3、服务规则先进先服务的规则(FIFO)4、理论分析结果在该M/M/1 系统中,设,则稳态时的平均等待队长为(不是,顾客的平均等待时间为。
第1页通信网理论基础实验报告三、实验内容1、仿真时序图示例本实验中的排队系统为当顾客到达分布服从负指数分布,系统服务时间也服从负指数分布,单服务台系统,单队排队,按FIFO 方式服务为M/M/1 排队系统。
理论上,我们定义服务员结束一次服务或者有顾客到达系统均为一次事件。
为第i 个任何一类事件发生的时间,其时序关系如下图所示。
S1 S2 S3 S4 D2 D3 D4 D5 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 t1 t2 c1 t3 c2 t4 c3 t5 150 t t0 A3 A4 A5 A1 A2 bi第i 个任何一类事件发生的时间ti第i 个顾客到达类事件发生的时间ci第i 个顾客离开类事件发生的时间Ai为第i-1 个与第i 个顾客到达时间间隔Di第i 个顾客排队等待的时间长度Si第i 个顾客服务的时间长度顾客平均等待队长及平均排队等待时间的定义为1 T 1 n Qt dt Ri T 0 Q n Q n T i 1 其中,为在时间区间上排队人数乘以该区间长度。
8.2 单服务台排队模型
精选课件ppt
36
1 整个挂号间空闲的概率 P 0= 20! .2 0+ 521! .2 1+ 5 22! .2 2+ 523! .2 31 - 521./2 3 5 10.074
2 等待挂号的平均 称人 队数 列或 长
n = 1 : P 0P 2 ()P 1
P0P2()P0
P2
( )2
P0
n = 2 : P 1 P 3 ()P 2
P0P3() 2 2P0
P3
(
)3
P0
精选课件ppt
19
类似可得
Pn
(
)
n
P0
令
Pn()nP0
由概率性质可知,
Pn 1
n0
n0
Pn
()nP0
n0
1
P0
n0
16
M/M/1/∞/∞ 模型
1、模型条件 (1)输入过程――顾客源是无限的,单个到来,到
达过程服从泊松分布,即顾客到达间隔时间服从 负指数分布; (2)排队规则――单队,且队长没有限制,先到先 服务; (3)服务机构――单服务台,服务时间的长短是随 机的,服从相同的负指数分布 。
精选课件ppt
17
PN3=32!.12/453 0.07480.57
精选课件ppt
38
如果在上例中,就诊者到达后在每个挂号窗口各自 排成一队,即排成3队,且进入队列后不离开,各列间 也互不串换,这就形成3个队列,而前例中的其它条件 不变。假设每个队列平均到达率相等且为: λ1=λ2=λ3=0.9/3=0.3(人/分钟) 这样,原来的M/M/3系统就变成了3个M/M/1型的子系统。
第六章 MM1队列建模
6.2 M/M/1队列模型整体分析
排队论是通信网的基础理论之一, 传统的分析方法是基于随机理论进行 数学模型的建模和求解。近年来,随 着网络仿真技术的发展,形成了以模 拟队列的个体行为为特征的网络仿真 方法;本节所介绍的M/M/1队列模型 及实验就是采用了网络仿真的分析方 法。
排队论仿真是针对一个多个队列展开的 ,因而仅需要一个节点,并且可以在逻辑场 景中实现。
节点mm1_node由三个模块通过包流 线串联而成:
队列模型的整体逻辑:首先由src 随机地产生数据包,并由包流发送至 queue。然后,由队列模块queue进行 队列处理,并发送至sink。最后由sink 销毁包,并释放存储空间。
6.3 M/M/1队列实验
一 实验目的
1、学习队列建模的方法,特别 是数据产生和队列处理的方法。
服务容量C 平均数据包长度
1
=C
平均延时W = 1
C
平均队列长度L C
三 实验过程 参看教材 四 问题思考
1)仿真模型的结构分析 1、分析simple_source进程模型产生数据
包的过程,以及数据包的随机分布特点。 2、根据acb_fifo队列模型,绘制队列处
理的流程图,分析其逻辑过程。 3、进行M/M/1模型的整体逻辑分析。
2、通过仿真,分析M/M/1队列 的延时特性与队列长度的关系。
二 实验原理
M/M/1队列由先进先出(FIFO) 缓冲形成,数据包的到达和数据包 的发送都服从于泊松分布。
M/M/1队列的性能决定于数据包 到达速率、数据包长度、服务容量 等参数。
根据排队论理论,有:
平均到达速率
1 平均到达间隔
平均服务速率=
通信网络实验一MM1排队系统
实验一:M/M/1排队系统一、实验目的M/M/1是最简单的排队系统,其假设到达过程是一个参数为λ的Poisson 过程,服务时间是参数为μ的负指数分布,只有一个服务窗口,等待的位置有无穷多个,排队的方式是FIFO 。
M/M/1排队系统的稳态分布、平均队列长度,等待时间的分布以及平均等待时间,可通过泊松过程、负指数分布、生灭过程以及Little 公式等进行理论上的分析与求解。
二、实验原理根据排队论的知识我们知道,排队系统的分类是根据该系统中的顾客到达模式、服务模式、服务员数量以及服务规则等因素决定的。
1、 顾客到达模式设到达过程是一个参数为λ的Poisson 过程,则长度为t 的时间内到达k 个呼叫的概率)(t P k 服从Poisson 分布,即etk k k t t p λλ-=!)()(,⋅⋅⋅⋅⋅⋅⋅⋅⋅=,2,1,0k ,其中λ>0为一常数,表示了平均到达率或Poisson 呼叫流的强度。
2、 服务模式设每个呼叫的持续时间为i τ,服从参数为μ的负指数分布,即其分布函数为{}1,0t P X t e t μ-<=-≥3、 服务规则先进先服务的规则(FIFO ) 4、 理论分析结果在该M/M/1系统中,设λρμ=,则稳态时的平均等待队长为1Q ρλρ=-,顾客的平均等待时间为T ρμλ=-。
三、 实验内容 1、 采用语言MATLAB 语言,其源代码如下: %总仿真时间Total_time = 30;%队列最大长度N = 10;%到达率与服务率lambda = 0.8;mu = 5;%平均到达时间与平均服务时间arr_mean = 1/lambda;ser_mean = 1/mu;%可能到达的最大顾客数(round:四舍五入求整数)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 个顾客,故标志位%置1events(5,1) = 1;%其进入系统后,系统内已有成员序号为1member = [1];%*****************************************% 计算第i 个顾客的信息%*****************************************for i = 2:arr_num%如果第i 个顾客的到达时间超过了仿真时间,则跳出循环if events(1,i)>Total_timebreak;%如果第i 个顾客的到达时间未超过仿真时间,则计算在其%到达时刻系统中已有的顾客个数else number = sum(events(4,member) > events(1,i)); %如果系统已满,则系统拒绝第i 个顾客,其标志位置0if number >= N+1events(5,i) = 0;%如果系统为空,则第i 个顾客直接接受服务else if number == 0%其等待时间为0events(3,i) = 0;%其离开时刻等于到达时刻与服务时间之和events(4,i) = events(1,i)+events(2,i);%其标志位置1events(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];endendendend%仿真结束时,进入系统的总顾客数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,m ember),'k-');legend(' 等待时间',' 停留时间');grid on;四、数据结构1、主要函数%可能到达的最大顾客数(round:四舍五入求整数)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);%如果系统有顾客正在接受服务,且系统等待队列未满,则%第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];%开时刻曲线图(stairs:绘制二维阶梯图)stairs([0 events(1,member)],0:len_mem);2、算法的流程图开始输入仿真人数计算第i个顾客离开时间是否接纳?计算第i个顾客的等待时间标志位+1是否时间越界?输出结果结束五、仿真结果分析六、遇到的问题和解决方法七、实验心得通过这次实验,我们再一次复习了M/M/1的简单排队系统以及MATLAB 的使用,同时对Mat Lab编程语言更加熟悉,并了解到仿真在通信网中的重要作用。
D1、MD1、MM1排队性能讲解
通信网仿真与NS仿真器大作业——D/D/1、M/D/1、M/M/1排队性能分析姓名:黄颢学号:1011010303班级:通信三班2012年2月一、总体目标获得D/D/1、M/M/1、M/D/1等不同排队系统的吞吐量与流入负载的变化关系。
二、任务分配:针对本次作业,将本组所有成员分成三个小组:第一小组的主要任务是负责D/D/1、M/M/1、M/D/1等不同排队系统业务源的生成。
第二小组的主要任务是在第一小组工作的基础上对模拟环境所生成的数据进行记录并做后续的数据处理。
第三小组的主要任务是在前两个小组的任务完成之后,进一步讨论实验结果,并在最后撰写实验报告。
三、实验环境Unbuntu平台下的NS、Gnuplot。
其中Ubuntu的版本为11.10、NS的版本为2.34、Gnuplot 的版本为4.4。
四、D/D/1、M/D/1、M/M/1排队系统的概述排队论(queuing theory), 或称随机服务系统理论, 是通过对服务对象到来及服务时间的统计研究,得出这些数量指标(等待时间、排队长度、忙期长短等)的统计规律,然后根据这些规律来改进服务系统的结构或重新组织被服务对象,使得服务系统既能满足服务对象的需要,又能使机构的费用最经济或某些指标最优。
排队模型的表示方法:M= 指数分布 D= 确定型分布M/M/1:数据进入队列的概率服从泊松分布,数据离开队列的概率亦服从泊松分布,且只有一个队列。
由随机过程知识可知数据到达的时间间隔服从指数分布,数据离开队列的时间间隔也是服从指数分布的,而在在队列处理能力一定的基础上,数据离开队列的时间间隔与其大小有正比关系,故可将M/M/1的生成转化为生成一个这样的节点:1、其发送数据的时间间隔服从指数分布,在程序中设其参数为λ;2、其发送的数据大小也服从指数分布,在程序中设其参数为μ。
D/D/1:即数据进入队列和离开队列的概率是固定的,由M/M/1的节点生成可知,D/D/1的生成转化为这样一个节点:1、其发送数据的时间间隔固定;2、其发送的数据大小也固定,为方便比较其间隔时间和大小也用λ和μ来表示。
排队问题程序
function[maxque,mwait_t,mstay_t,queue_l,use_rate]=MM1queue(mean_arr,mean_lea,peo_num)status=zeros(3,peo_num);%用一个3行矩阵表示每个顾客的状态;%到达时间间隔,服务时间,等待时间;status(1,=exprnd(mean_arr,1,peo_num);%随机生成各顾客的到达间隔;status(2,=exprnd(mean_lea,1,peo_num);%随机生成各顾客的服务时间;for i=2:peo_numif status(1,i)<=status(2,i-1)+status(3,i-1)status(3,i)=status(2,i-1)+status(3,i-1)-status(1,i);elsestatus(3,i)=0;end;%对状态进行更新;end;arr_time=cumsum(status(1,);status(1,:)=arr_time;lea_time=sum(status);stairs([0 arr_time],0:peo_num);%绘出各顾客的到达时间图;hold on;stairs([0 lea_time],0:peo_num,'r');%绘出各顾客的离去时间图;legend('Arrive curve','leave curve',0)hold offfigure;plot(1:peo_num,status(3,:),'r:',1:peo_num,status(2,:)+status(3,:),'k-');%绘出每个顾客的等待时间和停留时间;legend('Wait Time','Stay Time',0);n1=1;n2=1;mstay_t=(sum(status(2,:))+sum(status(3,:)))/peo_num;mwait_t=mean(status(3,:));%求平均停留时间和等待时间;queue_num=zeros(1,2*peo_num+1);queue_time=zeros(1,2*peo_num+1);n3=1;%while循环求每个时间队列的长度;while n1<=peo_numif arr_time(n1)<lea_time(n2)queue_num(1,n3)=n1-n2+1;queue_time(1,n3)=arr_time(n1);n1=n1+1;elsequeue_num(1,n3)=n1-n2-1;queue_time(1,n3)=lea_time(n2);n2=n2+1;end;end;while n2<=peo_numn3=n3+1;queue_num(1,n3)=peo_num-n2;queue_time(1,n3)=lea_time(n2);n2=n2+1;end;figure;stairs(queue_time,queue_num,'k');%绘出队列长度的时间变化曲线, stairs 是Matlab的函数legend('Queue Length Curve',0);temp=diff(queue_time);overtime=max(queue_time);queue_l=sum(temp.*queue_num(22*peo_num+1)))/overtime;use_rate=sum(temp(find(queue_num)))/overtime;maxque=max(queue_num); % 最大队长%然后在Matlab命令窗口中输入命令即可,如:[maxque,mwait_t,mstay_t,queue_l,use_rate]=mm1queue(0.5,0.4,200),其中0.5表示平均来到时间间隔,%0.4表示平均离开时间,200为人数注意以下几点:1.首先因为M/M/1中,各个实体的到达时间和服务时间相互独立,所以才能首先把每个实体的这两个时间,根据所给的参数产生模拟的随机数来。
第三章三节MM1排队模型
W s W q
1
பைடு நூலகம்
一般的里特公式中 应为e,称有效到达率,即实际进入 系统率。本模型中因系统容量无限制,故e 。
例2 某修理店只有一个修理工人,来修理的顾客到达数服从 泊松分布,平均每小时4人;修理时间服从负指数分布,平均 需6分钟。求:(1)修理店空闲的概率;(2)店内有3个顾 客的概率;(3)店内至少有1个顾客的概率;(4)店内顾客 的平均数;(5)顾客在店内的平均逗留时间;(6)等待服 务的顾客平均数;(7)平均等待修理时间;(8)必须在店 内消耗15分钟以上的概率。
3 1 1 4 0.304, (c) N 5, P0 1 6 1 0.178 P5 5 P0 0.237 0.304 0.072
三.顾客源有限的M/M/1模型(M/M/1/ /m )
1.与(M/M/1/ / )的区别
(1) 系统状态n 0,,m; 1,
首先可证,逗留时间W 服从参数为 的负指数分布, 而负指数分布的均值等于其参数的倒数,故平均逗留时间 W
s
1
平均等待时间等于平均逗留时间减去平均服务时间,即 1 W q W s
(3)上述4个指标之间的关系——里特公式
Ls W s Lq W q
Ls Lq
3. 系统运行指标
(1)Ls与Lq
Ls 表示系统中的平均顾客数,由期望定义, Ls np n n n (1 ) (1 ) n n 1
n 0 n 0 n 1
d d n (1 ) (1 ) d n 0 n 1 d d 1 1 (1 ) (1 ) 2 d 1 (1 )
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
修理店仿真报告一.问题:①修理店空闲的概率;②店内有三个顾客的概率;③店内至少有一个顾客的概率;④在店内顾客的平均数;⑤顾客在店内的平均逗留时间;⑥顾客必须在店内消耗15分钟以上的概率。
二.求解问题的方法:①修理店空闲的概率:(sim_time-area_server_status) / sim_time);②店内有三个顾客的概率:area_3_in_q/sim_time);③店内至少有一个顾客的概率:abv_1/sim_time);④在店内顾客的平均数:area_num_in_h/sim_time);⑤顾客在店内的平均逗留时间:(total_of_delays+total_of_server)/num_custs_delayed );⑥顾客必须在店内消耗15分钟以上概率:abv_15/num_custs_delayed);三。
求解过程中计算统计量的方法:①area_server_status += server_status * time_since_last_event;②//店内有三个顾客的概率if(server_status == BUSY)//服务台忙,则有队列中有两个顾客if(num_in_q == 2)area_3_in_q += time_since_last_event;③//店内至少有一个顾客的概率if(server_status == BUSY) //服务台忙,则店内至少有一个顾客abv_1 += time_since_last_event;④//在店内顾客的平均数if(server_status == BUSY) //服务台忙,总的顾客数为排队顾客数加一area_num_in_h += (num_in_q+1) * time_since_last_event;⑤total_of_server += time_next_event[2]-sim_time;//总的服务时间加一个服务时间为新的服务总时间delay = sim_time - time_arrival[1];//排队时间=当前时间-这个人来的时间total_of_delays += delay;⑥//离开时总的消耗时间大于15,必须在店内消耗15分钟以上的顾客数加一if((delay+time_next_event[2]-sim_time)>15)abv_15++;//到达时总的服务时间大于15,必须在店内消耗15分钟以上的顾客数加一if((time_next_event[2]-sim_time)>15)abv_15++;程序代码:/* External definitions for single-server queueing system. */#include <stdio.h>#include <math.h>/*#include "lcgrand.h" Header file for random-number generator. */#define Q_LIMIT 100 /* Limit on queue length.队伍最长100人*/#define BUSY 1 /* Mnemonics for server's being busy 忙碌状态*/#define IDLE 0 /* and idle.空闲状态 */int next_event_type, //下一个事件类型num_custs_delayed, //已模拟的顾客数num_delays_required, //模拟的顾客数num_events,//事件数num_in_q, //队列中的顾客数server_status;//服务状态float area_num_in_q,//有顾客的时间area_server_status,//总的服务时间mean_interarrival,//平均顾客到达时间间隔mean_service,//平均服务时间sim_time, //模拟时间time_arrival[Q_LIMIT + 1], //到来的时间time_last_event, //上一个事件的时间time_next_event[3],//下一个事件的时间total_of_delays; //总的排队时间/////////////////////////////////////////////////////////// ///////////////////////////添加的变量float abv_15, //15分钟以上的顾客数量 total_of_server, //所有顾客的总的服务时间area_3_in_q, //有3个顾客的时间abv_1, //至少有一个顾客的时间area_num_in_h; //顾客总数////////////////////////////////////////////////////////////////////////////////////FILE *infile, *outfile;/* The following 3 declarations are for use of the random-number generatorlcgrand and the associated functions lcgrandst and lcgrandgt for seedmanagement. This file (named lcgrand.h) should be included in any programusing these functions by executing#include "lcgrand.h"before referencing the functions. */float lcgrand(int stream);void lcgrandst(long zset, int stream);long lcgrandgt(int stream);void initialize(void);void timing(void);void arrive(void);void depart(void);void report(void);void update_time_avg_stats(void);float expon(float mean);main() /* Main function. */{/* Open input and output files. */infile = fopen("mm1.in", "r");outfile = fopen("mm1.out", "w");/* Specify the number of events for the timing function. */num_events = 2;//两种事件/* Read input parameters. */fscanf(infile, "%f %f %d", &mean_interarrival, &mean_service,&num_delays_required);/* Write report heading and input parameters. 输出*/fprintf(outfile, "Single-server queueing system\n\n"); fprintf(outfile, "Mean interarrival time%11.3f minutes\n\n",mean_interarrival);fprintf(outfile, "Mean service time%16.3f minutes\n\n", mean_service);fprintf(outfile, "Number of customers%14d\n\n", num_delays_required);/* Initialize the simulation.初始化仿真 */initialize();//初始化/* Run the simulation while more delays are still needed.没服务完,仿真继续 */while (num_custs_delayed < num_delays_required) {//当已服务顾客数小于1000时/* Determine the next event. 确定下一事件*/timing();/* Update time-average statistical accumulators.时间记录更新 */update_time_avg_stats();/* Invoke the appropriate event function. 根据事件的不同,调用不同的函数*/switch (next_event_type) {case 1:arrive();//到达break;case 2:depart();//离开break;}}/* Invoke the report generator and end the simulation. */ report();fclose(infile);fclose(outfile);return 0;}void initialize(void) /* Initialization function. */{/* Initialize the simulation clock. 仿真时间置为0*/sim_time = 0.0;/* Initialize the state variables.最开始状态初始化 */server_status = IDLE;//服务空闲num_in_q = 0; //队伍里无人排队time_last_event = 0.0; //上一个事件的时间,最开始肯定是0开始/* Initialize the statistical counters. */num_custs_delayed = 0; //已经服务的人数total_of_delays = 0.0;//总的排队时间area_num_in_q = 0.0;//有顾客的时间area_server_status = 0.0;//总的服务时间/////////////////////////////////////////////////////////// ////////////////////////添加的变量的初始化area_3_in_q = 0.0;//有3个顾客的时间abv_1 = 0.0;//有顾客的时间area_num_in_h = 0.0;//顾客的总数total_of_server = 0.0;//所有顾客的所有的服务的时间abv_15 = 0.0;//消耗15分钟以上的顾客数/////////////////////////////////////////////////////////// ///////////////////////* Initialize event list. 初始化事件列表Since no customers are present, the departure(service completion) event is eliminated fromconsideration. 无顾客存在和离开*/time_next_event[1] = sim_time +expon(mean_interarrival);//下一事件是来的时间time_next_event[2] = 1.0e+30; //下一事件是离开的时间}void timing(void) /* Timing function. */{int i;float min_time_next_event = 1.0e+29; //像指针一样的对于当前服务的人来说下一个事件的时间next_event_type = 0;/* Determine the event type of the next event to occur.接下来将要发生的事件的类型 */for (i = 1; i <= num_events; ++i)if (time_next_event[i] < min_time_next_event) {//下一事件是来的时间跟离开时间比较min_time_next_event = time_next_event[i];next_event_type = i;}/* Check to see whether the event list is empty. */if (next_event_type == 0) {/* The event list is empty, so stop the simulation. 无事件,停止仿真过程*/fprintf(outfile, "\nEvent list empty at time %f",sim_time);exit(1);}/* The event list is not empty, so advance the simulationclock. 有事件,进行仿真过程*/sim_time = min_time_next_event; //仿真的时间就是当前事件的时间}void arrive(void) /* Arrival event function. */{float delay;/* Schedule next arrival.计划下一次的到来 */time_next_event[1] = sim_time + expon(mean_interarrival);/* Check to see whether server is busy. 检测是否在服务状态*/if (server_status == BUSY) {/* Server is busy, so increment number of customers in queue. 在服务则排队多一人*/++num_in_q;/* Check to see whether an overflow condition exists.检测人数是否超出*/if (num_in_q > Q_LIMIT) {/* The queue has overflowed, so stop the simulation. */fprintf(outfile, "\nOverflow of the array time_arrival at");fprintf(outfile, " time %f", sim_time);exit(2);}/* There is still room in the queue, so store the time of arrival of thearriving customer at the (new) end of time_arrival. 队列中仍有空间时,记录新到达的时间*/time_arrival[num_in_q] = sim_time;//在这个时间的时候有这么多的排队人数,用于计算3顾客的问题}else { //服务空闲的状况/* Server is idle, so arriving customer has a delay of zero. (Thefollowing two statements are for program clarity and do not affectthe results of the simulation.) */delay = 0.0;total_of_delays += delay; //总的排队时间/* Increment the number of customers delayed, and make server busy. */++num_custs_delayed; //已经模拟的顾客数加1server_status = BUSY; //人到来,服务开始/* Schedule a departure (service completion). 服务完成*/time_next_event[2] = sim_time + expon(mean_service);//这个人离开的时间为现在时间+服务时间/////////////////////////////////////////////////////////// ////////////////////////总的服务时间加上当前服务时间,更新总的服务时间total_of_server += time_next_event[2]-sim_time;//总的服务时间加一个服务时间为新的服务总时间//总的服务时间大于15,必须在店内消耗15分钟以上的顾客数加一if((time_next_event[2]-sim_time)>15)//如果这个人服务时间超过15分钟则耗费15分钟人数加1abv_15++;/////////////////////////////////////////////////////////// //////////////////////}}void depart(void) /* Departure event function. 讨论离开事件*/{int i;float delay;/* Check to see whether the queue is empty.检测队列是否为空 */if (num_in_q == 0) {/* The queue is empty so make the server idle and eliminate thedeparture (service completion) event from consideration. 队列空,服务空闲*/server_status = IDLE;time_next_event[2] = 1.0e+30; //离开的时间无限大(无人离开)}else {/* The queue is nonempty, so decrement the number of customers inqueue. 有人离开,队列人数减少*/--num_in_q;/* Compute the delay of the customer who is beginning service and updatethe total delay accumulator. */delay = sim_time - time_arrival[1];//排队时间=当前时间-这个人来的时间total_of_delays += delay;/* Increment the number of customers delayed, and schedule departure.已经服务人数+1 */++num_custs_delayed; //服务人数加1time_next_event[2] = sim_time + expon(mean_service);//当前接受服务的人的离开时间/////////////////////////////////////////////////////////// ////////////////////////总的服务时间加上当前服务时间,更新总的服务时间total_of_server += time_next_event[2]-sim_time;//总的消耗时间大于15,必须在店内消耗15分钟以上的顾客数加一if((delay+time_next_event[2]-sim_time)>15)abv_15++;/////////////////////////////////////////////////////////// ///////////////////////* Move each customer in queue (if any) up one place.有人离开,队列前移 */for (i = 1; i <= num_in_q; ++i)time_arrival[i] = time_arrival[i + 1];//人的到达时间也前移}}void report(void) /* Report generator function. */{/* Compute and write estimates of desired measures of performance. */fprintf(outfile, "\n\nAverage delay in queue%11.3f minutes\n\n",total_of_delays / num_custs_delayed);fprintf(outfile, "Average number in queue%10.3f\n\n",area_num_in_q / sim_time);fprintf(outfile, "Server utilization%15.3f\n\n",area_server_status / sim_time);fprintf(outfile, "Time simulation ended%12.3f minutes", sim_time);printf("统计量:\n");/////////////////////////////////////////////////////////// ///////////////总时间减去服务台忙的时间除以总时间,得到服务台空闲的概率printf("①修理店空闲的概率:%24.3f\n",(sim_time-area_server_status) / sim_time);printf("②店内有三个顾客的概率:%20.3f\n",area_3_in_q/sim_time);printf("③店内至少有一个顾客的概率:%16.3f\n",abv_1/sim_time);printf("④在店内顾客的平均数:%22.3f\n",area_num_in_h/sim_time);printf("⑤顾客在店内的平均逗留时间:%16.3f\n",(total_of_delays+total_of_server)/num_custs_delayed );printf("⑥顾客必须在店内消耗15分钟以上概率:%8.3f\n\n", abv_15/num_custs_delayed);printf("仿真时间:%12.3f minutes\n\n", sim_time);/////////////////////////////////////////////////////////// ///////////}void update_time_avg_stats(void) /* Update area accumulators for time-averagestatistics.更新时间平均时间统计 */{float time_since_last_event;/* Compute time since last event, and update last-event-time marker.上个事件到现在的时间并更新最后事件的标记 */time_since_last_event = sim_time - time_last_event;//两个事件的时间差time_last_event = sim_time;/* Update area under number-in-queue function. 有顾客的时间=队列中的人数*时间差*/area_num_in_q += num_in_q * time_since_last_event;/* Update area under server-busy indicator function. 总的服务时间=所有时间差相加*/area_server_status += server_status * time_since_last_event;/////////////////////////////////////////////////////////// ////////////////////////店内有三个顾客的概率if(server_status == BUSY) //服务台忙,则有队列中有两个顾客if(num_in_q == 2)area_3_in_q += time_since_last_event;//if(server_status == IDLE) //服务台空闲,则有队列中有三个顾客// if(num_in_q == 3)// area_3_in_q += time_since_last_event;//店内至少有一个顾客的概率if(server_status == BUSY) //服务台忙,则店内至少有一个顾客abv_1 += time_since_last_event;//if(server_status == IDLE) //服务台空闲,则有队列中至少有一个顾客// if(num_in_q>0)// abv_1 += time_since_last_event;//在店内顾客的平均数if(server_status == BUSY) //服务台忙,总的顾客数为排队顾客数加一area_num_in_h += (num_in_q+1) * time_since_last_event;//if(server_status == IDLE) //服务台空闲,总的顾客数为排队顾客数// area_num_in_h += num_in_q * time_since_last_event;/////////////////////////////////////////////////////////// //////////////////////}float expon(float mean) /* Exponential variate generation function. */{/* Return an exponential random variate with mean "mean". */return -mean * log(lcgrand(10));//自己学号的后两位}/* Prime modulus multiplicative linear congruential generator Z[i] = (630360016 * Z[i-1]) (mod(pow(2,31) - 1)), based on Marse and Roberts'portable FORTRAN random-number generator UNIRAN. Multiple (100) streams aresupported, with seeds spaced 100,000 apart. Throughout, input argument"stream" must be an int giving the desired stream number. The header filelcgrand.h must be included in the calling program (#include "lcgrand.h")before using these functions.Usage: (Three functions)1. To obtain the next U(0,1) random number from stream "stream," executeu = lcgrand(stream);where lcgrand is a float function. The float variable u will contain thenext random number.2. To set the seed for stream "stream" to a desired value zset, executelcgrandst(zset, stream);where lcgrandst is a void function and zset must be a long set to thedesired seed, a number between 1 and 2147483646 (inclusive). Defaultseeds for all 100 streams are given in the code.3. To get the current (most recently used) integer in the sequence beinggenerated for stream "stream" into the long variable zget, executezget = lcgrandgt(stream);where lcgrandgt is a long function. *//* Define the constants. */#define MODLUS 2147483647#define MULT1 24112#define MULT2 26143/* Set the default seeds for all 100 streams. */static long zrng[] ={ 1,1973272912, 281629770, 20006270,1280689831,2096730329,1933576050,913566091, 246780520,1363774876, 604901985,1511192140,1259851944,824064364, 150493284, 242708531,75253171,1964472944,1202299975,233217322,1911216000, 726370533, 403498145, 993232223,1103205531,762430696,1922803170,1385516923, 76271663, 413682397, 726466604,336157058,1432650381,1120463904, 595778810, 877722890,1046574445,68911991,2088367019, 748545416, 622401386,2122378830, 640690903,1774806513,2132545692,2079249579, 78130110, 852776735,1187867272,1351423507,1645973084,1997049139, 922510944,2045512870, 898585771,243649545,1004818771, 773686062, 403188473, 372279877,1901633463,498067494,2087759558, 493157915, 597104727,1530940798,1814496276,536444882,1663153658, 855503735, 67784357,1432404475, 619691088,119025595, 880802310, 176192644,1116780070, 277854671,1366580350,1142483975,2026948561,1053920743,786262391,1792203830,1494667770,1923011392,1433700034,1244184613,1147297105,539712780,1545929719,190641742,1645390429, 264907697, 620389253,1502074852, 927711160,364849192,2049576050, 638580085, 547070247 };/* Generate the next random number. */float lcgrand(int stream){long zi, lowprd, hi31;zi = zrng[stream];lowprd = (zi & 65535) * MULT1;hi31 = (zi >> 16) * MULT1 + (lowprd >> 16);zi = ((lowprd & 65535) - MODLUS) +((hi31 & 32767) << 16) + (hi31 >> 15);if (zi < 0) zi += MODLUS;lowprd = (zi & 65535) * MULT2;hi31 = (zi >> 16) * MULT2 + (lowprd >> 16);zi = ((lowprd & 65535) - MODLUS) +((hi31 & 32767) << 16) + (hi31 >> 15);if (zi < 0) zi += MODLUS;zrng[stream] = zi;return (zi >> 7 | 1) / 16777216.0;}void lcgrandst (long zset, int stream) /* Set the current zrng for stream"stream" to zset. */{zrng[stream] = zset;}long lcgrandgt (int stream) /* Return the current zrng for stream "stream". */{return zrng[stream];}。