LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
qsys_mapdc.m
1function result = qsys_mapdc(D0, D1, s, c, varargin)
2% QSYS_MAPDC Analyzes a MAP/D/c queue using Q-MAM.
3%
4% RESULT = QSYS_MAPDC(D0, D1, S, C) analyzes a MAP/D/c queue with:
5% D0 - MAP hidden transition matrix (n x n)
6% D1 - MAP arrival transition matrix (n x n)
7% S - Deterministic service time (positive scalar)
8% C - Number of servers (positive integer)
9%
10% RESULT = QSYS_MAPDC(..., 'maxNumComp', N) sets max queue length components (default 1000)
11% RESULT = QSYS_MAPDC(..., 'numSteps', K) sets waiting time distribution granularity (default 1)
12%
13% Returns a struct with fields:
14% meanQueueLength - Mean number of customers in system
15% meanWaitingTime - Mean waiting time in queue
16% meanSojournTime - Mean sojourn time (waiting + service)
17% utilization - Server utilization (per server)
18% queueLengthDist - Queue length distribution P(Q=n)
19% waitingTimeDist - Waiting time CDF at discrete points
20% analyzer - Name of analyzer used
21%
22% The waiting time distribution is evaluated at points {0, s/numSteps, 2*s/numSteps, ...}
23% where s is the deterministic service time and numSteps controls the granularity.
24%
25% See also Q_CT_MAP_D_C, qsys_mapmc, qsys_mapd1
26
27% Copyright (c) 2012-2026, Imperial College London
28% All rights reserved.
29
30% Parse optional arguments
31p = inputParser;
32addParameter(p, 'maxNumComp', 1000);
33addParameter(p, 'numSteps', 1);
34parse(p, varargin{:});
35
36maxNumComp = p.Results.maxNumComp;
37numSteps = p.Results.numSteps;
38
39% Input validation
40if ~isnumeric(s) || ~isreal(s) || s <= 0
41 line_error(mfilename, 'Service time s must be a positive real number');
42end
43if ~isnumeric(c) || ~isreal(c) || c < 1 || floor(c) ~= c
44 line_error(mfilename, 'Number of servers c must be a positive integer');
45end
46
47% Call Q-MAM solver
48[ql, w] = Q_CT_MAP_D_C(D0, D1, s, c, 'MaxNumComp', maxNumComp, 'NumSteps', numSteps);
49
50% Compute arrival rate from MAP
51theta = ctmc_solve(D0 + D1);
52lambda = sum(theta * D1);
53
54% Compute utilization (note: s is service time, not rate)
55rho = lambda * s / c;
56
57% Compute mean queue length from distribution
58% ql(i) = Prob[(i-1) customers in the queue]
59n = length(ql);
60meanQL = sum((0:n-1) .* ql(:)');
61
62% Compute mean waiting time from CDF
63% w(i) = Prob[waiting time <= (i-1)*s/numSteps]
64% Mean = integral of survival function = sum((1 - CDF) * stepSize)
65if ~isempty(w) && length(w) > 1
66 stepSize = s / numSteps;
67 % Survival function at each point (except the last)
68 survivalFn = 1 - w(1:end-1);
69 meanWT = sum(survivalFn(:)) * stepSize;
70else
71 % Fallback: estimate from queue length using Little's law approximation
72 meanWT = max(0, (meanQL - rho * c) / lambda);
73end
74
75% Mean service time (deterministic)
76meanService = s;
77
78% Mean sojourn time = waiting + service
79meanST = meanWT + meanService;
80
81% Build result struct
82result = struct();
83result.meanQueueLength = meanQL;
84result.meanWaitingTime = meanWT;
85result.meanSojournTime = meanST;
86result.utilization = rho;
87result.queueLengthDist = ql;
88result.waitingTimeDist = w;
89result.analyzer = sprintf('Q-MAM:MAP/D/%d', c);
90
91end