QQ登录

只需要一步,快速开始

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

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

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

11

主题

6

听众

51

积分

升级  48.42%

该用户从未签到

新人进步奖

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

9 }8 I' Y0 e/ a5 Q8 [0 T' P9 E' d2 w
可能有点儿乱啊~~嘿嘿
%mm1 simulation in matlab( H+ o- Y* T# E; ?7 m. g
clc;clear;
ST_Idle=0;
( m( Y7 f. X* T  {. VST_Busy=1;
EV_NULL=0;9 m9 S0 I% }0 @: G+ B
EV_Arrive=1;
# c- K. Z) @/ ?6 P. _* sEV_Depart=2;) V7 q' }4 T* h" W% L3 _
EV_LEN=3;
Q_LIMIT=1000;
% next_event_type=[];0 W) }, ^8 J0 d2 k' l
% num_custs_delayed=[];6 Y5 Z- F1 {' ]# d7 e/ l; g
% num_delays_required=[];; e+ x1 A; t( T6 R" X
% num_events=[];8 s# K; O2 Z3 N( g% ~. @+ h) D
% num_in_q=[];
: p: J2 b( f6 ^7 ]# A- V% server_status=[];! f3 L0 m' l; i' H: I6 ~  J
% area_num_in_q=[];
+ V' ?  x, Y' ?) m8 @6 h) y# ]% area_server_status=[];" [" G2 C$ D3 T4 M- Z' V
% mean_interarrival=[];" {- v9 C" V/ v; k
% mean_service=[];6 F$ s" P7 \+ ~/ s+ ^
% sim_time=[];9 X/ A9 \- n1 j2 o% W6 t6 s
% time_last_event=[];
4 ?" j; x/ P, q% total_of_delays=[];2 m; I# h5 o. o7 H) e, Q5 y
% & C0 e& Y  M6 U
time_arrival=[];                 %
到达时刻
time_next_event=zeros(1,EV_LEN);8 K4 q% D6 D6 h  C
%
仿真参数$ H% i$ z& Z) O% B# b; c$ A
num_events=EV_LEN-1;
$ k" O3 m$ I$ j; i% b9 i% P  Cmean_interarrival=1;
) V1 F1 h9 u% P; C" a  F4 Bmean_service=.5;  I7 k* i& B3 K3 c
num_delays_required=2000;           %
outfile=fopen('mm1.txt','w');
9 o8 y5 T6 ]! d; Xfprintf(outfile, 'Single-server queueing system\n\n');
$ Z" ~' F, y9 [$ g# s9 ofprintf(outfile, 'Mean interarrival time%11.3f minutes\n\n',mean_interarrival);% d$ n3 x3 w" m
fprintf(outfile, 'Mean service time%16.3f minutes\n\n', mean_service);
) z. \8 `% @- r! `) r6 R% Ffprintf(outfile, 'Number of customers%14d\n\n', num_delays_required);
%%%%%%%%%%%%%part1
: O8 Q4 F+ Q) G( m: ?4 w! fsim_time=0.0;8 }  \- @+ g7 K
%     /* Initialize the state variables. */
    server_status   = 0;%idle
! [% L& q5 X' ^4 H    num_in_q        = 0;
7 z; X" S1 D8 f2 m+ M3 t    time_last_event = 0.0;
2 W/ w+ T0 O) ?& i    & o8 w- _7 N6 |3 c1 v" q; d
%     /* Initialize the statistical counters. */
    num_custs_delayed  = 0;
9 [; |# Z* o  |    total_of_delays    = 0.0;
, ^* `7 \1 ^. \0 U* m    area_num_in_q      = 0.0;6 q! F. d) v% j0 _. i5 D  r% P/ A
    area_server_status = 0.0;
, _1 f6 q+ O7 O    ) g5 M' F9 N6 s- O1 N
%     /* Initialize event list.  Since no customers are present, the departure+ I0 K  n7 W: {! ?) [6 A* i$ |* C9 N
%        (service completion) event is eliminated from consideration. */+ b" W$ X& y- z9 s: l5 {4 l
    time_next_event(EV_Arrive) = sim_time + randexp(mean_interarrival);2 V/ [6 h% C: b$ `$ U: ?, j
    time_next_event(EV_Depart) = 1.0e+230;
/ m9 i2 k& T, s% k2 d3 O
   
# M; B+ ?0 ]' }6 k) Y. I    . ?  g4 R5 N* b% f5 j
   
8 m' e. }2 g* d) ` %%%%%%%%%%%%part2
$ ^0 |8 y' C+ j+ V1 P' ]' Uwhile (num_custs_delayed < num_delays_required)
8 H' G9 M9 I1 f  n# N. R, k6 `* K%Run the simulation while more delays are still needed.2 g# o, H5 Q/ b! r6 S! h, |9 c  Q' k
%/* Determine the next event. */
     min_time_next_event = 1.0e+290;
