LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_linearizerms.m
1%{
2%{
3 % @file pfqn_linearizerms.m
4 % @brief Multiserver Linearizer (Krzesinski/Conway/De Souza-Muntz).
5%}
6%}
7
8%{
9%{
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.
25%}
26%}
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
32% algorithm.
33
34[M,R]=size(L);
35if nargin<5
36 type = SchedStrategy.PS * ones(M,1);
37end
38if nargin<6
39 tol = 1e-8;
40end
41if nargin<7
42 maxiter = 1000;
43end
44
45if isempty(Z)
46 Z = zeros(1,R);
47end
48
49% Initialize
50Q = zeros(M,R,1+R);
51PB = zeros(M,1+R);
52P = zeros(M,max(nservers(:)),1+R);
53Delta = zeros(M,R,R);
54for i=1:M
55 for r=1:R
56 for s=1:R
57 Delta(i,r,s) = 0;
58 end
59 for s=0:R
60
61 N_1 = oner(N,s);
62 [~,q] = pfqn_bs(L,N_1,Z);
63 Q(:,r,1+s) = q(:);
64 end
65 end
66end
67
68for i=1:M
69 for r=1:R
70 for s=0:R
71 N_1 = oner(N,s);
72 pop = sum(N_1);
73 if nservers(i)>1
74 for j=1:(nservers(i)-1)
75 P(i,1+j,1+s) = 2*sum(Q(i,:,1+s))/(pop*(pop+1));
76 end
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));
79 end
80 end
81 end
82end
83
84totiter = 0;
85% Main loop
86for I=1:2
87 for s=0:R
88 N_1 = oner(N,s); % for k=0 it just returns N
89 % Core(N_1)
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;
92 end
93 % Update_Delta
94 for i=1:M
95 for r=1:R
96 for s=1:R
97 Ns = oner(N,s);
98 Delta(i,r,s) = Q(i,r,1+s)/Ns(r) - Q(i,r,1+0)/N(r);
99 end
100 end
101 end
102end
103
104% Core(N)
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
108U = zeros(M,R);
109for i=1:M
110 for r=1:R
111 if nservers(i)==1
112 U(i,r)=X(r)*L(i,r);
113 else
114 U(i,r)=X(r)*L(i,r) / nservers(i);
115 end
116 end
117end
118Q = Q(1:M,1:R,1+0);
119C = N./X-Z;
120R = W;
121end
122
123function [Q,W,T,P,PB,iter] = Core(L,M,R,N_1,Z,nservers,Q,P,PB,Delta,type,tol,maxiter)
124iter = 0;
125W = zeros(M,R);
126T = zeros(1,R);
127hasConverged = false;
128while ~hasConverged
129 iter = iter + 1;
130 Qlast = Q;
131 % Estimate population at
132 [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta);
133 % Forward MVA
134 [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1);
135 if norm(Q-Qlast)<tol || iter > maxiter
136 hasConverged = true;
137 end
138end % it
139end
140
141function [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta)
142P_1 = zeros(M,max(nservers(:)),1+R);
143PB_1 = zeros(M,1+R);
144Q_1 = zeros(M,R);
145for i=1:M
146 if nservers(i)>1
147 for j=0:(nservers(i)-1)
148 for s=0:R
149 P_1(i,1+j,1+s) = P(i,1+j);
150 end
151 end
152 for s=0:R
153 PB_1(i,1+s) = PB(i,1);
154 end
155 end
156 for r=1:R
157 for s=1:R
158 Ns = oner(N_1,s);
159 Q_1(i,r,1+s) = Ns(r)*(Q(i,r,1+0)/N_1(r) + Delta(i,r,s));
160 end
161 end
162end
163end
164
165function [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1)
166W = zeros(M,R);
167T = zeros(1,R);
168Q = zeros(M,R);
169P = zeros(M,max(nservers(:)));
170PB = zeros(M,1);
171for ist=1:M
172 for r=1:R
173 W(ist,r) = L(ist,r)/nservers(ist);
174 if L(ist,r) == 0
175 % 0 service demand at this station => this class does not visit the current node
176 continue;
177 end
178 if type == SchedStrategy.FCFS
179 for s=1:R
180 W(ist,r) = W(ist,r) + (L(ist,s)/nservers(ist))*Q_1(ist,s,1+r);
181 end
182 else
183 for s=1:R
184 W(ist,r) = W(ist,r) + (L(ist,r)/nservers(ist))*Q_1(ist,s,1+r);
185 end
186 end
187 if nservers(ist) > 1
188 for j=0:(nservers(ist)-2)
189 if type == SchedStrategy.FCFS
190 for s=1:R
191 W(ist,r) = W(ist,r) + L(ist,s)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
192 end
193 else
194 for s=1:R
195 W(ist,r) = W(ist,r) + L(ist,r)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
196 end
197 end
198
199 end
200 end
201 end
202end
203for r=1:R
204 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
205 for ist=1:M
206 Q(ist,r) = T(r) * W(ist,r);
207 end
208end
209for ist=1:M
210 if nservers(ist) > 1
211 P(ist,:) = 0;
212 for j=1:(nservers(ist)-1)
213 for s=1:R
214 P(ist,1+j) = P(ist,1+j) + L(ist,s)*T(s)*P_1(ist,1+(j-1),1+s)/j;
215 end
216 end
217 end
218end
219for ist=1:M
220 if nservers(ist) > 1
221 PB(ist) = 0;
222 for s=1:R
223 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);
224 end
225 end
226end
227for ist=1:M
228 if nservers(ist) > 1
229 P(ist,1+0) = 1 - PB(ist);
230 for j=1:(nservers(ist)-1)
231 P(ist,1+0) = P(ist,1+0) - P(ist,1+j);
232 end
233 end
234end
235end