2 % @brief Solves a MAP/MAP/1 queue
using QBD methods
4 % @author LINE Development Team
8 % @brief Analyzes MAP/MAP/1 queue
using Quasi-Birth-Death process
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.
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)
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
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
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)
49%[XN,QN,UN,pqueue,R]=qbd_mapmap1(MAPa,MAPs,util)
53if nargin>=3%exist(
'util',
'var')
54 MAPs = map_scale(MAPs,util/map_lambda(MAPa));
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));
62[G,R,U] = QBD_CR(A_1,A0,A1);
64alpha = max(-diag(A0));
65A0dt = A0/alpha+eye(size(A0));
69 [eta] = QBD_Caudal(A_1dt,A0dt,A1dt);
73pi0exact=dtmc_solve(A0bar+R*A_1)
74pi0approx=dtmc_solve(G)
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);
85 QN=(0:(size(pqueue,1)-1))*pqueue;
86 %QN=pqueue(2,:)*inv(eye(size(R))-R)^2*ones(length(R),1);
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);