LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_sqni.m
1%{
2%{
3 % @file pfqn_sqni.m
4 % @brief Single Queue Network Iteration (SQNI) approximate solver.
5%}
6%}
7
8%{
9%{
10 % @brief Single Queue Network Iteration (SQNI) approximate solver.
11 % @fn pfqn_sqni(N, L, Z)
12 % @param N Population vector.
13 % @param L Service demand vector.
14 % @param Z Think time vector.
15 % @return Q Mean queue lengths.
16 % @return U Utilization.
17 % @return X System throughput.
18%}
19%}
20function [Q,U,X]=pfqn_sqni(N,L,Z)
21queueIdx = 1;
22C = size(L,2);
23Nt = sum(N);
24X = zeros(1,C);
25Q = zeros(1,C);
26U = zeros(1,C);
27if sum(N)<=0
28 return
29elseif sum(N)==1
30 for r=1:C
31 X(r) = N(r)/(Z(r)+L(r));
32 U(queueIdx,r) = X(r)*L(r);
33 Q(queueIdx,r) = X(r)*L(r);
34 end
35else
36 % Pre-set Q for Z=0 chains (e.g., self-looping classes) to avoid NaN
37 for r=1:C
38 if Z(r)==0
39 Q(queueIdx,r) = N(r);
40 end
41 end
42 for r=1:C
43 if Z(r)==0
44 continue % handled after the main loop
45 end
46 Nr = N(r);
47 Lr = L(r);
48 Zr = Z(r);
49 Nvec_1r = N;
50 Nvec_1r(r) = Nvec_1r(r) - 1;
51 Br = N./(Z+L+L.*(sum(N)-1-sum(Z.*Nvec_1r./(Z+L+L*(sum(N)-2))))) .* Z;
52 Brsum = 0;
53 for c = 1:C
54 if c ~= r
55 Brsum = Brsum + Br(c);
56 end
57 end
58 Br = Lr * Brsum;
59 if Lr==0
60 X(r) = Nr / Zr;
61 else
62 discriminant = Br^2 - 2*Br*Lr*Nt - 2*Br*Zr + Lr^2*Nt^2 + 2*Lr*Nt*Zr - 4*Nr*Lr*Zr + Zr^2;
63 if discriminant < 0
64 discriminant = 0;
65 end
66 X(r) = (Zr - sqrt(discriminant) - Br + Lr*Nt)/(2*Lr*Zr);
67 end
68 U(queueIdx,r) = X(r)*L(r);
69 Q(queueIdx,r) = N(r)-X(r)*Z(r);
70 end
71end
72for r=1:C
73 if Z(r)==0
74 X(r) = N(r)/(L(r)*(1+sum(Q,2)));
75 U(queueIdx,r) = X(r)*L(r);
76 Q(queueIdx,r) = N(r)-X(r)*Z(r);
77 end
78end
79end