% g  Y$ j$ D7 B3 Z     next_event_type = 0;; K: @* J! ?, R2 ]6 O
     4 S* x9 O* {: y, t! J
%/* Determine the event type of the next event to occur. */
    for i = 1: num_events6 [; U- M9 C" i  q. z
        if (time_next_event(i) < min_time_next_event)
3 p6 `! f8 a0 }- G# `/ K5 l, @# K9 n            min_time_next_event = time_next_event(i);) c' i+ B! Q; p9 S& C, O
            next_event_type     = i;
+ G/ `5 M$ \) v: X  V* ?5 f+ G' k        end
  D: K: \% Y7 R. l8 G    end
, r" Q% ~& |; z1 E* j- E  _   
9 v; W5 ]; R+ R/ d9 d%/* Check to see whether the event list is empty. */
    if (next_event_type == 0) ) A! k8 U3 d7 N7 X' H7 O+ {
        - W$ ?& i5 t' B! Y1 ~
%/* The event list is empty, so stop the simulation. */
        fprintf(outfile, '\nEvent list empty at time %f', sim_time);. H1 O8 v: \6 @) ?# M& v) {
        exit(1);
0 }5 D2 }9 j8 w( p& z4 f8 D    end
/ j* c% ?  Q2 Z%/* The event list is not empty, so advance the simulation clock. */
    sim_time = min_time_next_event;
" l) e* b' g! I6 C. C: h1 Q
2 S( R; s: m' @0 q6 T" Z) C  w/ _$ [    , q+ o) }4 q# A% f, [% }8 Z9 H
%/* 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;+ D: V# F3 o2 e* P8 L, b( s
    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;/ M$ ?+ M3 Q2 e! b1 g1 J6 Q. }
    - L. y3 f3 u7 F
%/* Invoke the appropriate event function. */
%%%%%%%%%%%%%arrival
    if(next_event_type==EV_Arrive)5 N/ e& s. i) e' v
        double delay;. w0 g0 v3 S' d
        # d2 d2 \% I9 [" @1 H
%/* Schedule next arrival. */
        time_next_event(1) = sim_time + randexp(mean_interarrival);
%/* Check to see whether server is busy. */
        if (server_status == ST_Busy)
- |  i: d: {* E/ d! [            
% x3 H6 ^4 U5 I- a9 H) x% A$ X%/* Server is busy, so increment number of customers in queue. */
            num_in_q=1+num_in_q;
8 @/ V, X& N6 T8 d1 k7 c            
! o% q/ v- u7 Q3 ~3 L* B( ~%/* Check to see whether an overflow condition exists. */
            if (num_in_q > Q_LIMIT)                 
" T9 V8 L. K0 n9 a- v  ~%/* The queue has overflowed, so stop the simulation. */
                fprintf(outfile, '\nOverflow of the array time_arrival at');
6 y) p. f8 ~3 r7 B: r- q, K/ i5 F. e                fprintf(outfile, ' time %f', sim_time);: R+ v( c" p, a8 C) [& }( r9 r
                exit(2);6 V$ D$ G* A1 ]2 w7 |
            end
5 y9 Q- |  E; F+ ?) b6 E. X- [%/* 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
3 V4 W; `* D/ U%/* Server is idle, so arriving customer has a delay of zero.  (The following two statements are for program clarity 7 |) n+ M' p, s' [$ g# F8 \
%and do not affect the results of the simulation.) */
            delay = 0.0;; Y& D7 {1 z/ P3 R' j
            total_of_delays =total_of_delays + delay;
9 l( n9 t4 X9 K# U  n) A% \" l6 [            + U1 \+ O0 U9 Z  u. h# o
%/* Increment the number of customers delayed, and make server busy. */
            num_custs_delayed = 1 + num_custs_delayed;# X. N; m$ N9 m, C. C6 P5 \. p
            server_status = ST_Busy;6 F' n0 s0 o# W$ v; D& g
            
( k. u$ e& M0 [: a%/* Schedule a departure (service completion). */
            time_next_event(EV_Depart) = sim_time + randexp(mean_service);  a# w+ j- _1 ~$ P
        end %    if (server_status == ST_Busy) ! K; h5 }1 C% H* U5 Y; ^8 n4 s
%%%%%%%%depart5 D* k4 }1 K; S* j4 \
    else, n8 _0 ?" y+ j. C' \6 d! a
            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;% Q& w% X  N. I! q& P( L
            time_next_event(EV_Depart) = 1.0e+230;) g1 \- A0 }; L* r3 b1 y! ?- R. z
   
) D+ @: n- U% _& t, e' \' C2 _' D$ Q- W        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);: q- |5 d4 c) |
            total_of_delays =total_of_delays + delay;
%/* Increment the number of customers delayed, and schedule departure. */
            num_custs_delayed = 1 + num_custs_delayed;
) d5 j8 S+ _+ j; B9 h! Z' E            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));; m1 x, u4 P# `% u0 q+ h' a
            time_arrival=tempForPop;! B3 f# P. f8 `; y( X
        end %if (num_in_q == 0)
0 u1 K; Q1 ~/ ~$ [' y5 F; z        
$ j' N4 Q) M1 p3 {8 ]    end %if(next_event_type==EV_Arrive)
# M3 d2 B7 C9 G1 g) G8 E% j. r   
% c, |, ^, E- U- ]end %while  z( V( s  f9 h) Z7 C' @, I7 N
               

% \* I# Y% |! U6 p! |3 k%%%%%%%%%% part 3, Q6 @, t0 |) o7 J
%/* 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);% D: ]  q# u& b. a
    fprintf(outfile, 'Average number in queue%10.3f\n\n',area_num_in_q / sim_time);- X, v; n# n) M
    fprintf(outfile, 'Server utilization%15.3f\n\n',area_server_status / sim_time);
0 Q8 D6 K5 R7 o; z$ R$ u1 f    fprintf(outfile, 'Time simulation ended%12.3f minutes', sim_time);9 }* v; g6 l1 q- z; S
    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-5-25 18:06 , Processed in 0.527837 second(s), 106 queries .

    回顶部