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;
125hasConverged = false;
126while ~hasConverged
127 iter = iter + 1;
128 Qlast = Q;
129 % Estimate population at
130 [Q_1,P_1,PB_1] = Estimate(M,R,N_1,nservers,Q,P,PB,Delta);
131 % Forward MVA
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
134 hasConverged = true;
135 end
136end % it
137end
138
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);
141PB_1 = zeros(M,1+R);
142Q_1 = zeros(M,R);
143for i=1:M
144 if nservers(i)>1
145 for j=0:(nservers(i)-1)
146 for s=0:R
147 P_1(i,1+j,1+s) = P(i,1+j);
148 end
149 end
150 for s=0:R
151 PB_1(i,1+s) = PB(i,1);
152 end
153 end
154 for r=1:R
155 for s=1:R
156 Ns = oner(N_1,s);
157 Q_1(i,r,1+s) = Ns(r)*(Q(i,r,1+0)/N_1(r) + Delta(i,r,s));
158 end
159 end
160end
161end
162
163function [Q,W,T,P,PB] = ForwardMVA(L,M,R,N_1,Z,nservers,type,Q_1,P_1,PB_1)
164W = zeros(M,R);
165T = zeros(1,R);
166Q = zeros(M,R);
167P = zeros(M,max(nservers));
168PB = zeros(M,1);
169for ist=1:M
170 for r=1:R
171 W(ist,r) = L(ist,r)/nservers(ist);
172 if L(ist,r) == 0
173 % 0 service demand at this station => this class does not visit the current node
174 continue;
175 end
176 if type == SchedStrategy.FCFS
177 for s=1:R
178 W(ist,r) = W(ist,r) + (L(ist,s)/nservers(ist))*Q_1(ist,s,1+r);
179 end
180 else
181 for s=1:R
182 W(ist,r) = W(ist,r) + (L(ist,r)/nservers(ist))*Q_1(ist,s,1+r);
183 end
184 end
185 if nservers(ist) > 1
186 for j=0:(nservers(ist)-2)
187 if type == SchedStrategy.FCFS
188 for s=1:R
189 W(ist,r) = W(ist,r) + L(ist,s)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
190 end
191 else
192 for s=1:R
193 W(ist,r) = W(ist,r) + L(ist,r)*(nservers(ist)-1-j)*P_1(ist,1+j,1+r);
194 end
195 end
196
197 end
198 end
199 end
200end
201for r=1:R
202 T(r) = N_1(r) / (Z(r)+sum(W(:,r)));
203 for ist=1:M
204 Q(ist,r) = T(r) * W(ist,r);
205 end
206end
207for ist=1:M
208 if nservers(ist) > 1
209 P(ist,:) = 0;
210 for j=1:(nservers(ist)-1)
211 for s=1:R
212 P(ist,1+j) = P(ist,1+j) + L(ist,s)*T(s)*P_1(ist,1+(j-1),1+s)/j;
213 end
214 end
215 end
216end
217for ist=1:M
218 if nservers(ist) > 1
219 PB(ist) = 0;
220 for s=1:R
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);
222 end
223 end
224end
225for ist=1:M
226 if nservers(ist) > 1
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);
230 end
231 end
232end
233end