QQ登录

只需要一步,快速开始

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

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

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

11

主题

6

听众

51

积分

升级  48.42%

该用户从未签到

新人进步奖

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

7 |. y! v1 M# \9 m# @! K% V% V
可能有点儿乱啊~~嘿嘿
%mm1 simulation in matlab
6 _( z; a- L+ rclc;clear;
ST_Idle=0;3 z: U' n  O2 \9 j9 }
ST_Busy=1;
EV_NULL=0;& h  u* P) f3 i) u4 p- p2 H
EV_Arrive=1;' G& F$ j' G% n- l4 m* J1 b
EV_Depart=2;
3 V- ~) Z/ @! q1 c- |3 m* aEV_LEN=3;
Q_LIMIT=1000;
% next_event_type=[];5 a- y! u- C$ P, b2 a- W; c% [. J* U
% num_custs_delayed=[];
/ ^# Y6 N3 Q$ Y: v- ]; h% num_delays_required=[];5 |# N9 z5 ^8 P& X7 M' x& `
% num_events=[];
( c: f0 H- y3 B9 u0 W/ b1 T% num_in_q=[];9 \; \* c/ v( [# {7 d8 D$ R$ O' l
% server_status=[];
5 V# ^+ D% D, A9 l/ b; [9 V$ a, G% area_num_in_q=[];9 C* C. T% i; e
% area_server_status=[];
! g% ^+ m- T: I0 g% z% mean_interarrival=[];1 h. h$ g  h. d0 I: l2 B7 s: M, P
% mean_service=[];; Z6 i8 F" ?% O4 F/ M# ]; \. X
% sim_time=[];
9 I- N/ ^9 p8 y5 c% time_last_event=[];
) ^) c1 z# w) \% M% total_of_delays=[];
, K3 c1 k7 x. s6 C' v, F+ p% ( |: U4 j) J3 x5 a+ C: Q. f
time_arrival=[];                 %
到达时刻
time_next_event=zeros(1,EV_LEN);
4 N+ R6 C+ b5 I% E$ {%
仿真参数
+ L, L( u; b7 Bnum_events=EV_LEN-1;
( G/ i) ?0 I/ b9 a1 vmean_interarrival=1;
0 @- P: |( C' H" O* z* o) ~mean_service=.5;$ Y' U, a7 @4 ~, H' V7 e. c
num_delays_required=2000;           %
outfile=fopen('mm1.txt','w');
# L6 J* T6 g" V( X0 _+ q( _& Vfprintf(outfile, 'Single-server queueing system\n\n');
$ l" m7 L% ]0 _4 m) Efprintf(outfile, 'Mean interarrival time%11.3f minutes\n\n',mean_interarrival);& y0 ^- Q* E5 _
fprintf(outfile, 'Mean service time%16.3f minutes\n\n', mean_service);
- ?, `, Q; h% ^8 ~9 x1 Qfprintf(outfile, 'Number of customers%14d\n\n', num_delays_required);
%%%%%%%%%%%%%part1
7 s% s5 i  H. s0 Gsim_time=0.0;* L5 H( D8 c1 r" v
%     /* Initialize the state variables. */
    server_status   = 0;%idle2 E/ X& {" u2 ~( k9 }: K$ I
    num_in_q        = 0;
. ~- C7 s0 @7 s% k4 T' ~$ l3 g4 r3 z    time_last_event = 0.0;: U5 |4 E1 S) G9 j  Z" r( U+ j
   
1 F- K' Q! P7 m' {+ O% V0 c% D%     /* Initialize the statistical counters. */
    num_custs_delayed  = 0;
1 w8 _$ v0 [# z5 s7 \8 ^/ U; ]    total_of_delays    = 0.0;
- S2 J! @( y: [    area_num_in_q      = 0.0;$ F' T0 [/ L3 t, a+ d
    area_server_status = 0.0;, r% n% F* X, c; f
   
; p3 H+ P& |  i# Q5 ~" ?5 N%     /* Initialize event list.  Since no customers are present, the departure
8 C+ F% \. @& d' D%        (service completion) event is eliminated from consideration. */( G" s( u8 D" {! ~2 y' u5 V
    time_next_event(EV_Arrive) = sim_time + randexp(mean_interarrival);
" l+ o! S, [& R5 e! w    time_next_event(EV_Depart) = 1.0e+230;

9 \3 B2 z* T, n6 y9 n7 K    ) ~* @5 h4 r. S* h$ D
   
) v* l1 g2 y- v: q   
1 Y& e4 Q8 v) @* B: n+ D %%%%%%%%%%%%part2
' p: G+ x. H( z% bwhile (num_custs_delayed < num_delays_required)! w4 X( d) t) u3 T
%Run the simulation while more delays are still needed.6 l6 x  D" q/ U. c4 n
%/* Determine the next event. */
     min_time_next_event = 1.0e+290;
% S; u6 N& H/ `- B' |     next_event_type = 0;
6 K5 |5 a& h# _4 d7 s* [! i     , M8 u+ ~7 ?: t& s/ ?
%/* Determine the event type of the next event to occur. */
    for i = 1: num_events
# i$ d7 V8 a  R, a        if (time_next_event(i) < min_time_next_event) 8 }" R$ Z" z! ?
            min_time_next_event = time_next_event(i);
! A3 n# a9 b4 e# P1 b; ?            next_event_type     = i;) O1 Z  ^/ ^; S( }  Q
        end* d, q6 o# `/ @& a) m+ @
    end
1 r* R8 r) e; N/ I8 f9 o3 t. F* Q/ ?    + P* I) M  t; v7 a4 S) b) g; M* f
%/* Check to see whether the event list is empty. */
    if (next_event_type == 0) ' g! s6 @0 {# q
        7 e8 Z5 a$ J0 w0 B8 D7 T: K5 ?
%/* The event list is empty, so stop the simulation. */
        fprintf(outfile, '\nEvent list empty at time %f', sim_time);/ y3 |5 S3 H  ^9 l" v4 ^, g
        exit(1);
' {: }3 k/ @2 |2 ~  I    end6 a0 c4 k3 N0 |$ c5 D8 k
%/* The event list is not empty, so advance the simulation clock. */
    sim_time = min_time_next_event;* A# H! x$ x0 Z  v7 H) t

. a- b0 d# g$ f3 ?    5 z* O7 d7 m( h" N5 C2 v9 a2 h. s
%/* 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;
4 [! r8 z6 d2 m5 R$ `7 c/ r    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 s+ v' L" E8 `1 @9 Y% U( B( S9 [1 z
   
$ n# B3 o* B& T%/* Invoke the appropriate event function. */
%%%%%%%%%%%%%arrival
    if(next_event_type==EV_Arrive)' {( |% s( {, `/ }0 Z
        double delay;
0 m% P  R6 x- L4 I0 {% T        
( n% K% \% I0 K! f& y) T1 `' ]%/* Schedule next arrival. */
        time_next_event(1) = sim_time + randexp(mean_interarrival);
%/* Check to see whether server is busy. */
        if (server_status == ST_Busy)
* n1 C! E  {6 H! a: N& r            
. P, l) V* z+ Z, x, F5 ?%/* Server is busy, so increment number of customers in queue. */
            num_in_q=1+num_in_q;7 \% ?: ^4 w4 r9 V. X6 A
            
1 @" S6 [  L! s( ^%/* Check to see whether an overflow condition exists. */
            if (num_in_q > Q_LIMIT)                 4 r( ]& D/ E/ E+ o
%/* The queue has overflowed, so stop the simulation. */
                fprintf(outfile, '\nOverflow of the array time_arrival at');% j8 v  K' D4 h
                fprintf(outfile, ' time %f', sim_time);
$ a1 Q3 }1 T, l, O2 w0 J                exit(2);
8 |# o. E( @0 Q1 }& P            end- A# `* n8 |" X' G
%/* 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 ' f% e2 E* s/ S  m1 L8 W7 D
%/* Server is idle, so arriving customer has a delay of zero.  (The following two statements are for program clarity
/ H# y: X& P8 L$ t; Q1 b! U%and do not affect the results of the simulation.) */
            delay = 0.0;' u3 v0 y% M7 B8 V! |
            total_of_delays =total_of_delays + delay;- c; o3 z; Q) n
            ) a& r( v* ~, n: z( i* D0 K
%/* Increment the number of customers delayed, and make server busy. */
            num_custs_delayed = 1 + num_custs_delayed;  z8 h7 n# E! O1 G9 K( V
            server_status = ST_Busy;
- @" |& m4 b3 R: }- @8 z7 z1 e            
) X* A: t2 G1 }$ {, G" o& Y1 m%/* Schedule a departure (service completion). */
            time_next_event(EV_Depart) = sim_time + randexp(mean_service);
( t8 x4 l# h0 p        end %    if (server_status == ST_Busy)
" Q" Z) R. m8 V4 V, w5 k%%%%%%%%depart5 K4 V: }9 E/ H5 l- H
    else7 h# j- c5 g' Q# Q  X
            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;
