LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_linearizerms.m
1%{
2%{
3 % @file pfqn_linearizerms.m
4 % @brief Multiserver Linearizer (Krzesinski/Conway/De Souza-Muntz).
5%}
6%}
7
8%{
9%{
10 % @brief Multiserver Linearizer (Krzesinski/Conway/De Souza-Muntz).
11 % @fn pfqn_linearizerms(L, N, Z, nservers, type, tol, maxiter)
12 % @param L Service demand matrix.
13 % @param N Population vector.
14 % @param Z Think time vector.
15 % @param nservers Number of servers per station.
16 % @param type Scheduling strategy per station (default: PS).
17 % @param tol Convergence tolerance (default: 1e-8).
18 % @param maxiter Maximum number of iterations (default: 1000).
19 % @return Q Mean queue lengths.
20 % @return U Utilization.
21 % @return R Residence times.
22 % @return C Cycle times.
23 % @return X System throughput.
24 % @return totiter Total iterations performed.
25%}
26%}
27function [Q,U,R,C,X,totiter] = pfqn_linearizerms(L,N,Z,nservers,type,tol,maxiter,QN0)
28% Multiserver version of Krzesinski's Linearizer as described in Conway
29% 1989, Fast Approximate Solution of Queueing Networks with Multi-Server
30% Chain- Dependent FCFS Queues.
31% Some minor adjustments based on De Souza-Muntz's description of the
32% algorithm.
33
34[M,R]=size(L);
35if nargin<5
36 type = SchedStrategy.PS * ones(M,1);
37end
38if nargin<6
39 tol = 1e-8;
40end
41if nargin<7
42 maxiter = 1000;
43end
44if nargin<8
45 QN0 = [];
46end
47
48if isempty(Z)
49 Z = zeros(1,R);
50end
51
52% Initialize
53Q = zeros(M,R,1+R);
54PB = zeros(M,1+R);
55P = zeros(M,max(nservers(:)),1+R);
56Delta = zeros(M,R,R);
57for i=1:M
58 for r=1:R
59 for s=1:R
60 Delta(i,r,s) = 0;
61 end
62 for s=0:R
63
64 N_1 = oner(N,s);
65 if isempty(QN0)
66 [~,q] = pfqn_bs(L,N_1,Z);
67 else
68 [~,q] = pfqn_bs(L,N_1,Z,tol,maxiter,QN0); % warm start
69 end
70 Q(:,r,1+s) = q(:,r);
71 end
72 end
73end
74
75for i=1:M
76 for r=1:R
77 for s=0:R
78 N_1 = oner(N,s);
79 pop = sum(N_1);
80 if nservers(i)>1
81 for j=1:(nservers(i)-1)
82 P(i,1+j,1+s) = 2*sum(Q(i,:,1+s))/(pop*(pop+1));
83 end
84 PB(i,1+s) = 2*sum(Q(i,:,1+s))/(pop+1-nservers(i))/(pop*(pop+1));
85 P(i,1+0,1+s) = 1 - PB(i,1+s) - sum(P(i,1+(1:(nservers(i)-1)),1+s));
86 end
87 end
88 end
89end
90
91totiter = 0;
92% Main loop
93for I=1:2
94 for s=0:R
95 N_1 = oner(N,s); % for k=0 it just returns N
96 % Core(N_1)
97 [Q(:,:,1+s),~,~,P(:,:,1+s),PB(:,1+s),iter] = Core(L,M,R,N_1,Z,nservers,Q(:,:,1+s),P(:,:,1+s),PB(:,1+s),Delta,type,tol,maxiter-totiter);
98 totiter = totiter + iter;
99 end
100 % Update_Delta
101 for i=1:M
102 for r=1:R
103 for s=1:R
104 Ns = oner(N,s);
105 Delta(i,r,s) = Q(i,r,1+s)/Ns(r) - Q(i,r,1+0)/N(r);
106 end
107 end
108 end
109end
110
111% Core(N)
112[Q,W,X,~,~,iter] = Core(L,M,R,N,Z,nservers,Q(:,:,1+0),P(:,:,1+0),PB(:,1+0),Delta,type,tol,maxiter-totiter);
113totiter = totiter + iter;
114% Compute performance metrics
115U = zeros(M,R);
116for i=1:M
117 for r=1:R
118 if nservers(i)==1
119 U(i,r)=X(r)*L(i,r);
120 else
121 U(i,r)=X(r)*L(i,r) / nservers(i);
122 end
123 end
124end
125Q = Q(1:M,1:R,1+0);
126C = N./X-Z;
127R = W;
128end
129
130function [Q,W,T,P,PB,iter] = Core(L,M,R,N_1,Z,nservers,Q,P,PB,Delta,type,tol,maxiter)
131iter = 0;
132W = zeros(M,R);
133T = zeros(1,R);
134hasConverged = false;
135while ~hasConverged
136 iter = iter + 1;
137 Qlast = Q;
138 % Estimate population at
139 [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta);
140 % Forward MVA
141 [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1);
142 if norm(Q-Qlast)<tol || iter > maxiter
143 hasConverged = true;
144 end
145end % it
146end
147
148function [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta)
149P_1 = zeros(M,max(nservers(:)),1+R);
150PB_1 = zeros(M,1+R);
151Q_1 = zeros(M,R);
152for i=1:M
153 if nservers(i)>1
154 for j=0:(nservers(i)-1)
155 for s=0:R
156 P_1(i,1+j,1+s) = P(i,1+j);
157 end
158 end
159 for s=0:R
160 PB_1(i,1+s) = PB(i,1);
161 end
162 end
163 for r=1:R
164 for s=1:R
165 Ns = oner(N_1,s);
166 Q_1(i,r,1+s) = Ns(r)*(Q(i,r,1+0)/N_1(r) + Delta(i,r,s));
167 end
168 end
169end
170end
171
172function [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1)
173W = zeros(M,R);
174T = zeros(1,R);
175Q = zeros(M,R);
176P = zeros(M,max(nservers(:)));
177PB = zeros(M,1);
178for ist=1:M
179 for r=1:R
180 W(ist,r) = L(ist,r)/nservers(ist);
181 if L(ist,r) == 0
182 % 0 service demand at this station => this class does not visit the current node
183 continue;
184 end
185 if type == SchedStrategy.FCFS
186 for s=1:R
187 W(ist,r) = W(ist,r) + (L(ist,s)/nservers(ist))*Q_1(ist,s,1+r);
188 end
189 else
190 for s=1:R
191 W(ist,r) = W(ist,r) + (L(ist,r)/nservers(ist))*Q_1(ist,s,1+r);
192 end
193 end
194 if nservers(ist) > 1
195 for j=0:(nservers(ist)-2)
196 if type == SchedStrategy.FCFS
197 for s=1:R
198 W(ist,r) = W(ist,r) + L(ist,s)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
199 end
200 else
201 for s=1:R
202 W(ist,r) = W(ist,r) + L(ist,r)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
203 end
204 end
205
206 end
207 end
208 end
209end
210for r=1:R
211 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
212 for ist=1:M
213 Q(ist,r) = T(r) * W(ist,r);
214 end
215end
216for ist=1:M
217 if nservers(ist) > 1
218 P(ist,:) = 0;
219 for j=1:(nservers(ist)-1)
220 for s=1:R
221 P(ist,1+j) = P(ist,1+j) + L(ist,s)*T(s)*P_1(ist,1+(j-1),1+s)/j;
222 end
223 end
224 end
225end
226for ist=1:M
227 if nservers(ist) > 1
228 PB(ist) = 0;
229 for s=1:R
230 PB(ist) = PB(ist) + L(ist,s)*T(s)*(PB_1(ist,1+s)+P_1(ist,1+nservers(ist)-1,1+s))/nservers(ist);
231 end
232 end
233end
234for ist=1:M
235 if nservers(ist) > 1
236 P(ist,1+0) = 1 - PB(ist);
237 for j=1:(nservers(ist)-1)
238 P(ist,1+0) = P(ist,1+0) - P(ist,1+j);
239 end
240 end
241end
242end
Definition Station.m:245