3 % @file pfqn_linearizerms.m
4 % @brief Multiserver Linearizer (Krzesinski/Conway/De Souza-Muntz).
10 % @brief Multiserver Linearizer (Krzesinski/Conway/De Souza-Muntz).
11 % @fn pfqn_linearizerms(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 per station (
default: PS).
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 iterations performed.
27function [Q,U,R,C,X,totiter] = pfqn_linearizerms(L,N,Z,nservers,type,tol,maxiter,QN0)
28% Multiserver version of Krzesinski
's Linearizer as described in Conway
29% 1989, Fast Approximate Solution of Queueing Networks with Multi-Server
30% Chain- Dependent FCFS Queues.
31% Some minor adjustments based on De Souza-Muntz's description of
the
36 type = SchedStrategy.PS * ones(M,1);
55P = zeros(M,max(nservers(:)),1+R);
66 [~,q] = pfqn_bs(L,N_1,Z);
68 [~,q] = pfqn_bs(L,N_1,Z,tol,maxiter,QN0); % warm start
81 for j=1:(nservers(i)-1)
82 P(i,1+j,1+s) = 2*sum(Q(i,:,1+s))/(pop*(pop+1));
84 PB(i,1+s) = 2*sum(Q(i,:,1+s))/(pop+1-nservers(i))/(pop*(pop+1));
85 P(i,1+0,1+s) = 1 - PB(i,1+s) - sum(
P(i,1+(1:(nservers(i)-1)),1+s));
95 N_1 = oner(N,s); %
for k=0 it just returns N
97 [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);
98 totiter = totiter + iter;
105 Delta(i,r,s) = Q(i,r,1+s)/Ns(r) - Q(i,r,1+0)/N(r);
112[Q,W,X,~,~,iter] = Core(L,M,R,N,Z,nservers,Q(:,:,1+0),
P(:,:,1+0),PB(:,1+0),Delta,type,tol,maxiter-totiter);
113totiter = totiter + iter;
114% Compute performance metrics
121 U(i,r)=X(r)*L(i,r) / nservers(i);
130function [Q,W,T,
P,PB,iter] = Core(L,M,R,N_1,Z,nservers,Q,
P,PB,Delta,type,tol,maxiter)
138 % Estimate population at
139 [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,
P,PB,Delta);
141 [Q,W,T,
P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1);
142 if norm(Q-Qlast)<tol || iter > maxiter
148function [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,
P,PB,Delta)
149P_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));
172function [Q,W,T,
P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1)
176P = zeros(M,max(nservers(:)));
180 W(ist,r) = L(ist,r)/nservers(ist);
182 % 0 service demand at
this station =>
this class does not visit
the current node
185 if type == SchedStrategy.FCFS
187 W(ist,r) = W(ist,r) + (L(ist,s)/nservers(ist))*Q_1(ist,s,1+r);
191 W(ist,r) = W(ist,r) + (L(ist,r)/nservers(ist))*Q_1(ist,s,1+r);
195 for j=0:(nservers(ist)-2)
196 if type == SchedStrategy.FCFS
198 W(ist,r) = W(ist,r) + L(ist,s)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
202 W(ist,r) = W(ist,r) + L(ist,r)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
211 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
213 Q(ist,r) = T(r) * W(ist,r);
219 for j=1:(nservers(ist)-1)
221 P(ist,1+j) =
P(ist,1+j) + L(ist,s)*T(s)*P_1(ist,1+(j-1),1+s)/j;
230 PB(ist) = PB(ist) + L(ist,s)*T(s)*(PB_1(ist,1+s)+P_1(ist,1+nservers(ist)-1,1+s))/nservers(ist);
236 P(ist,1+0) = 1 - PB(ist);
237 for j=1:(nservers(ist)-1)
238 P(ist,1+0) =
P(ist,1+0) -
P(ist,1+j);