LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_linearizermx.m
1%{
2%{
3 % @file pfqn_linearizermx.m
4 % @brief Linearizer for mixed open/closed queueing networks.
5%}
6%}
7
8%{
9%{
10 % @brief Linearizer for mixed open/closed queueing networks.
11 % @fn pfqn_linearizermx(lambda, L, N, Z, nservers, type, tol, maxiter, method)
12 % @param lambda Arrival rate vector (inf for closed classes).
13 % @param L Service demand matrix.
14 % @param N Population vector (inf for open classes).
15 % @param Z Think time vector.
16 % @param nservers Number of servers per station.
17 % @param type Scheduling strategy per station.
18 % @param tol Convergence tolerance (default: 1e-8).
19 % @param maxiter Maximum iterations (default: 1000).
20 % @param method Linearizer variant ('lin', 'gflin', 'egflin', default: 'egflin').
21 % @return QN Mean queue lengths.
22 % @return UN Utilization.
23 % @return WN Waiting times.
24 % @return CN Cycle times.
25 % @return XN System throughput.
26 % @return totiter Total iterations.
27%}
28%}
29function [QN,UN,WN,CN,XN,totiter] = pfqn_linearizermx(lambda,L,N,Z,nservers,type,tol,maxiter,method)
30% function [Q,U,W,C,X,totiter] = PFQN_LINEARIZERMX(lambda,L,N,Z,nservers,type,tol,maxiter,method)
31
32if nargin<4
33 maxiter = 1000;
34end
35if nargin<5
36 tol = 1e-8;
37end
38if nargin<9
39 method = 'egflin';
40end
41
42if any(N(lambda>0)>0 & isfinite(N(lambda>0)))
43 line_error(mfilename,'Arrival rate cannot be specified on closed classes.');
44end
45
46[M,R] = size(L);
47if nargin<6 || isempty(type)
48 type = ones(M,1)*SchedStrategy.PS;
49end
50
51lambda(isnan(lambda))= 0;
52L(isnan(L))=0;
53Z(isnan(Z))=0;
54openClasses = find(isinf(N));
55closedClasses = setdiff(1:length(N), openClasses);
56
57XN = zeros(1,R);
58UN = zeros(M,R);
59WN = zeros(M,R);
60QN = zeros(M,R);
61CN = zeros(1,R);
62for ridx=1:length(openClasses)
63 r = openClasses(ridx);
64 for ist=1:M
65 UN(ist,r) = lambda(r)*L(ist,r);
66 end
67 XN(r) = lambda(r);
68end
69
70UNt = sum(UN,2);
71
72if isempty(Z)
73 Z = zeros(1,R);
74else
75 Z = sum(Z,1);
76end
77Dc = L(:,closedClasses) ./ (1-repmat(UNt,1,length((closedClasses))));
78
79if max(nservers(:))==1
80 switch method
81 case {'default','lin'}
82 [QNc,UNc,WNc,CNc,XNc,totiter] = pfqn_linearizer(Dc,N(closedClasses),Z(closedClasses),type,tol,maxiter);
83 case 'gflin'
84 linAlpha = 2.0;
85 [QNc,UNc,WNc,CNc,XNc,totiter] = pfqn_gflinearizer(Dc,N(closedClasses),Z(closedClasses),type,tol,maxiter,linAlpha);
86 case 'egflin'
87 alphaM = zeros(1,R);
88 for ridx=1:length(closedClasses)
89 r = closedClasses(ridx);
90 alphaM(r) = 0.6 + 1.4 * exp(-8 * exp(-0.8 * N(r)));
91 end
92 [QNc,UNc,WNc,CNc,XNc,totiter] = pfqn_egflinearizer(Dc,N(closedClasses),Z(closedClasses),type,tol,maxiter,alphaM);
93 otherwise
94 [QNc,UNc,WNc,CNc,XNc,totiter] = pfqn_linearizer(Dc,N(closedClasses),Z(closedClasses),type,tol,maxiter);
95 end
96else
97 [QNc,UNc,WNc,CNc,XNc,totiter] = pfqn_linearizerms(Dc,N(closedClasses),Z(closedClasses),nservers,type,tol,maxiter);
98end
99
100XN(closedClasses) = XNc;
101QN(:,closedClasses) = QNc;
102WN(:,closedClasses) = WNc;
103UN(:,closedClasses) = UNc;
104CN(closedClasses) = CNc;
105
106for ist = 1:M
107 for ridx=1:length(closedClasses)
108 r = closedClasses(ridx);
109 UN(ist,r) = XN(r)*L(ist,r);
110 end
111end
112for ist = 1:M
113 for ridx=1:length(openClasses)
114 r = openClasses(ridx);
115 if isempty(QNc)
116 WN(ist,r) = L(ist,r) / (1-UNt(ist));
117 else
118 WN(ist,r) = L(ist,r) * (1+sum(QNc(ist,:))) / (1-UNt(ist));
119 end
120 QN(ist,r) = WN(ist,r) * XN(r);
121 end
122end
123CN(openClasses) = sum(WN(:,openClasses),1);
124end
125