QQ登录

只需要一步,快速开始

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

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

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

11

主题

6

听众

51

积分

升级  48.42%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2009-8-12 13:02 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
3 l( N- W& ^! d: x; F& e; M! n. o
- D; T: t; N/ C# f4 ?; G& [
可能有点儿乱啊~~嘿嘿
%mm1 simulation in matlab
  y+ a, N( R( N5 x2 k$ Rclc;clear;
ST_Idle=0;
) G: c0 e! d+ B, x8 ?' L3 Z3 xST_Busy=1;
EV_NULL=0;
, k1 Z8 _) k/ @; sEV_Arrive=1;' [- C: X, e$ X: M4 K
EV_Depart=2;
! B2 C2 o! Z5 b. T' u! [EV_LEN=3;
Q_LIMIT=1000;
% next_event_type=[];- M* Q! J) h1 B  x6 a* O
% num_custs_delayed=[];
% p9 _5 t5 I/ t$ j% num_delays_required=[];
1 M$ Z- J' U8 b" m& o* W! m% num_events=[];# x7 o6 \( V7 x. @5 ~  z
% num_in_q=[];) s# ?1 A/ ^1 v4 f; C
% server_status=[];
0 O+ ^$ s& z1 o- y9 H/ q% area_num_in_q=[];9 D. w6 L" E& N5 N( F5 |( G
% area_server_status=[];3 i  ?0 h# h) R( X
% mean_interarrival=[];$ a* h7 m" ?2 N/ f7 q
% mean_service=[];- y$ {0 B9 X4 m% P4 u9 l
% sim_time=[];1 G. U" {9 _- O9 Z# z) g# X+ w
% time_last_event=[];& S0 P7 _, V: T6 S
% total_of_delays=[];
& ]% s8 h1 s# f5 F% $ u& r% A5 H3 b+ ?
time_arrival=[];                 %
到达时刻
time_next_event=zeros(1,EV_LEN);3 ^) Y/ c$ f; F) z* b
%
仿真参数
/ T6 j7 K0 U' _) S% mnum_events=EV_LEN-1;
& S8 S/ n3 V# D) ~" Omean_interarrival=1;! j8 h. \" v& M" c0 Y& P- }0 Y* M
mean_service=.5;/ X4 b6 ~7 h9 T& F
num_delays_required=2000;           %
outfile=fopen('mm1.txt','w');2 k( j7 s8 D! F9 i5 m6 O5 h# X
fprintf(outfile, 'Single-server queueing system\n\n');
2 N+ F  }( I/ d  M/ D5 c, |fprintf(outfile, 'Mean interarrival time%11.3f minutes\n\n',mean_interarrival);
& Y/ K  I/ z8 \1 wfprintf(outfile, 'Mean service time%16.3f minutes\n\n', mean_service);+ X& V4 G- E# t: b4 r# B
fprintf(outfile, 'Number of customers%14d\n\n', num_delays_required);
%%%%%%%%%%%%%part1
" I) z) w0 m3 s, a# ksim_time=0.0;0 k$ f% H" c9 c, t& W# C
%     /* Initialize the state variables. */
    server_status   = 0;%idle
) x0 D' Z3 Z- X5 _( f1 \& D    num_in_q        = 0;. m5 Q) ^: z) Z- w& {4 ?
    time_last_event = 0.0;' b; I4 S7 i1 b7 L: f- S" x& ^
   
6 I+ b* e5 v& I: H%     /* Initialize the statistical counters. */
    num_custs_delayed  = 0;
" x) ^' G4 V( j$ Q3 |- U/ d    total_of_delays    = 0.0;
0 `, [  h- V& z1 @; }- U7 e    area_num_in_q      = 0.0;
/ t' X9 A2 e- R* c4 X* h  @0 f    area_server_status = 0.0;
$ D" w9 x! j$ t9 {   
6 i9 E* N9 W' \" |7 b%     /* Initialize event list.  Since no customers are present, the departure
' u! i  C( M  q%        (service completion) event is eliminated from consideration. */
, W$ T4 o$ i  a6 O/ i    time_next_event(EV_Arrive) = sim_time + randexp(mean_interarrival);
$ S  N) b2 j( @, X' O/ o3 r" u    time_next_event(EV_Depart) = 1.0e+230;

  q  e/ V2 l- |9 s# G/ f4 [   
3 [. V: K' Q8 `! m" S      G* K9 I* N$ Y2 a
    5 u. k4 {4 E6 f- e3 H5 O
%%%%%%%%%%%%part2! t) D% o$ ]" V  n  h: ?4 c
while (num_custs_delayed < num_delays_required)
$ h1 u. {5 r5 V3 r%Run the simulation while more delays are still needed.
' _; t- g" @5 T% X. n# S2 u%/* Determine the next event. */
     min_time_next_event = 1.0e+290;! W/ }, u* s- D: ?7 `
     next_event_type = 0;7 q5 c' y5 X1 L) h! h
     
5 M5 f* {2 z6 i, B%/* Determine the event type of the next event to occur. */
    for i = 1: num_events1 ~" X3 z+ i4 ^
        if (time_next_event(i) < min_time_next_event) 6 u' j& S4 t$ @/ h7 D, N: V( h. S
            min_time_next_event = time_next_event(i);0 }1 z+ r3 n/ e2 \8 w* X6 a' A
            next_event_type     = i;
. F+ s$ X  u+ }* j% ^3 v. Q; d        end
# ~" D3 |# p  ~  V3 i3 z    end
6 z) l7 e& A. {$ }8 z4 ~$ I    4 {+ r6 ?& e4 }& S/ u# K
%/* Check to see whether the event list is empty. */
    if (next_event_type == 0)
* R- e2 I. U! f. {; ~. ]        & O* j& [2 U- o( V0 ^' ]
%/* The event list is empty, so stop the simulation. */
        fprintf(outfile, '\nEvent list empty at time %f', sim_time);
- M: N2 `% C6 j2 t        exit(1);
9 Y" k& \' |0 P2 b( _1 w% R    end
( G+ h; X, h7 n+ b1 C%/* The event list is not empty, so advance the simulation clock. */
    sim_time = min_time_next_event;! _/ a5 e/ P0 I' q: R; k+ |

+ t$ \0 X" \5 V7 U0 c    ( y6 H0 C1 P/ B! d+ z
%/* 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;7 i  {6 T1 k8 l  ?( v  k8 t
    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;1 R; A% e) J$ \. n
   
  Z( T1 F7 r( |4 s' a%/* Invoke the appropriate event function. */
%%%%%%%%%%%%%arrival
    if(next_event_type==EV_Arrive); a+ J2 N" v" C4 }
        double delay;
