LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
qbd_mapmap1.m
1%{ @file qbd_mapmap1.m
2 % @brief Solves a MAP/MAP/1 queue using QBD methods
3 %
4 % @author LINE Development Team
5%}
6
7%{
8 % @brief Analyzes MAP/MAP/1 queue using Quasi-Birth-Death process
9 %
10 % @details
11 % This function solves a MAP/MAP/1 queue using QBD (Quasi-Birth-Death)
12 % methods, computing throughput, queue length, utilization, and other
13 % performance metrics.
14 %
15 % @par Syntax:
16 % @code
17 % [XN, QN, UN, pqueue, R, eta, G, A_1, A0, A1, U, MAPs] = qbd_mapmap1(MAPa, MAPs)
18 % [XN, QN, UN, pqueue, R, eta, G, A_1, A0, A1, U, MAPs] = qbd_mapmap1(MAPa, MAPs, util)
19 % @endcode
20 %
21 % @par Parameters:
22 % <table>
23 % <tr><th>Name<th>Description
24 % <tr><td>MAPa<td>Arrival process (MAP)
25 % <tr><td>MAPs<td>Service process (MAP)
26 % <tr><td>util<td>(Optional) Target utilization to scale service rate
27 % </table>
28 %
29 % @par Returns:
30 % <table>
31 % <tr><th>Name<th>Description
32 % <tr><td>XN<td>System throughput
33 % <tr><td>QN<td>Mean queue length
34 % <tr><td>UN<td>Utilization
35 % <tr><td>pqueue<td>Queue length distribution
36 % <tr><td>R<td>Rate matrix R
37 % <tr><td>eta<td>Caudal characteristic
38 % <tr><td>G<td>Rate matrix G
39 % <tr><td>A_1<td>Downward transition block
40 % <tr><td>A0<td>Local transition block
41 % <tr><td>A1<td>Upward transition block
42 % <tr><td>U<td>Matrix U
43 % <tr><td>MAPs<td>Scaled service process
44 % </table>
45%}
46function [XN,QN,UN,pqueue,R,eta,G,A_1,A0,A1,U,MAPs]=qbd_mapmap1(MAPa,MAPs,util)
47% [XN,QN,UN,PQUEUE,R,ETA]=QBD_MAPMAP1(MAPA,MAPS,UTIL)
48
49%[XN,QN,UN,pqueue,R]=qbd_mapmap1(MAPa,MAPs,util)
50na = length(MAPa{1});
51ns = length(MAPs{1});
52
53if nargin>=3%exist('util','var')
54 MAPs = map_scale(MAPs,util/map_lambda(MAPa));
55end
56util = map_lambda(MAPa) / map_lambda(MAPs);
57A1 = kron(MAPa{2},eye(ns));
58A0 = krons(MAPa{1},MAPs{1});
59A_1 = kron(eye(na),MAPs{2});
60A0bar = kron(MAPa{1},eye(ns));
61
62[G,R,U] = QBD_CR(A_1,A0,A1);
63
64alpha = max(-diag(A0));
65A0dt = A0/alpha+eye(size(A0));
66A_1dt = A_1/alpha;
67A1dt = A1/alpha;
68if nargout>5
69 [eta] = QBD_Caudal(A_1dt,A0dt,A1dt);
70end
71%%warning off;
72
73pi0exact=dtmc_solve(A0bar+R*A_1)
74pi0approx=dtmc_solve(G)
75pause
76
77pqueue = QBD_pi(A_1,A0bar,R,'MaxNumComp',1e2);
78pqueue = reshape(pqueue',length(R),length(pqueue)/length(R))';
79if sum(sum(pqueue(2:end,:)))<util*0.99
80 pqueue = QBD_pi(A_1,A0bar,R,'MaxNumComp',2e4);
81end
82
83if na == 1 && ns == 1
84 UN = 1 - pqueue(1);
85 QN=(0:(size(pqueue,1)-1))*pqueue;
86 %QN=pqueue(2,:)*inv(eye(size(R))-R)^2*ones(length(R),1);
87else
88 UN= 1 - sum(pqueue(1,:));
89 QN=(0:(size(pqueue,1)-1))*sum(pqueue,2);
90 %QN=pqueue(2,:)*inv(eye(size(R))-R)^2*ones(length(R),1);
91end
92XN=map_lambda(MAPa);
93end