QQ登录

只需要一步,快速开始

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

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

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

11

主题

6

听众

51

积分

升级  48.42%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2009-8-12 13:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
0 [- L& j/ `) {9 a! ?9 s
5 Q/ G  Z+ a& Z' k9 y
可能有点儿乱啊~~嘿嘿
%mm1 simulation in matlab
2 e% q7 O% h. k# |$ b0 Q0 R& cclc;clear;
ST_Idle=0;
! G, z' M' p  q9 A  wST_Busy=1;
EV_NULL=0;& r6 B- V% ]+ G9 t  A# q6 z
EV_Arrive=1;
# k8 Q  [5 [# I" t7 HEV_Depart=2;1 B! d  H4 F$ }2 |) j5 v
EV_LEN=3;
Q_LIMIT=1000;
% next_event_type=[];& N) T: k( r6 z) J2 G' n# t
% num_custs_delayed=[];
6 l' c. D# M# H+ g( W+ r" X% num_delays_required=[];5 a2 T7 q/ @. S3 K
% num_events=[];
( n) [- ~4 Z' F7 d! E3 U% num_in_q=[];# g2 V- E4 a) P& |  `. r" Z
% server_status=[];
9 l! o, e. ]4 x& o. l6 Y1 q% area_num_in_q=[];
8 [1 M" k. H4 Q( n! e6 ]7 N% area_server_status=[];2 ]3 p8 n  @( s. ^& E: A
% mean_interarrival=[];
  }6 ]  {' r& R9 M5 |% mean_service=[];
% }" @/ y- r8 d7 e$ e6 n0 i, y3 v% sim_time=[];
+ a% O* Q; T+ ?% time_last_event=[];8 d% i4 s1 [; G4 c
% total_of_delays=[];; F. ^9 Y$ O) V* l! h3 g7 _; M2 v
% ! @+ Q, b$ \% q; t9 O+ l7 ^
time_arrival=[];                 %
到达时刻
time_next_event=zeros(1,EV_LEN);
3 Z) q, Q5 m7 l  r%
仿真参数
0 c/ E% ^. r( D; s  z3 K; i( Q2 t, X$ xnum_events=EV_LEN-1;
5 Y8 z3 J' d3 V$ s5 _' ]7 v  x2 G; {mean_interarrival=1;
& z! x5 \. C1 _: R; n2 ]mean_service=.5;
' c$ g; j. l( ~' Ynum_delays_required=2000;           %
outfile=fopen('mm1.txt','w');
4 ]$ z6 w' k5 N) `fprintf(outfile, 'Single-server queueing system\n\n');3 I$ V2 G2 B& m/ u# P! h2 n" w5 P5 ^
fprintf(outfile, 'Mean interarrival time%11.3f minutes\n\n',mean_interarrival);
7 _; w) ]) U6 `7 sfprintf(outfile, 'Mean service time%16.3f minutes\n\n', mean_service);
6 P/ ~" }0 ^8 w: r( R# y4 A" Afprintf(outfile, 'Number of customers%14d\n\n', num_delays_required);
%%%%%%%%%%%%%part1
/ m" a6 ^. c; L5 R- `9 Y& ~7 Rsim_time=0.0;: l- h4 @; O3 V9 ?4 S! P. U
%     /* Initialize the state variables. */
    server_status   = 0;%idle
/ r2 L' V' f. w0 _! A    num_in_q        = 0;
8 e( D! @. M% g3 X9 M8 R5 y$ I1 j    time_last_event = 0.0;! s  t% ]  z, b( k! t% m, t
   
% T0 X2 e/ z5 F7 b0 S8 ~%     /* Initialize the statistical counters. */
    num_custs_delayed  = 0;6 J) T/ y& K0 g$ n7 X* w
    total_of_delays    = 0.0;
+ H+ j9 K1 S5 Y' F1 ^  Q    area_num_in_q      = 0.0;
% k9 S5 v1 D; E: r! k: r* {    area_server_status = 0.0;$ w4 v# N* l* P/ o5 v
   
3 m/ E# q7 s( @* Z%     /* Initialize event list.  Since no customers are present, the departure
0 T8 G! J: M4 Y2 X& u' L%        (service completion) event is eliminated from consideration. */5 C4 }- v8 ?; W0 p/ _
    time_next_event(EV_Arrive) = sim_time + randexp(mean_interarrival);& r# }: W" i5 I7 s8 |, K  p2 p  u7 L
    time_next_event(EV_Depart) = 1.0e+230;
1 D; @- }5 ~/ t/ U& p
   
+ s- C" N" q3 X. Z7 K. v0 ]9 |9 R8 ]    ; w5 B0 M6 i) y/ \
    4 w9 P9 j2 [, ]' n