1 b" k, |$ _9 [0 y        * v" Q4 q9 a, Y% ]
%/* Schedule next arrival. */
        time_next_event(1) = sim_time + randexp(mean_interarrival);
%/* Check to see whether server is busy. */
        if (server_status == ST_Busy) 0 a) p9 E/ {# ~8 Y0 B
            8 Q; J" i; ^* ?6 b; S0 p/ `
%/* Server is busy, so increment number of customers in queue. */
            num_in_q=1+num_in_q;6 |1 d! \5 W2 S0 b8 y/ I
            
: R5 f; [1 W( @1 P%/* Check to see whether an overflow condition exists. */
            if (num_in_q > Q_LIMIT)                 
8 H3 o8 U5 B/ ~. E+ K%/* The queue has overflowed, so stop the simulation. */
                fprintf(outfile, '\nOverflow of the array time_arrival at');
+ q2 s- U( }0 }; h, G! p                fprintf(outfile, ' time %f', sim_time);/ g2 m. Q. Y6 [# ^# w
                exit(2);- u- P9 ?6 G9 X! h
            end) z* Z/ H: z: j/ {# O3 p0 ?' `
%/* 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
. o4 S" [9 \  d, U! O! U- x%/* Server is idle, so arriving customer has a delay of zero.  (The following two statements are for program clarity 8 |" D2 p  W  N, F3 Q0 P# V1 `
%and do not affect the results of the simulation.) */
            delay = 0.0;
( t% r0 {4 i% Q) ?: _            total_of_delays =total_of_delays + delay;
/ A# b; Z& ^, H2 m3 |% Y            
4 o2 ^4 u; a8 x# B- G6 Z%/* Increment the number of customers delayed, and make server busy. */
            num_custs_delayed = 1 + num_custs_delayed;3 U$ b7 D# r- P  q, f) F( H
            server_status = ST_Busy;
! L1 w# T8 I9 \. i) i            
& B. R7 o6 Q  D%/* Schedule a departure (service completion). */
            time_next_event(EV_Depart) = sim_time + randexp(mean_service);- }' e+ [1 C4 C% i, [
        end %    if (server_status == ST_Busy) 6 a' h& _& C8 y, d( q2 F
%%%%%%%%depart
0 P& H: ]# Y8 N    else
% y4 f: z' J9 h/ i* v( s            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;+ ~4 P9 D6 ~# J
            time_next_event(EV_Depart) = 1.0e+230;7 A! R) |, [* G: k
   
% N/ w4 ]" r- j& @. u        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);
% b2 S2 j" z4 y) @% C1 n6 B            total_of_delays =total_of_delays + delay;
%/* Increment the number of customers delayed, and schedule departure. */
            num_custs_delayed = 1 + num_custs_delayed;
( X7 ]3 w; T, k  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));1 @7 c: j9 Z5 R# p! p. N. ^6 l
            time_arrival=tempForPop;" ]6 W# e7 W- P) ]+ a: `
        end %if (num_in_q == 0)# T. V! B- Q/ g# k) E
        
7 a  A. v; [3 R) q    end %if(next_event_type==EV_Arrive)6 x. ^, k- c6 r7 S
   
6 M9 C1 p! d  Iend %while/ T3 O. Z) x5 T
               
, O. Z5 y7 b( |* F" n3 e0 ?
%%%%%%%%%% part 38 v/ j' h$ @- z2 l
%/* 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);$ b& F5 W. |% ~4 ~
    fprintf(outfile, 'Average number in queue%10.3f\n\n',area_num_in_q / sim_time);
6 F, t$ x- c( Y- p- C/ v( U    fprintf(outfile, 'Server utilization%15.3f\n\n',area_server_status / sim_time);
- G& M6 J4 r9 F/ w6 y" r    fprintf(outfile, 'Time simulation ended%12.3f minutes', sim_time);& z0 d6 i8 N1 ^& t7 [/ _) Q
    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-8-3 19:27 , Processed in 0.505264 second(s), 105 queries .

    回顶部