QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 14360|回复: 10
打印 上一主题 下一主题

M/M/1排队系统性能仿真代码(MATLAB)

[复制链接]
字体大小: 正常 放大
qlau2007        

11

主题

6

听众

51

积分

升级  48.42%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2009-8-12 13:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

2 o. v2 S8 V. \
+ o# C  k8 U8 I8 w; ?8 ~; |% S
可能有点儿乱啊~~嘿嘿
%mm1 simulation in matlab
, {" p- p: D! @0 U$ H1 Dclc;clear;
ST_Idle=0;  V- U2 Y8 a- w/ b* x% l& a
ST_Busy=1;
EV_NULL=0;. L/ D% a4 B; A0 v
EV_Arrive=1;
/ t- y; L! F# R( U6 \9 v  g+ P5 YEV_Depart=2;2 ^$ {. W1 E3 O- S
EV_LEN=3;
Q_LIMIT=1000;
% next_event_type=[];) j0 _% e; ]  C0 x) T& n
% num_custs_delayed=[];
) }9 A( W1 G9 _( k3 a% num_delays_required=[];
6 V+ G& S( R5 H% k, v% num_events=[];7 C5 p0 ]: a9 u$ A8 }3 a
% num_in_q=[];7 c" C; b  T' X0 x
% server_status=[];
* t2 `- V5 P  }( t" n) [9 p7 N: f% area_num_in_q=[];6 l7 ]" ?7 }! J$ E5 Z, T
% area_server_status=[];
: i' I9 o1 `& a) g) W, L% E, d% mean_interarrival=[];
+ ~. U0 r0 m- X7 T. `5 v% mean_service=[];, E( A! _' H0 ?2 E' T8 U
% sim_time=[];
6 m% l% B/ i3 S8 f" @1 M9 }% time_last_event=[];, G  A! N; X! c+ s( s
% total_of_delays=[];
2 ^" E9 x3 b0 Y) }6 \4 r& q9 E%
' J$ d# Q0 R/ p! {time_arrival=[];                 %
到达时刻
time_next_event=zeros(1,EV_LEN);6 c& ]! x; P& z6 m0 ~+ f
%
仿真参数6 W/ e; H' t! ]* a4 _  `+ k
num_events=EV_LEN-1;
5 e' B+ O2 [4 z0 p5 imean_interarrival=1;8 C2 M  D  G) D* L( Z  O
mean_service=.5;
. S. N* c+ e! {/ Xnum_delays_required=2000;           %
outfile=fopen('mm1.txt','w');
- J1 W6 G5 J' I  \1 y% Efprintf(outfile, 'Single-server queueing system\n\n');& k, e, }1 B4 b+ B: n' g" U3 W2 D
fprintf(outfile, 'Mean interarrival time%11.3f minutes\n\n',mean_interarrival);9 o  U7 F. Z/ v( {7 w
fprintf(outfile, 'Mean service time%16.3f minutes\n\n', mean_service);' m" V8 E- j' S, `( S% e
fprintf(outfile, 'Number of customers%14d\n\n', num_delays_required);
%%%%%%%%%%%%%part1
( Y+ J: B. s+ U+ t& \sim_time=0.0;2 A5 C. \, H" d! s' B7 b& J
%     /* Initialize the state variables. */
    server_status   = 0;%idle- g$ q7 i2 Y, W2 x2 ?5 \  U
    num_in_q        = 0;
0 B) j5 f8 j* D0 q    time_last_event = 0.0;
  i* O5 S$ E- T  t" V1 Q. ?: l    . e! L" p0 u& w! z, ]- Q
%     /* Initialize the statistical counters. */
    num_custs_delayed  = 0;7 l! }; O* O& i1 n1 b
    total_of_delays    = 0.0;+ O' k2 F$ X( O& P+ S. T& f6 B, b
    area_num_in_q      = 0.0;# s" g; C' d, b+ |) d
    area_server_status = 0.0;
" P+ P- ~/ ^! ]6 F  M( R  A   
, U% o, N0 P$ X' S+ `+ l" @& U%     /* Initialize event list.  Since no customers are present, the departure
* `; u! [. p; Q! }# N! \' X%        (service completion) event is eliminated from consideration. */$ U- T# j- l4 ]- F6 O$ F- L
    time_next_event(EV_Arrive) = sim_time + randexp(mean_interarrival);
8 ~# p7 J+ u) _, O. e    time_next_event(EV_Depart) = 1.0e+230;

+ F& j9 G$ A% j. s    8 o7 z7 E& K" `; s& L: ~
   
: j% O: g$ [4 L) Q% E" u, d0 G. _   
6 I( @2 w: q" o/ t' l* L %%%%%%%%%%%%part2% v- u* ]: A* ^* Q  m
while (num_custs_delayed < num_delays_required)5 B  _3 d7 O: a
%Run the simulation while more delays are still needed.' y  J, Y9 r7 t; h" ~
%/* Determine the next event. */
     min_time_next_event = 1.0e+290;
# T7 @8 W9 q& f) q/ c. }! ~     next_event_type = 0;
2 d7 T/ D; u! v/ b* T* F     
% b! E- Q6 f2 ^; x& W%/* Determine the event type of the next event to occur. */
    for i = 1: num_events  L5 o9 A9 W& W  p0 o8 r
        if (time_next_event(i) < min_time_next_event) / g& C) X. j& n0 ~& W
            min_time_next_event = time_next_event(i);
4 y# E6 ?  s$ S  U            next_event_type     = i;
& Z( C+ ^: ?& Z) A/ K        end
/ I( b- N! V  @# H1 C! Z    end0 K3 h4 C/ a, n! ^$ E
   
- n: F& S8 l  j1 M. g%/* Check to see whether the event list is empty. */
    if (next_event_type == 0) # V4 n1 @: r6 F
        
1 Z0 u' B& h4 Z1 f%/* The event list is empty, so stop the simulation. */
        fprintf(outfile, '\nEvent list empty at time %f', sim_time);
8 V# R; i3 A1 e' S: R5 T& @* e        exit(1);
6 O( I. k0 ?3 S" r$ p$ Z- I    end- f; q" `' B8 t% l! y/ O# o
%/* The event list is not empty, so advance the simulation clock. */
    sim_time = min_time_next_event;
3 ?1 G; \$ [+ Q8 i8 G
+ X: ]- E/ s% n( @! B( F    & `+ B. D/ J9 `6 O3 t4 m1 N
%/* Update time-average statistical accumulators. */
    double time_since_last_event;
%/* Compute time since last event, and update last-event-time marker. */
    time_since_last_event = sim_time - time_last_event;
8 i' Q% b, c( U8 M4 [    time_last_event       = sim_time;
%/* Update area under number-in-queue function. */
    area_num_in_q=area_num_in_q +  num_in_q * time_since_last_event;
%/* Update area under server-busy indicator function. */
    area_server_status =area_server_status + server_status * time_since_last_event;4 W$ H. p# T: y. i: y! s
    " k& z! K9 A9 t- K
%/* Invoke the appropriate event function. */
%%%%%%%%%%%%%arrival
    if(next_event_type==EV_Arrive)
. r; E3 z$ M" c% [        double delay;
' z; P9 _8 P" ]5 z( l" L        4 H& W% a& ^( q. p) Z/ w& y! N
%/* Schedule next arrival. */
        time_next_event(1) = sim_time + randexp(mean_interarrival);
%/* Check to see whether server is busy. */
        if (server_status == ST_Busy) , S, |0 E, s& E% N* F6 H" s8 p4 s
            # K- |8 v5 r$ X3 [3 N$ ^
%/* Server is busy, so increment number of customers in queue. */
            num_in_q=1+num_in_q;, v+ y7 t2 X7 R) f9 L* q
            : p; {2 f! u" A& h. K. M: s- a- o9 R
%/* Check to see whether an overflow condition exists. */
            if (num_in_q > Q_LIMIT)                 
& L7 o2 m. ~% e5 i: n9 x7 o%/* The queue has overflowed, so stop the simulation. */
                fprintf(outfile, '\nOverflow of the array time_arrival at');% u7 e% y# w. n, j; Y
                fprintf(outfile, ' time %f', sim_time);: k5 P" `3 K+ c
                exit(2);4 _) p2 P( Q% _: _
            end
* k8 r0 I* G. F4 ?1 }%/* There is still room in the queue, so store the time of arrival of the arriving customer at the (new) end of time_arrival. */
            time_arrival(length(time_arrival)+1)=sim_time;
        else
7 Y2 i. |8 t; P$ z%/* Server is idle, so arriving customer has a delay of zero.  (The following two statements are for program clarity 6 X& k) `9 m- ]! C+ t
%and do not affect the results of the simulation.) */
            delay = 0.0;9 T3 C3 d8 K1 h
            total_of_delays =total_of_delays + delay;
: T! O) r' b# I3 {3 V            - T- y5 c. C2 n. o8 p% h# U4 d' [
%/* Increment the number of customers delayed, and make server busy. */
            num_custs_delayed = 1 + num_custs_delayed;& h$ l) W: V! t' x! a
            server_status = ST_Busy;
# a* n7 N# ]& B  h- W            . u1 D" G, Q4 X4 F3 A( ^+ C6 m4 F
%/* Schedule a departure (service completion). */
            time_next_event(EV_Depart) = sim_time + randexp(mean_service);5 _( L5 N' P5 H
        end %    if (server_status == ST_Busy)
; r/ w! L2 N5 S6 m%%%%%%%%depart, |0 i0 ]8 G0 u
    else7 I( ?+ p2 H, o3 z& e, G$ _8 s5 A  i
            double 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      = ST_Idle;
% k( q, D3 ^4 G5 q0 S            time_next_event(EV_Depart) = 1.0e+230;
! v1 J7 W* g" G8 r5 G4 l  N    ' m$ @. N) J2 T' O( u! z
        else
%/* The queue is nonempty, so decrement the number of customers in queue. */
            num_in_q=num_in_q-1;
%/* Compute the delay of the customer who is beginning service and update the total delay accumulator. */
            delay = sim_time - time_arrival(1);8 r* i1 f8 f" Y1 n3 Q
            total_of_delays =total_of_delays + delay;
%/* Increment the number of customers delayed, and schedule departure. */
            num_custs_delayed = 1 + num_custs_delayed;1 ^. C, H, I9 R9 t: {
            time_next_event(EV_Depart) = sim_time + randexp(mean_service);
%/* Move each customer in queue (if any) up one place. */
            tempForPop=time_arrival(2:length(time_arrival));
; c+ _: Y/ t, ?1 }; ~- z            time_arrival=tempForPop;2 C" w  U+ A2 x: o
        end %if (num_in_q == 0)
- g5 M/ b: S2 k0 o2 Z! \- Q+ Q0 e        5 w* @' s/ G0 k, N$ Z" q
    end %if(next_event_type==EV_Arrive)
; R/ `( |. k, @4 _1 L7 ?    % t! o4 t  \3 u/ B1 D& i
end %while$ ~( z. R2 t7 ]- h( t3 o( L& V. R
               
, z+ {* W0 {7 X
%%%%%%%%%% part 3
, I' v" a' \; ?- J1 K) K. v%/* Invoke the report generator and end the simulation. */
    fprintf(outfile, '\n\nAverage delay in queue%11.3f minutes\n\n',total_of_delays / num_custs_delayed);
3 J0 d. R. {9 O0 r4 v    fprintf(outfile, 'Average number in queue%10.3f\n\n',area_num_in_q / sim_time);% t( z9 J, s% I; x  [
    fprintf(outfile, 'Server utilization%15.3f\n\n',area_server_status / sim_time);6 E. |% p, S' Z
    fprintf(outfile, 'Time simulation ended%12.3f minutes', sim_time);
/ p& N2 J1 a4 X$ G# @( s6 |9 F    fclose(outfile);
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
liuyaliss        

0

主题

3

听众

439

积分

升级  46.33%

该用户从未签到

新人进步奖

回复

使用道具 举报

rockhuman        

2

主题

4

听众

415

积分

升级  38.33%

该用户从未签到

新人进步奖

回复

使用道具 举报

2

主题

5

听众

152

积分

升级  26%

该用户从未签到

回复

使用道具 举报

leeeff        

0

主题

3

听众

85

积分

升级  84.21%

该用户从未签到

回复

使用道具 举报

2

主题

4

听众

253

积分

升级  76.5%

该用户从未签到

群组: 数学建模

群组: 数学趣味、游戏、IQ等

回复

使用道具 举报

2

主题

2

听众

406

积分

升级  35.33%

该用户从未签到

新人进步奖

回复

使用道具 举报

3

主题

3

听众

41

积分

升级  37.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

GunBreaK        

0

主题

4

听众

32

积分

升级  28.42%

  • TA的每日心情
    奋斗
    2014-5-29 09:00
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    新人进步奖

    回复

    使用道具 举报

    jamesgeng        

    0

    主题

    4

    听众

    6

    积分

    升级  1.05%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-10 06:18 , Processed in 0.575287 second(s), 105 queries .

    回顶部