1function result = qsys_mapmc(D0, D1, mu, c, varargin)
2% QSYS_MAPMC Analyzes a MAP/M/c queue
using Q-MAM.
4% RESULT = QSYS_MAPMC(D0, D1, MU, C) analyzes a MAP/M/c queue with:
5% D0 - MAP hidden transition matrix (n x n)
6% D1 - MAP arrival transition matrix (n x n)
7% MU - Exponential service rate
10% RESULT = QSYS_MAPMC(...,
'maxNumComp', N) sets max queue length probs (
default 500)
12% Returns a
struct with fields:
13% meanQueueLength - Mean number of customers in system
14% meanWaitingTime - Mean waiting time in queue
15% meanSojournTime - Mean sojourn time (waiting + service)
16% utilization - Server utilization (per server)
17% queueLengthDist - Queue length distribution
P(Q=n)
18% waitingTimePH - Struct with alpha and T for waiting time PH
19% analyzer - Name of analyzer used
21% See also Q_CT_MAP_M_C, qsys_mapph1, qsys_mapm1
23% Parse optional arguments
25addParameter(p, 'maxNumComp', 500);
28maxNumComp = p.Results.maxNumComp;
31[ql, wait_alpha, Smat] = Q_CT_MAP_M_C(D0, D1, mu, c, 'MaxNumComp', maxNumComp);
33% Compute arrival rate from MAP
34theta = ctmc_solve(D0 + D1);
35lambda = sum(theta * D1);
38rho = lambda / (mu * c);
40% Compute mean queue length from distribution
43 meanQL = meanQL + (i - 1) * ql(i);
46% Compute mean waiting time from PH representation
47if ~isempty(wait_alpha) && ~isempty(Smat)
48 % Mean of PH distribution = alpha * (-T)^{-1} * e
49 nonzeroIdx = find(wait_alpha > 0);
50 if ~isempty(nonzeroIdx)
51 wait_alpha_nz = wait_alpha(nonzeroIdx);
53 meanWT = wait_alpha_nz * negSinv * ones(size(Smat, 1), 1);
62meanService = 1.0 / mu;
64% Mean sojourn time = waiting + service
65meanST = meanWT + meanService;
69result.meanQueueLength = meanQL;
70result.meanWaitingTime = meanWT;
71result.meanSojournTime = meanST;
72result.utilization = rho;
73result.queueLengthDist = ql;
74result.waitingTimePH =
struct(
'alpha', wait_alpha,
'T', Smat);
75result.analyzer = sprintf(
'Q-MAM:MAP/M/%d', c);