9 \: n0 I$ [: ^& S            time_next_event(EV_Depart) = 1.0e+230;/ N! j/ y/ }8 k! ]3 ?8 b8 D0 i
   
' E6 d3 e5 C  b2 p. I* h* T        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);
9 I5 O* g; B: v( i" m% n            total_of_delays =total_of_delays + delay;
%/* Increment the number of customers delayed, and schedule departure. */
            num_custs_delayed = 1 + num_custs_delayed;
: g. q, G3 \' U* }8 R; k            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));' B! ?, F  K$ A. [
            time_arrival=tempForPop;
0 ], s) _4 V4 o1 {        end %if (num_in_q == 0)
0 v! b4 T9 q7 h' M) G        , f7 k1 ^! X( I2 }
    end %if(next_event_type==EV_Arrive)
; r- o8 K  l- v4 x' K   
( d( K! |: U9 Q7 f0 `' {end %while$ Z# p) C& L. S" H* y! ^7 X
               

( z7 G& W( [# ?%%%%%%%%%% part 3* w3 v' G$ x' c
%/* 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 p' f, N! Z; ]% p. @5 U$ x
    fprintf(outfile, 'Average number in queue%10.3f\n\n',area_num_in_q / sim_time);  E8 Y; |# t2 k% R
    fprintf(outfile, 'Server utilization%15.3f\n\n',area_server_status / sim_time);
* @- u7 I( |' ?( `6 P    fprintf(outfile, 'Time simulation ended%12.3f minutes', sim_time);1 U! H+ h3 e9 O8 y; B1 u7 Z9 k
    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-24 05:54 , Processed in 0.529781 second(s), 105 queries .

    回顶部