3 % @file pfqn_conwayms.m
4 % @brief Multiserver Linearizer approximation (Conway 1989).
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.
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
34 type = SchedStrategy.FCFS * ones(M,1);
51P = zeros(M,max(nservers),1+R);
60 Q(i,r,1+s) = N_1(r)/M;
70 for j=1:(nservers(i)-1)
71 P(i,1+j,1+s) = 2*sum(Q(i,:,1+s))/(pop*(pop+1));
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));
84 N_1 = oner(N,s); %
for k=0 it just returns N
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;
95 Delta(i,r,s) = Q(i,r,1+s)/Ns(r) - Q(i,r,1+0)/N(r);
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
112 U(i,r)=X(r)*L(i,r) / nservers(i);
122function [Q,W,T,
P,PB,iter] = Core(L,M,R,N_1,Z,nservers,Q,
P,PB,Delta,type,tol,maxiter)
128 % Estimate population at
129 [Q_1,P_1,PB_1,T_1] = Estimate(M,R,N_1,nservers,Q,
P,PB,Delta,W);
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
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);
146 for j=0:(nservers(i)-1)
148 P_1(i,1+j,1+s) =
P(i,1+j);
152 PB_1(i,1+s) = PB(i,1);
158 Q_1(i,r,1+s) = Ns(r)*(Q(i,r,1+0)/N_1(r) + Delta(i,r,s));
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);
175function [Q,W,T,
P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1,T_1)
179P = zeros(M,max(nservers));
189 den = (L(ist,:)*T_1(:,1+r));
191 F{r}(ist,c) = T_1(c,1+r)*L(ist,c)/den;
202 [s,n,S,D]=sprod(R,nservers(ist));
204 if all(n(:)
'<=oner(N_1,r)) % Br set
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);
212 XR(ist,r) = XR(ist,r) / C(ist,1+r);
225 [s,n,S,D]=sprod(R,nservers(ist));
227 if all(n(:)'<= oner(N_1,r) & n(c)>=1) % Axr set
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);
235 XE(ist,r,c) = XE(ist,r,c) / Cx(ist,1+r);
241% Compute residence time
244 if nservers(ist) == 1
245 if type == SchedStrategy.FCFS
248 W(ist,r) = W(ist,r) + L(ist,c)*Q_1(ist,c,1+r);
253 W(ist,r) = W(ist,r) + L(ist,r)*Q_1(ist,c,1+r);
257 W(ist,r) = L(ist,r) + PB_1(ist,1+r)*XR(ist,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));
264% Compute throughputs and qlens
266 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
268 Q(ist,r) = T(r) * W(ist,r);
271% Compute marginal probabilities
275 for j=1:(nservers(ist)-1)
277 P(ist,1+j) =
P(ist,1+j) + L(ist,c)*T(c)*P_1(ist,1+(j-1),1+c)/j;
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);
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));