%%%%%%%%%%%%part2" x0 Q4 h4 n3 ?7 O
while (num_custs_delayed < num_delays_required)
2 I. B+ `3 y) {# N7 f. Y3 w%Run the simulation while more delays are still needed.; y* v: @4 j1 e7 ~! R
%/* Determine the next event. */
     min_time_next_event = 1.0e+290;& A2 f& N$ T7 T: v
     next_event_type = 0;
6 E0 X3 e6 z( y# x     
/ U# v& x  A- g; H- q%/* Determine the event type of the next event to occur. */
    for i = 1: num_events8 ^" V7 `  I3 n" V+ ~6 ~( H
        if (time_next_event(i) < min_time_next_event) * y5 g  E4 }- Y# P8 v) I# t7 M
            min_time_next_event = time_next_event(i);/ |7 D3 Q. r1 U8 s! {1 d7 u* o
            next_event_type     = i;& l% n; D8 H& `; S* i7 x( E/ o
        end
) d5 ?8 V& m  ^& B- O5 s    end' W# t- p" [) w+ r; p
    4 X! I; F) m* e" q* C
%/* Check to see whether the event list is empty. */
    if (next_event_type == 0)
0 u( M4 f8 F2 R        
6 B8 z. e  {2 n7 ]6 Y%/* The event list is empty, so stop the simulation. */
        fprintf(outfile, '\nEvent list empty at time %f', sim_time);  d1 V/ m+ l1 ?& ^  k0 i/ Z3 s2 e
        exit(1);
2 N$ c! A! ]' k% Q, _, \    end. P& G1 r( U- S
%/* The event list is not empty, so advance the simulation clock. */
    sim_time = min_time_next_event;
0 X0 k5 J' j3 I( I# H* e2 d
2 b3 z+ u, g/ \4 W" R# T   
- y( H* c! M9 Y2 C& U0 e8 I( b%/* 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;+ Z& `5 b: f  Z2 N8 g
    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;$ F, H' }3 X- }( l
   
- J* v- p3 i$ l% O! |%/* Invoke the appropriate event function. */
%%%%%%%%%%%%%arrival
    if(next_event_type==EV_Arrive)
6 e2 X3 @4 x) X9 j& R/ [+ q0 P: d& g        double delay;$ h9 T( N- M' Q" d, t
        
7 {9 C* P* F+ q* \%/* Schedule next arrival. */
        time_next_event(1) = sim_time + randexp(mean_interarrival);
%/* Check to see whether server is busy. */
        if (server_status == ST_Busy)
# I4 p) o! Q( S5 e+ @            2 Z; s2 d& t9 ]5 Z7 \; g- B
%/* Server is busy, so increment number of customers in queue. */
            num_in_q=1+num_in_q;
& x  k* h/ {: F4 y+ E            
, f4 E, W( `; A4 D0 r% V8 {%/* Check to see whether an overflow condition exists. */
            if (num_in_q > Q_LIMIT)                 ) M  Z3 B1 v" g- ^
%/* The queue has overflowed, so stop the simulation. */
                fprintf(outfile, '\nOverflow of the array time_arrival at');
/ P3 D( j/ k* |) a                fprintf(outfile, ' time %f', sim_time);
7 R  H$ O0 c# R# ~: Q9 X                exit(2);
9 [! v' w* u" q" f            end; f( C9 }( ^- B. p- Q2 |4 P
%/* 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 2 z7 j' m+ j7 S1 r- f" [
%/* Server is idle, so arriving customer has a delay of zero.  (The following two statements are for program clarity + D; @% @9 G! M6 e
%and do not affect the results of the simulation.) */
            delay = 0.0;
7 l% H& o# N* A! o0 B2 ~) ?            total_of_delays =total_of_delays + delay;4 `, A5 s6 R4 [
            
6 Q* v- \' N9 N%/* Increment the number of customers delayed, and make server busy. */
            num_custs_delayed = 1 + num_custs_delayed;
9 V) {0 \8 E% e1 a* V) d  y. X            server_status = ST_Busy;
: `1 G; H2 T' `            
* L5 ^0 h5 _: O; g8 \# M%/* Schedule a departure (service completion). */
            time_next_event(EV_Depart) = sim_time + randexp(mean_service);2 Y3 T) k, Z! B  r$ k2 w; o; @
        end %    if (server_status == ST_Busy)
/ g/ Y3 i) p* Y8 }%%%%%%%%depart" z6 [  d2 R$ h3 V2 Y& @" |8 O
    else. a- l" _; s: f5 e: a  Q$ n
            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;
& R$ m# h) m( H- f0 a$ {! n$ q+ N            time_next_event(EV_Depart) = 1.0e+230;
. l" k) I/ m1 Y- k. {+ @    ; T9 n) L. R  x! u+ Q9 K; c
        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);
; H( D3 _; {* `5 K( U            total_of_delays =total_of_delays + delay;
%/* Increment the number of customers delayed, and schedule departure. */
            num_custs_delayed = 1 + num_custs_delayed;
% j; Z7 |- ]3 v$ T: v4 a# w            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));. G! H+ c  J) R7 I: g
            time_arrival=tempForPop;% m0 m: ?  ^* m2 R# W% o1 }4 Z
        end %if (num_in_q == 0). ?( f/ @5 D* G8 v- P
        
: w0 E2 |4 ]% Y$ h4 A3 G    end %if(next_event_type==EV_Arrive)
9 v3 V( Z- P; m4 b0 ]7 u    , a7 ^$ K; b- Z
end %while
- b- O9 @- \) l2 p               
+ c: O! b8 U. h- {# l
%%%%%%%%%% part 3, i0 x5 Y6 p% J- F$ X
%/* 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);
4 v/ P! U: z, u5 G* ]. h, [3 Z    fprintf(outfile, 'Average number in queue%10.3f\n\n',area_num_in_q / sim_time);1 e! N/ O9 q* M2 f: U
    fprintf(outfile, 'Server utilization%15.3f\n\n',area_server_status / sim_time);1 x' s0 h1 F, L4 l
    fprintf(outfile, 'Time simulation ended%12.3f minutes', sim_time);* u. I3 B* d4 @7 z, U/ r
    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-7-10 01:32 , Processed in 0.508591 second(s), 106 queries .

    回顶部