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)
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);
52P = zeros(M,max(nservers),1+R);
62 [~,q] = pfqn_bs(L,N_1,Z);
74 for j=1:(nservers(i)-1)
75 P(i,1+j,1+s) = 2*sum(Q(i,:,1+s))/(pop*(pop+1));
77 PB(i,1+s) = 2*sum(Q(i,:,1+s))/(pop+1-nservers(i))/(pop*(pop+1));
78 P(i,1+0,1+s) = 1 - PB(i,1+s) - sum(
P(i,1+(1:(nservers(i)-1)),1+s));
88 N_1 = oner(N,s); %
for k=0 it just returns N
90 [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);
91 totiter = totiter + iter;
98 Delta(i,r,s) = Q(i,r,1+s)/Ns(r) - Q(i,r,1+0)/N(r);
105[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);
106totiter = totiter + iter;
107% Compute performance metrics
114 U(i,r)=X(r)*L(i,r) / nservers(i);
123function [Q,W,T,
P,PB,iter] = Core(L,M,R,N_1,Z,nservers,Q,
P,PB,Delta,type,tol,maxiter)
129 % Estimate population at
130 [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,
P,PB,Delta);
132 [Q,W,T,
P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1);
133 if norm(Q-Qlast)<tol || iter > maxiter
139function [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,
P,PB,Delta)
140P_1 = zeros(M,max(nservers),1+R);
145 for j=0:(nservers(i)-1)
147 P_1(i,1+j,1+s) =
P(i,1+j);
151 PB_1(i,1+s) = PB(i,1);
157 Q_1(i,r,1+s) = Ns(r)*(Q(i,r,1+0)/N_1(r) + Delta(i,r,s));
163function [Q,W,T,
P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1)
167P = zeros(M,max(nservers));
171 W(ist,r) = L(ist,r)/nservers(ist);
173 % 0 service demand at
this station =>
this class does not visit the current node
176 if type == SchedStrategy.FCFS
178 W(ist,r) = W(ist,r) + (L(ist,s)/nservers(ist))*Q_1(ist,s,1+r);
182 W(ist,r) = W(ist,r) + (L(ist,r)/nservers(ist))*Q_1(ist,s,1+r);
186 for j=0:(nservers(ist)-2)
187 if type == SchedStrategy.FCFS
189 W(ist,r) = W(ist,r) + L(ist,s)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
193 W(ist,r) = W(ist,r) + L(ist,r)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
202 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
204 Q(ist,r) = T(r) * W(ist,r);
210 for j=1:(nservers(ist)-1)
212 P(ist,1+j) =
P(ist,1+j) + L(ist,s)*T(s)*P_1(ist,1+(j-1),1+s)/j;
221 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);
227 P(ist,1+0) = 1 - PB(ist);
228 for j=1:(nservers(ist)-1)
229 P(ist,1+0) =
P(ist,1+0) -
P(ist,1+j);