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;
125iter = 1;
126while ~hasConverged
127 Qlast = Q;
128 % Estimate population at
129 [Q_1,P_1,PB_1,T_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta,W);
130 % Forward MVA
131 [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1,T_1);
132 if norm(Q-Qlast)<tol || iter > maxiter
133 hasConverged = true;
134 end
135 iter = iter + 1;
136end % it
137end
138
139function [Q_1,P_1,PB_1,T_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta,W)
140P_1 = zeros(M,max(nservers),1+R);
141PB_1 = zeros(M,1+R);
142Q_1 = zeros(M,R,1+R);
143T_1 = zeros(R,1+R);
144for i=1:M
145 if nservers(i)>1
146 for j=0:(nservers(i)-1)
147 for s=0:R
148 P_1(i,1+j,1+s) = P(i,1+j);
149 end
150 end
151 for s=0:R
152 PB_1(i,1+s) = PB(i,1);
153 end
154 end
155 for r=1:R
156 for s=1:R
157 Ns = oner(N_1,s);
158 Q_1(i,r,1+s) = Ns(r)*(Q(i,r,1+0)/N_1(r) + Delta(i,r,s));
159 end
160 end
161end
162for r=1:R
163 for s=1:R
164 Nr = oner(N_1,r);
165 for i=1:M
166 if W(i,s,1+0)>0
167 T_1(s,1+r) = Nr(s)*(Q(i,s,1+0)/N_1(s) + Delta(i,r,s))/W(i,s,1+0);
168 break;
169 end
170 end
171 end
172end
173end
174
175function [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1,T_1)
176W = zeros(M,R);
177T = zeros(1,R);
178Q = zeros(M,R);
179P = zeros(M,max(nservers));
180PB = zeros(M,1);
181XR = zeros(M,R);
182C = zeros(M,R+1);
183XE = zeros(M,R,R);
184
185F = cell(1,R);
186for r=1:R
187 F{r} = zeros(M,R);
188 for ist=1:M
189 den = (L(ist,:)*T_1(:,1+r));
190 for c=1:R
191 F{r}(ist,c) = T_1(c,1+r)*L(ist,c)/den;
192 end
193 end
194end
195% Compute XR
196mu = 1./L;
197for ist=1:M
198 for r=1:R
199 if nservers(ist) > 1
200 XR(ist,r) = 0;
201 C(ist,1+r) = 0;
202 [s,n,S,D]=sprod(R,nservers(ist));
203 while s>=0
204 if all(n(:)'<=oner(N_1,r)) % Br set
205 n = n(:)';
206 Ai = exp(multinomialln(n) + n*log(F{r}(ist,:)'));
207 C(ist,1+r) = C(ist,1+r) + Ai;
208 XR(ist,r) = XR(ist,r) + Ai*(mu(ist,:)*n(:))^(-1);
209 end
210 [s,n]=sprod(s,S,D);
211 end
212 XR(ist,r) = XR(ist,r) / C(ist,1+r);
213 end
214 end
215end
216
217% Compute XE
218Cx = zeros(M,1+R);
219for ist=1:M
220 for r=1:R
221 if nservers(ist) > 1
222 for c=1:R
223 XE(ist,r,c) = 0;
224 Cx(ist,1+r) = 0;
225 [s,n,S,D]=sprod(R,nservers(ist));
226 while s>=0
227 if all(n(:)'<= oner(N_1,r) & n(c)>=1) % Axr set
228 n = n(:)';
229 Aix = exp(multinomialln(n) + n*log(F{r}(ist,:)'));
230 Cx(ist,1+r) = Cx(ist,1+r) + Aix;
231 XE(ist,r,c) = XE(ist,r,c) + Aix*(mu(ist,:)*n(:))^(-1);
232 end
233 [s,n]=sprod(s,S,D);
234 end
235 XE(ist,r,c) = XE(ist,r,c) / Cx(ist,1+r);
236 end
237 end
238 end
239end
240
241% Compute residence time
242for ist=1:M
243 for r=1:R
244 if nservers(ist) == 1
245 if type == SchedStrategy.FCFS
246 W(ist,r) = L(ist,r);
247 for c=1:R
248 W(ist,r) = W(ist,r) + L(ist,c)*Q_1(ist,c,1+r);
249 end
250 else
251 W(ist,r) = L(ist,r);
252 for c=1:R
253 W(ist,r) = W(ist,r) + L(ist,r)*Q_1(ist,c,1+r);
254 end
255 end
256 else
257 W(ist,r) = L(ist,r) + PB_1(ist,1+r)*XR(ist,r);
258 for c=1:R
259 W(ist,r) = W(ist,r) + XE(ist,r,c)*(Q_1(ist,c,1+r)-L(ist,c)*T_1(c,1+r));
260 end
261 end
262 end
263end
264% Compute throughputs and qlens
265for r=1:R
266 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
267 for ist=1:M
268 Q(ist,r) = T(r) * W(ist,r);
269 end
270end
271% Compute marginal probabilities
272for ist=1:M
273 if nservers(ist) > 1
274 P(ist,:) = 0;
275 for j=1:(nservers(ist)-1)
276 for c=1:R
277 P(ist,1+j) = P(ist,1+j) + L(ist,c)*T(c)*P_1(ist,1+(j-1),1+c)/j;
278 end
279 end
280 end
281end
282for ist=1:M
283 if nservers(ist) > 1
284 PB(ist) = 0;
285 for c=1:R
286 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);
287 end
288 end
289end
290for ist=1:M
291 if nservers(ist) > 1
292 P(ist,1+0) = max(0,1 - PB(ist));
293 for j=1:(nservers(ist)-1)
294 P(ist,1+0) = max(0,P(ist,1+0) - P(ist,1+j));
295 end
296 end
297end
298end