1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
## Copyright (C) 2008, 2009, 2010, 2011, 2012, 2016, 2018 Moreno Marzolla
##
## This file is part of the queueing toolbox.
##
## The queueing toolbox is free software: you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation, either version 3 of the
## License, or (at your option) any later version.
##
## The queueing toolbox is distributed in the hope that it will be
## useful, but WITHOUT ANY WARRANTY; without even the implied warranty
## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with the queueing toolbox. If not, see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
##
## @deftypefn {Function File} {[@var{U}, @var{R}, @var{Q}, @var{X}] =} qncsmvablo (@var{N}, @var{S}, @var{M}, @var{P} )
##
## @cindex queueing network with blocking
## @cindex blocking queueing network
## @cindex closed network, finite capacity
## @cindex MVABLO
##
## Approximate MVA algorithm for closed queueing networks with blocking.
##
## @strong{INPUTS}
##
## @table @code
##
## @item @var{N}
## number of requests in the system. @var{N} must be strictly greater
## than zero, and less than the overall network capacity: @code{0 <
## @var{N} < sum(@var{M})}.
##
## @item @var{S}(k)
## average service time on server @math{k} (@code{@var{S}(k) > 0}).
##
## @item @var{M}(k)
## capacity of center @math{k}. The capacity is the maximum number of requests in a service
## center, including the request in service (@code{@var{M}(k) @geq{} 1}).
##
## @item @var{P}(i,j)
## probability that a request which completes
## service at server @math{i} will be transferred to server @math{j}.
##
## @end table
##
## @strong{OUTPUTS}
##
## @table @code
##
## @item @var{U}(k)
## center @math{k} utilization.
##
## @item @var{R}(k)
## average response time of service center @math{k}.
##
## @item @var{Q}(k)
## average number of requests in service center @math{k} (including
## the request in service).
##
## @item @var{X}(k)
## center @math{k} throughput.
##
## @end table
##
## @strong{REFERENCES}
##
## @itemize
## @item
## Ian F. Akyildiz, @cite{Mean Value Analysis for Blocking Queueing
## Networks}, IEEE Transactions on Software Engineering, vol. 14, n. 2,
## april 1988, pp. 418--428. @uref{http://dx.doi.org/10.1109/32.4663, 10.1109/32.4663}
## @end itemize
##
## @seealso{qnopen, qnclosed}
##
## @end deftypefn
## Author: Moreno Marzolla <moreno.marzolla(at)unibo.it>
## Web: http://www.moreno.marzolla.name/
function [U R Q X] = qncsmvablo( K, S, M, P )
## Note that we use "K" instead of "N" as the number of requests in
## order to be compliant with the paper by Akyildiz describing this
## algorithm.
if ( nargin != 4 )
print_usage();
endif
( isscalar(K) && K > 0 ) || ...
error( "K must be a positive integer" );
isvector(S) && all(S>0) || ...
error ("S must be a vector > 0");
S = S(:)'; # make S a row vector
N = length(S);
( isvector(M) && length(M) == N ) || ...
error( "M must be a vector with %d elements", N );
all( M >= 1) || ...
error( "M must be >= 1");
M = M(:)'; # make M a row vector
(K < sum(M)) || ...
error( "The population size K=%d exceeds the total system capacity %d", K, sum(M) );
[na err] = dtmcchkP(P);
( na>0 ) || ...
error( err );
rows(P) == N || ...
error("The number of rows of P must be equal to the length of S");
## Note: in this implementation we make use of the same notation found
## in Akyildiz's paper cited in the REFERENCES above, with the minor
## exception of using 'v' instead of 'e' as the visit count vector.
## k_bar(i) is the average number of jobs in the i-th server, lambda
## is the network throughput, t_bar(i) is the mean residence time
## (time spent in queue and in service) for requests in the i-th
## service center.
## Initialization
k_bar_m1 = zeros(1,N); # k_bar(k-1)
BT = zeros(1,N);
z = ones(1,N);
lambda = 0;
## Computation of the visit counts
v = qncsvisits(P);
D = S .* v; # Service demand
## Main loop
for k=1:K
do
## t_bar_i(k) = S(i) *(z_i(k) + k_bar_i(k-1))+BT_i(k)
t_bar = S .* ( z + k_bar_m1 ) + BT;
lambda = k / dot(v,t_bar);
k_bar = t_bar .* v * lambda;
if ( any(k_bar>M) )
i = find( k_bar > M, 1 );
z(i) = 0;
BT = BT + S(i) * ( v .* P(:,i)' ) / v(i);
endif
until( all(k_bar<=M) );
k_bar_m1 = k_bar;
endfor
R = t_bar;
X = v * lambda; # Throughputs
## w_bar = t_bar - S - BT; # mean waiting time
U = X .* S;
Q = X .* R;
endfunction
%!test
%! fail( "qncsmvablo( 10, [1 1], [4 5], [0 1; 1 0] )", "capacity");
%! fail( "qncsmvablo( 6, [1 1], [4 5], [0 1; 1 1] )", "stochastic");
%! fail( "qncsmvablo( 5, [1 1 1], [1 1], [0 1; 1 1] )", "3 elements");
%!test
%! # This is the example on section v) p. 422 of the reference paper
%! M = [12 10 14];
%! P = [0 1 0; 0 0 1; 1 0 0];
%! S = [1/1 1/2 1/3];
%! K = 27;
%! [U R Q X]=qncsmvablo( K, S, M, P );
%! assert( R, [11.80 1.66 14.4], 1e-2 );
%!test
%! # This is example 2, i) and ii) p. 424 of the reference paper
%! M = [4 5 5];
%! S = [1.5 2 1];
%! P = [0 1 0; 0 0 1; 1 0 0];
%! K = 10;
%! [U R Q X]=qncsmvablo( K, S, M, P );
%! assert( R, [6.925 8.061 4.185], 1e-3 );
%! K = 12;
%! [U R Q X]=qncsmvablo( K, S, M, P );
%! assert( R, [7.967 9.019 8.011], 1e-3 );
%!test
%! # This is example 3, i) and ii) p. 424 of the reference paper
%! M = [8 7 6];
%! S = [0.2 1.2 1.4];
%! P = [ 0 0.5 0.5; 1 0 0; 1 0 0 ];
%! K = 10;
%! [U R Q X] = qncsmvablo( K, S, M, P );
%! assert( R, [1.674 5.007 7.639], 1e-3 );
%! K = 12;
%! [U R Q X] = qncsmvablo( K, S, M, P );
%! assert( R, [2.166 5.372 6.567], 1e-3 );
%!test
%! # Network which never blocks, central server model
%! M = [50 50 50];
%! S = [1 1/0.8 1/0.4];
%! P = [0 0.7 0.3; 1 0 0; 1 0 0];
%! K = 40;
%! [U1 R1 Q1] = qncsmvablo( K, S, M, P );
%! V = qncsvisits(P);
%! [U2 R2 Q2] = qncsmva( K, S, V );
%! assert( U1, U2, 1e-5 );
%! assert( R1, R2, 1e-5 );
%! assert( Q1, Q2, 1e-5 );
|