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,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
34 type = SchedStrategy.FCFS * ones(M,1);
54P = zeros(M,max(nservers(:)),1+R);
64 Q(i,r,1+s) = N_1(r)/M;
66 Q(i,r,1+s) = QN0(i,r); % warm start from supplied queue lengths
77 for j=1:(nservers(i)-1)
78 P(i,1+j,1+s) = 2*sum(Q(i,:,1+s))/(pop*(pop+1));
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));
91 N_1 = oner(N,s); %
for k=0 it just returns N
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;
102 Delta(i,r,s) = Q(i,r,1+s)/Ns(r) - Q(i,r,1+0)/N(r);
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
119 U(i,r)=X(r)*L(i,r) / nservers(i);
129function [Q,W,T,
P,PB,iter] = Core(L,M,R,N_1,Z,nservers,Q,
P,PB,Delta,type,tol,maxiter)
136 % Estimate population at
137 [Q_1,P_1,PB_1,T_1] = Estimate(M,R,N_1,nservers,Q,
P,PB,Delta,W);
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
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);
154 for j=0:(nservers(i)-1)
156 P_1(i,1+j,1+s) =
P(i,1+j);
160 PB_1(i,1+s) = PB(i,1);
166 Q_1(i,r,1+s) = Ns(r)*(Q(i,r,1+0)/N_1(r) + Delta(i,r,s));
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);
183function [Q,W,T,
P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1,T_1)
187P = zeros(M,max(nservers(:)));
199 den = (L(ist,:)*T_1(:,1+r));
201 F{r}(ist,c) = T_1(c,1+r)*L(ist,c)/den;
212 [s,n,S,D]=sprod(R,nservers(ist));
214 if all(n(:)
'<=oner(N_1,r)) % Br set
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);
222 XR(ist,r) = XR(ist,r) / C(ist,1+r);
235 [s,n,S,D]=sprod(R,nservers(ist));
237 if all(n(:)'<= oner(N_1,r) & n(c)>=1) % Axr set
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);
245 XE(ist,r,c) = XE(ist,r,c) / Cx(ist,1+r);
251% Compute residence time
254 if nservers(ist) == 1
255 if type == SchedStrategy.FCFS
258 W(ist,r) = W(ist,r) + L(ist,c)*Q_1(ist,c,1+r);
263 W(ist,r) = W(ist,r) + L(ist,r)*Q_1(ist,c,1+r);
267 W(ist,r) = L(ist,r) + PB_1(ist,1+r)*XR(ist,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));
274% Compute throughputs and qlens
276 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
278 Q(ist,r) = T(r) * W(ist,r);
281% Compute marginal probabilities
285 for j=1:(nservers(ist)-1)
287 P(ist,1+j) =
P(ist,1+j) + L(ist,c)*T(c)*P_1(ist,1+(j-1),1+c)/j;
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);
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));