LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_conwayms.m
1%{
2%{
3 % @file pfqn_conwayms.m
4 % @brief Multiserver Linearizer approximation (Conway 1989).
5%}
6%}
7
8%{
9%{
10 % @brief Multiserver Linearizer approximation (Conway 1989).
11 % @fn pfqn_conwayms(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 type per station (default: FCFS).
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 number of iterations.
25%}
26%}
27function [Q,U,R,C,X,totiter] = pfqn_conwayms(L,N,Z,nservers,type,tol,maxiter,QN0)
28% Multiserver version of Linearizer as described in Conway 1989, Fast
29% Approximate Solution of Queueing Networks with Multi-Server Chain-
30% Dependent FCFS Queues
31
32[M,R]=size(L);
33if nargin<5
34 type = SchedStrategy.FCFS * ones(M,1);
35end
36if nargin<6
37 tol = 1e-8;
38end
39if nargin<7
40 maxiter = 1000;
41end
42if nargin<8
43 QN0 = [];
44end
45
46if isempty(Z)
47 Z = zeros(1,R);
48end
49
50Z = sum(Z,1);
51% Initialize
52Q = zeros(M,R,1+R);
53PB = zeros(M,1+R);
54P = zeros(M,max(nservers(:)),1+R);
55Delta = zeros(M,R,R);
56for i=1:M
57 for r=1:R
58 for s=1:R
59 Delta(i,r,s) = 0;
60 end
61 for s=0:R
62 N_1 = oner(N,s);
63 if isempty(QN0)
64 Q(i,r,1+s) = N_1(r)/M;
65 else
66 Q(i,r,1+s) = QN0(i,r); % warm start from supplied queue lengths
67 end
68 end
69 end
70end
71for i=1:M
72 for r=1:R
73 for s=0:R
74 N_1 = oner(N,s);
75 pop = sum(N_1);
76 if nservers(i)>1
77 for j=1:(nservers(i)-1)
78 P(i,1+j,1+s) = 2*sum(Q(i,:,1+s))/(pop*(pop+1));
79 end
80 PB(i,1+s) = 2*sum(Q(i,:,1+s))/(pop+1-nservers(i))/(pop*(pop+1));
81 P(i,1+0,1+s) = 1 - PB(i,1+s) - sum(P(i,1+(1:(nservers(i)-1)),1+s));
82 end
83 end
84 end
85end
86
87totiter = 0;
88% Main loop
89for I=1:2
90 for s=0:R
91 N_1 = oner(N,s); % for k=0 it just returns N
92 % Core(N_1)
93 [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);
94 totiter = totiter + iter;
95 end
96 % Update_Delta
97 for i=1:M
98 for r=1:R
99 for s=1:R
100 Ns = oner(N,s);
101 if N(s)>2
102 Delta(i,r,s) = Q(i,r,1+s)/Ns(r) - Q(i,r,1+0)/N(r);
103 end
104 end
105 end
106 end
107end
108
109% Core(N)
110[Q,W,X,~,~,iter] = Core(L,M,R,N,Z,nservers,Q(:,:,1+0),P(:,:,1+0),PB(:,1+0),Delta,type,tol,maxiter);
111totiter = totiter + iter;
112% Compute performance metrics
113U = zeros(M,R);
114for i=1:M
115 for r=1:R
116 if nservers(i)==1
117 U(i,r)=X(r)*L(i,r);
118 else
119 U(i,r)=X(r)*L(i,r) / nservers(i);
120 end
121 end
122end
123
124Q = Q(1:M,1:R,1+0);
125C = N./X-Z;
126R = W;
127end
128
129function [Q,W,T,P,PB,iter] = Core(L,M,R,N_1,Z,nservers,Q,P,PB,Delta,type,tol,maxiter)
130hasConverged = false;
131W = L;
132T = zeros(1,R);
133iter = 1;
134while ~hasConverged
135 Qlast = Q;
136 % Estimate population at
137 [Q_1,P_1,PB_1,T_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta,W);
138 % Forward MVA
139 [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1,T_1);
140 if norm(Q-Qlast)<tol || iter > maxiter
141 hasConverged = true;
142 end
143 iter = iter + 1;
144end % it
145end
146
147function [Q_1,P_1,PB_1,T_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta,W)
148P_1 = zeros(M,max(nservers(:)),1+R);
149PB_1 = zeros(M,1+R);
150Q_1 = zeros(M,R,1+R);
151T_1 = zeros(R,1+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
170for r=1:R
171 for s=1:R
172 Nr = oner(N_1,r);
173 for i=1:M
174 if W(i,s,1+0)>0
175 T_1(s,1+r) = Nr(s)*(Q(i,s,1+0)/N_1(s) + Delta(i,r,s))/W(i,s,1+0);
176 break;
177 end
178 end
179 end
180end
181end
182
183function [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1,T_1)
184W = zeros(M,R);
185T = zeros(1,R);
186Q = zeros(M,R);
187P = zeros(M,max(nservers(:)));
188PB = zeros(M,1);
189XR = zeros(M,R);
190C = zeros(M,R+1);
191XE = zeros(M,R,R);
192
193F = cell(1,R);
194for r=1:R
195 F{r} = zeros(M,R);
196end
197for r=1:R
198 for ist=1:M
199 den = (L(ist,:)*T_1(:,1+r));
200 for c=1:R
201 F{r}(ist,c) = T_1(c,1+r)*L(ist,c)/den;
202 end
203 end
204end
205% Compute XR
206mu = 1./L;
207for ist=1:M
208 for r=1:R
209 if nservers(ist) > 1
210 XR(ist,r) = 0;
211 C(ist,1+r) = 0;
212 [s,n,S,D]=sprod(R,nservers(ist));
213 while s>=0
214 if all(n(:)'<=oner(N_1,r)) % Br set
215 n = n(:)';
216 Ai = exp(multinomialln(n) + n*log(F{r}(ist,:)'));
217 C(ist,1+r) = C(ist,1+r) + Ai;
218 XR(ist,r) = XR(ist,r) + Ai*(mu(ist,:)*n(:))^(-1);
219 end
220 [s,n]=sprod(s,S,D);
221 end
222 XR(ist,r) = XR(ist,r) / C(ist,1+r);
223 end
224 end
225end
226
227% Compute XE
228Cx = zeros(M,1+R);
229for ist=1:M
230 for r=1:R
231 if nservers(ist) > 1
232 for c=1:R
233 XE(ist,r,c) = 0;
234 Cx(ist,1+r) = 0;
235 [s,n,S,D]=sprod(R,nservers(ist));
236 while s>=0
237 if all(n(:)'<= oner(N_1,r) & n(c)>=1) % Axr set
238 n = n(:)';
239 Aix = exp(multinomialln(n) + n*log(F{r}(ist,:)'));
240 Cx(ist,1+r) = Cx(ist,1+r) + Aix;
241 XE(ist,r,c) = XE(ist,r,c) + Aix*(mu(ist,:)*n(:))^(-1);
242 end
243 [s,n]=sprod(s,S,D);
244 end
245 XE(ist,r,c) = XE(ist,r,c) / Cx(ist,1+r);
246 end
247 end
248 end
249end
250
251% Compute residence time
252for ist=1:M
253 for r=1:R
254 if nservers(ist) == 1
255 if type == SchedStrategy.FCFS
256 W(ist,r) = L(ist,r);
257 for c=1:R
258 W(ist,r) = W(ist,r) + L(ist,c)*Q_1(ist,c,1+r);
259 end
260 else
261 W(ist,r) = L(ist,r);
262 for c=1:R
263 W(ist,r) = W(ist,r) + L(ist,r)*Q_1(ist,c,1+r);
264 end
265 end
266 else
267 W(ist,r) = L(ist,r) + PB_1(ist,1+r)*XR(ist,r);
268 for c=1:R
269 W(ist,r) = W(ist,r) + XE(ist,r,c)*(Q_1(ist,c,1+r)-L(ist,c)*T_1(c,1+r));
270 end
271 end
272 end
273end
274% Compute throughputs and qlens
275for r=1:R
276 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
277 for ist=1:M
278 Q(ist,r) = T(r) * W(ist,r);
279 end
280end
281% Compute marginal probabilities
282for ist=1:M
283 if nservers(ist) > 1
284 P(ist,:) = 0;
285 for j=1:(nservers(ist)-1)
286 for c=1:R
287 P(ist,1+j) = P(ist,1+j) + L(ist,c)*T(c)*P_1(ist,1+(j-1),1+c)/j;
288 end
289 end
290 end
291end
292for ist=1:M
293 if nservers(ist) > 1
294 PB(ist) = 0;
295 for c=1:R
296 PB(ist) = PB(ist) + L(ist,c)*T(c)*(PB_1(ist,1+c)+P_1(ist,1+nservers(ist)-1,1+c))/nservers(ist);
297 end
298 end
299end
300for ist=1:M
301 if nservers(ist) > 1
302 P(ist,1+0) = max(0,1 - PB(ist));
303 for j=1:(nservers(ist)-1)
304 P(ist,1+0) = max(0,P(ist,1+0) - P(ist,1+j));
305 end
306 end
307end
308end