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)
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
42
43if isempty(Z)
44 Z = zeros(1,R);
45end
46
47Z = sum(Z,1);
48% Initialize
49Q = zeros(M,R,1+R);
50PB = zeros(M,1+R);
51P = zeros(M,max(nservers(:)),1+R);
52Delta = zeros(M,R,R);
53for i=1:M
54 for r=1:R
55 for s=1:R
56 Delta(i,r,s) = 0;
57 end
58 for s=0:R
59 N_1 = oner(N,s);
60 Q(i,r,1+s) = N_1(r)/M;
61 end
62 end
63end
64for i=1:M
65 for r=1:R
66 for s=0:R
67 N_1 = oner(N,s);
68 pop = sum(N_1);
69 if nservers(i)>1
70 for j=1:(nservers(i)-1)
71 P(i,1+j,1+s) = 2*sum(Q(i,:,1+s))/(pop*(pop+1));
72 end
73 PB(i,1+s) = 2*sum(Q(i,:,1+s))/(pop+1-nservers(i))/(pop*(pop+1));
74 P(i,1+0,1+s) = 1 - PB(i,1+s) - sum(P(i,1+(1:(nservers(i)-1)),1+s));
75 end
76 end
77 end
78end
79
80totiter = 0;
81% Main loop
82for I=1:2
83 for s=0:R
84 N_1 = oner(N,s); % for k=0 it just returns N
85 % Core(N_1)
86 [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);
87 totiter = totiter + iter;
88 end
89 % Update_Delta
90 for i=1:M
91 for r=1:R
92 for s=1:R
93 Ns = oner(N,s);
94 if N(s)>2
95 Delta(i,r,s) = Q(i,r,1+s)/Ns(r) - Q(i,r,1+0)/N(r);
96 end
97 end
98 end
99 end
100end
101
102% Core(N)
103[Q,W,X,~,~,iter] = Core(L,M,R,N,Z,nservers,Q(:,:,1+0),P(:,:,1+0),PB(:,1+0),Delta,type,tol,maxiter);
104totiter = totiter + iter;
105% Compute performance metrics
106U = zeros(M,R);
107for i=1:M
108 for r=1:R
109 if nservers(i)==1
110 U(i,r)=X(r)*L(i,r);
111 else
112 U(i,r)=X(r)*L(i,r) / nservers(i);
113 end
114 end
115end
116
117Q = Q(1:M,1:R,1+0);
118C = N./X-Z;
119R = W;
120end
121
122function [Q,W,T,P,PB,iter] = Core(L,M,R,N_1,Z,nservers,Q,P,PB,Delta,type,tol,maxiter)
123hasConverged = false;
124W = L;
125T = zeros(1,R);
126iter = 1;
127while ~hasConverged
128 Qlast = Q;
129 % Estimate population at
130 [Q_1,P_1,PB_1,T_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta,W);
131 % Forward MVA
132 [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1,T_1);
133 if norm(Q-Qlast)<tol || iter > maxiter
134 hasConverged = true;
135 end
136 iter = iter + 1;
137end % it
138end
139
140function [Q_1,P_1,PB_1,T_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta,W)
141P_1 = zeros(M,max(nservers(:)),1+R);
142PB_1 = zeros(M,1+R);
143Q_1 = zeros(M,R,1+R);
144T_1 = zeros(R,1+R);
145for i=1:M
146 if nservers(i)>1
147 for j=0:(nservers(i)-1)
148 for s=0:R
149 P_1(i,1+j,1+s) = P(i,1+j);
150 end
151 end
152 for s=0:R
153 PB_1(i,1+s) = PB(i,1);
154 end
155 end
156 for r=1:R
157 for s=1:R
158 Ns = oner(N_1,s);
159 Q_1(i,r,1+s) = Ns(r)*(Q(i,r,1+0)/N_1(r) + Delta(i,r,s));
160 end
161 end
162end
163for r=1:R
164 for s=1:R
165 Nr = oner(N_1,r);
166 for i=1:M
167 if W(i,s,1+0)>0
168 T_1(s,1+r) = Nr(s)*(Q(i,s,1+0)/N_1(s) + Delta(i,r,s))/W(i,s,1+0);
169 break;
170 end
171 end
172 end
173end
174end
175
176function [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1,T_1)
177W = zeros(M,R);
178T = zeros(1,R);
179Q = zeros(M,R);
180P = zeros(M,max(nservers(:)));
181PB = zeros(M,1);
182XR = zeros(M,R);
183C = zeros(M,R+1);
184XE = zeros(M,R,R);
185
186F = cell(1,R);
187for r=1:R
188 F{r} = zeros(M,R);
189end
190for r=1:R
191 for ist=1:M
192 den = (L(ist,:)*T_1(:,1+r));
193 for c=1:R
194 F{r}(ist,c) = T_1(c,1+r)*L(ist,c)/den;
195 end
196 end
197end
198% Compute XR
199mu = 1./L;
200for ist=1:M
201 for r=1:R
202 if nservers(ist) > 1
203 XR(ist,r) = 0;
204 C(ist,1+r) = 0;
205 [s,n,S,D]=sprod(R,nservers(ist));
206 while s>=0
207 if all(n(:)'<=oner(N_1,r)) % Br set
208 n = n(:)';
209 Ai = exp(multinomialln(n) + n*log(F{r}(ist,:)'));
210 C(ist,1+r) = C(ist,1+r) + Ai;
211 XR(ist,r) = XR(ist,r) + Ai*(mu(ist,:)*n(:))^(-1);
212 end
213 [s,n]=sprod(s,S,D);
214 end
215 XR(ist,r) = XR(ist,r) / C(ist,1+r);
216 end
217 end
218end
219
220% Compute XE
221Cx = zeros(M,1+R);
222for ist=1:M
223 for r=1:R
224 if nservers(ist) > 1
225 for c=1:R
226 XE(ist,r,c) = 0;
227 Cx(ist,1+r) = 0;
228 [s,n,S,D]=sprod(R,nservers(ist));
229 while s>=0
230 if all(n(:)'<= oner(N_1,r) & n(c)>=1) % Axr set
231 n = n(:)';
232 Aix = exp(multinomialln(n) + n*log(F{r}(ist,:)'));
233 Cx(ist,1+r) = Cx(ist,1+r) + Aix;
234 XE(ist,r,c) = XE(ist,r,c) + Aix*(mu(ist,:)*n(:))^(-1);
235 end
236 [s,n]=sprod(s,S,D);
237 end
238 XE(ist,r,c) = XE(ist,r,c) / Cx(ist,1+r);
239 end
240 end
241 end
242end
243
244% Compute residence time
245for ist=1:M
246 for r=1:R
247 if nservers(ist) == 1
248 if type == SchedStrategy.FCFS
249 W(ist,r) = L(ist,r);
250 for c=1:R
251 W(ist,r) = W(ist,r) + L(ist,c)*Q_1(ist,c,1+r);
252 end
253 else
254 W(ist,r) = L(ist,r);
255 for c=1:R
256 W(ist,r) = W(ist,r) + L(ist,r)*Q_1(ist,c,1+r);
257 end
258 end
259 else
260 W(ist,r) = L(ist,r) + PB_1(ist,1+r)*XR(ist,r);
261 for c=1:R
262 W(ist,r) = W(ist,r) + XE(ist,r,c)*(Q_1(ist,c,1+r)-L(ist,c)*T_1(c,1+r));
263 end
264 end
265 end
266end
267% Compute throughputs and qlens
268for r=1:R
269 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
270 for ist=1:M
271 Q(ist,r) = T(r) * W(ist,r);
272 end
273end
274% Compute marginal probabilities
275for ist=1:M
276 if nservers(ist) > 1
277 P(ist,:) = 0;
278 for j=1:(nservers(ist)-1)
279 for c=1:R
280 P(ist,1+j) = P(ist,1+j) + L(ist,c)*T(c)*P_1(ist,1+(j-1),1+c)/j;
281 end
282 end
283 end
284end
285for ist=1:M
286 if nservers(ist) > 1
287 PB(ist) = 0;
288 for c=1:R
289 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);
290 end
291 end
292end
293for ist=1:M
294 if nservers(ist) > 1
295 P(ist,1+0) = max(0,1 - PB(ist));
296 for j=1:(nservers(ist)-1)
297 P(ist,1+0) = max(0,P(ist,1+0) - P(ist,1+j));
298 end
299 end
300end
301end