1function [UN,QN,p2opt]=qrf_noblo_mem(MAPs,N,rt)
3% f; % finite capacity queue
4% M, integer, > 0; % number of queues
5% MR, integer, > 0; % number of independent blocking configurations
6% BB {m in 1:MR, i in 1:M} >=0; % blocking state
7% K {i in 1:M}, integer, > 0; % number of phases
for each queue
8% F {i in 1:M}, integer, > 0; % capacity
9% N, integer, >0; % population
10% mu {i in 1:M, k in 1:K(i), h in 1:K(i)} >=0; % completion transition rates
11% v {i in 1:M, k in 1:K(i), h in 1:K(i)} >=0; % background transition rates
12% r {i in 1:M, j in 1:M} >=0; % routing probabilities
15%var p2 {j = 1:M, nj = 1+(0:N), k = 1:K(j), i = 1:M, ni = 1+(0:N), h = 1:K(i), m = 1:MR} >= 0;
16%var e {i = 1:M, k = 1:K(i)} >=0;
21 K(i)=size(MAPs{i}{1},1);
24 for h=1:size(MAPs{i}{1},1)
25 for k=1:size(MAPs{i}{1},1)
26 mu(i,h,k)=MAPs{i}{2}(h,k);
31 for h=1:size(MAPs{i}{1},1)
32 for k=1:size(MAPs{i}{1},1)
36 v(i,k,h)=MAPs{i}{1}(h,k);
46q = zeros(M,M,max(K),max(K));
52 q(i,j,k,h) = rt(i,j)*mu(i,k,h);
54 q(i,j,k,h) = v(i,k,h)+rt(i,i)*mu(i,k,h);
61n = M*(N+1)*max(K)*M*(N+1)*max(K)*MR + M*max(K);
63options = optimset(
'fmincon');
64options.Display =
'off';
65%options.LargeScale =
'off';
67%options.MaxFunEvals = 1e10;
68%options.MaxSQPIter = 500;
69%options.TolCon = 1e-8;
70%options.Algorithm =
'sqp';
71%options.OutputFcn = @outfun;
74% Start on
the polytope: from an infeasible start fmincon exhausts its
75% iteration budget restoring feasibility and returns a point outside
the
76% polytope. See qrf_noblo_start.
77x = qrf_noblo_start(@(z) sub_qrfcon(z,q,M,MR,BB,F,N), n);
79[xopt, fopt] = fmincon(@(x) mem(x),x,[],[],[],[],x*0,x*0+1,@(x) sub_qrfcon(x,q,M,MR,BB,F,N),options);
80[p2opt,~] = sub_qrfvar(xopt);
88 UN(ti) = UN(ti) + p2opt(ti,ni,ki,ti,ni,ki, m);
89 QN(ti) = QN(ti) + (ni-1)*p2opt(ti,ni,ki,ti,ni,ki, m); % rescaled back ni
95 function fobj = mem(x)
97 %maximize H: -sum {m in 1..MR} sum {i in 1..M} sum {k in 1..K[i]} sum {ni in 1..F[i]} p2[i,ni,k,i,ni,k,m]*log(1e-6+p2[i,ni,k,i,ni,k,m]);
98 [p2,~] = sub_qrfvar(x);
104 fobj = fobj - p2(i,ni,k,i,ni,k,m)*log(1e-6 + p2(i,ni,k,i,ni,k,m));
112 function [p2,e] = sub_qrfvar(x)
114 p2 = zeros(M,N+1,max(K),M,N+1,max(K),MR);
122 p2(j,nj,k,i,ni,h,m) = x(ctr);
140 function [c,ceq] = sub_qrfcon(x,q,M,MR,BB,F,N)
145 [p2,e] = sub_qrfvar(x);
148 % subject to ONE {j in 1..M}: sum {nj in 0..N, k in 1..K[j], m in 1..MR} p2[j,nj,k,j,nj,k,m]=1;
152 for nj = 1+(0:N),
for k = 1:K(j), for m = 1:MR
153 ceq(end) = ceq(end) + p2(j,nj,k,j,nj,k,m);
156 ceq(end) = ceq(end) -1;
159 % subject to ZERO1 {j in 1..M, k in 1..K[j], nj in 0..N, i in 1..M, h in 1..K[i], ni in 0..N, m in 1..MR: i==j and nj==ni and h<>k}: p2[j,nj,k,i,ni,h,m]=0;
160 for j = 1:M,
for k =1:K(j),
for nj = 1+(0:N),
for i = 1:M, for h = 1:K(i), for ni = 1+(0:N), for m = 1:MR
161 if i==j && (nj-1)==(ni-1) && h~=k % rescaled back nj and ni
162 ceq(end+1) = p2(j,nj,k,i,ni,h,m); %=0
164 end, end, end, end, end, end, end
166 % subject to ZERO2 {j in 1..M, k in 1..K[j], nj in 0..N, i in 1..M, h in 1..K[i], ni in 0..N, m in 1..MR: i==j and nj<>ni}: p2[j,nj,k,i,ni,h,m]=0;
167 for j = 1:M,
for k =1:K(j),
for nj = 1+(0:N),
for i = 1:M, for h = 1:K(i), for ni = 1+(0:N), for m = 1:MR
168 if i==j && (nj-1)~=(ni-1) % rescaled back nj and ni
169 ceq(end+1) = p2(j,nj,k,i,ni,h,m); %=0
171 end, end, end, end, end, end, end
173 % subject to ZERO3 {j in 1..M, k in 1..K[j], nj in 0..N, i in 1..M, h in 1..K[i], ni in 0..N, m in 1..MR: i<>j and nj+ni>N}: p2[j,nj,k,i,ni,h,m]=0;
174 for j = 1:M,
for k =1:K(j),
for nj = 1+(0:N),
for i = 1:M, for h = 1:K(i), for ni = 1+(0:N), for m = 1:MR
175 if i~=j && (nj-1)+(ni-1)>N % rescaled back nj and ni
176 ceq(end+1) = p2(j,nj,k,i,ni,h,m);
178 end, end, end, end, end, end, end
180 % subject to ZERO5 {j in 1..M, k in 1..K[j], i in 1..M, h in 1..K[i], ni in 0..F[i], m in 2..MR: BB[m,j]==1}: p2[j,0,k,i,ni,h,m]=0;
181 for j = 1:M,
for k =1:K(j),
for i = 1:M,
for h = 1:K(i),
for ni = 1+(0:F(i)),
for m = 2:MR
183 ceq(end+1) = p2(j,1+0,k,i,ni,h,m);
185 end, end, end, end, end, end
187 % subject to ZERO6 {j in 1..M, k in 1..K[j], nj in F[j]+1..N, i in 1..M, h in 1..K[i], ni in 0..N, m in 1..MR}: p2[j,nj,k,i,ni,h,m]=0;
188 for j = 1:M,
for k =1:K(j),
for nj = 1+((F(j)+1):N), for i = 1:M, for h = 1:K(i), for ni = 1+(0:N), for m = 1:MR
189 ceq(end+1) = p2(j,nj,k,i,ni,h,m);
190 end, end, end, end, end, end, end
192 % subject to ZERO7 {j in 1..M, k in 1..K[j], nj in 1..F[j], i in 1..M, h in 1..K[i], ni in 0..N, m in 2..MR: BB[m,j]==1 and i<>j and i<>f and ni+nj+F[f]>N}: p2[j,nj,k,i,ni,h,m]=0;
193 for j = 1:M,
for k =1:K(j),
for nj = 1+(1:F(j)),
for i = 1:M, for h = 1:K(i), for ni = 1+(0:N), for m = 2:MR
194 if BB(m,j)==1 && i~=j && i~=f && (ni-1)+(nj-1)+F(f)>N % rescaled back ni and nj
195 ceq(end+1) = p2(j,nj,k,i,ni,h,m);
197 end, end, end, end, end, end, end
199 % subject to SIMMETRY {j in 1..M, nj in 0..N, k in 1..K[j], i in 1..M, ni in 0..N, h in 1..K[i], m in 1..MR}: p2[i,ni,h,j,nj,k,m] = p2[j,nj,k,i,ni,h,m];
200 for j = 1:M,
for nj = 1+(0:N),
for k =1:K(j), for i = 1:M, for ni = 1+(0:N), for h = 1:K(i), for m = 1:MR
201 ceq(end+1) = p2(i,ni,h,j,nj,k,m) - p2(j,nj,k,i,ni,h,m);
202 end, end, end, end, end, end, end
204 % subject to MARGINALS {j in 1..M, k in 1..K[j], nj in 0..N, i in 1..M, m in 1..MR: i<>j}: p2[j,nj,k,j,nj,k,m]= sum {ni in 0..N-nj} sum {h in 1..K[i]} p2[j,nj,k,i,ni,h,m];
205 for j = 1:M,
for k =1:K(j),
for nj = 1+(0:N),
for i = 1:M, for m = 1:MR
208 ceq(end+1) = p2(j,nj,k,j,nj,k,m);
210 for ni = 1+(0:N) % full range per AMPL MARGINALS; ZERO3 zeroes nj+ni>N
212 ceq(end) = ceq(end) - p2(j,nj,k,i,ni,h,m);
216 end, end, end, end, end
218 %subject to UEFF {j in 1..M, i in 1..M, ki in 1..K[i]}: e[i,ki] = sum {nj in 0..N, kj in 1..K[j], m in 1..MR, ni in 1..N: BB[m,i]==0} p2[j,nj,kj,i,ni,ki,m];
219 for j = 1:M,
for i = 1:M,
for ki = 1:K(i)
221 ceq(end+1) = e(i,ki);
223 for nj = 1+(0:N),
for kj = 1:K(j), for m = 1:MR, for ni = 1+(1:N)
225 ceq(end) = ceq(end) - p2(j,nj,kj,i,ni,ki,m);
230 %subject to THM1 {i in 1..M, k in 1..K[i]}: sum {j in 1..M, h in 1..K[i]} q[i,j,k,h]*e[i,k] =sum {j in 1..M, h in 1..K[i]} q[i,j,h,k]*e[i,h];
231 for i = 1:M,
for k =1:K(i)
234 for j = 1:M,
for h = 1:K(i)
235 ceq(end) = ceq(end) + q(i,j,k,h)*e(i,k);
238 for j = 1:M,
for h = 1:K(i)
239 ceq(end) = ceq(end) - q(i,j,h,k)*e(i,h);
243 %subject to THM2 {j in 1..M, k in 1..K[j], nj in 0..F[j], m in 1..MR}: sum {i in 1..M, ni in 1..F[i], ki in 1..K[i]} ni*p2[j,nj,k,i,ni,ki,m]= N*p2[j,nj,k,j,nj,k,m];
244 for j = 1:M,
for k =1:K(j),
for nj = 1+(0:F(j)),
for m = 1:MR
247 for i = 1:M,
for ni = 1+(1:F(i)),
for ki = 1:K(i)
248 ceq(end) = ceq(end) + (ni-1)*p2(j,nj,k,i,ni,ki,m); % recaled back ni
251 ceq(end) = ceq(end) - N*p2(j,nj,k,j,nj,k,m);
254 %subject to COR1 : sum {m in 1..MR, i in 1..M, j in 1..M, nj in 1..F[j], ni in 1..F[i], ki in 1..K[i], kj in 1..K[j]} ni*nj*p2[j,nj,kj,i,ni,ki,m]= N^2;
257 for m = 1:MR,
for i = 1:M,
for j = 1:M,
for nj = 1+(1:F(j)),
for ni = 1+(1:F(i)), for ki = 1:K(i), for kj = 1:K(j)
258 ceq(end) = ceq(end) + (ni-1)*(nj-1)*p2(j,nj,kj,i,ni,ki,m); % rescaled back ni and nj
259 end, end, end, end, end, end, end
261 ceq(end) = ceq(end) - N^2;
263 % subject to THM30 {i in 1..M, u in 1..K[i]: i<>f}: sum {j in 1..M, nj in 1..F[j], k in 1..K[j], h in 1..K[j], m in 1..MR: j<>i and j<>f and BB[m,j]==0}
264 % q[j,i,k,h]*p2[j,nj,k, i,0,u, m] + ... = sum {j in 1..M, nj in 0..F[j], k in 1..K[i], h in 1..K[j], m in 1..MR: j<>i and j<>f and BB[m,i]==0} q[i,j,k,u]*p2[j,nj,h, i,0+1,k, m] + ...
266 % Marginal-balance family of
the bas skeleton. Without it
the polytope
267 % carries no dependence on mu at all (THM1 only balances phases, and
is
268 % identically zero when K(i)==1), and
the U bound collapses to
the
269 % uninformative [0,1]; verified against glpsol.
271 % No-blocking specialization: there
is no finite-capacity station f and
272 % BB
is all-zero, so only
the j<>i, j<>f terms of
the skeleton survive.
273 % The j==f branches are vacuous here, as are THM3f, THM3I and THM3L,
274 % which are conditioned entirely on f.
275 for i = 1:M,
for u = 1:K(i)
278 for j = 1:M,
for nj = 1+(1:F(j)),
for k = 1:K(j), for h = 1:K(j), for m = 1:MR
279 if j~=i && BB(m,j)==0
280 ceq(end) = ceq(end) + q(j,i,k,h)*p2(j,nj,k, i,1+0,u, m);
282 end, end, end, end, end
284 for j = 1:M,
for nj = 1+(0:F(j)),
for k = 1:K(i), for h = 1:K(j), for m = 1:MR
285 if j~=i && BB(m,i)==0
286 ceq(end) = ceq(end) - q(i,j,k,u)*p2(j,nj,h, i,1+1,k, m);
288 end, end, end, end, end
291 % subject to THM3 {i in 1..M, ni in 0..(F[i]-1): i<>f}: sum {j in 1..M, nj in 1..F[j], k in 1..K[j], h in 1..K[j], u in 1..K[i], m in 1..MR: j<>i and j<>f and BB[m,j]==0} q[j,i,k,h]*p2[j,nj,k, i,ni,u, m] + ...
292 % = sum {j in 1..M, nj in 0..F[j], k in 1..K[i], u in 1..K[j], m in 1..MR: j<>i and j<>f and BB[m,i]==0} sum {h in 1..K[i]} q[i,j,k,h]*p2[j,nj,u, i,ni+1,k, m] + ...
293 for i = 1:M, for ni = 1+(0:(F(i)-1))
296 for j = 1:M,
for nj = 1+(1:F(j)),
for k = 1:K(j), for h = 1:K(j), for u = 1:K(i), for m = 1:MR
297 if j~=i && BB(m,j)==0
298 ceq(end) = ceq(end) + q(j,i,k,h)*p2(j,nj,k, i,ni,u, m);
300 end, end, end, end, end, end
302 for j = 1:M,
for nj = 1+(0:F(j)),
for k = 1:K(i), for u = 1:K(j), for m = 1:MR
303 if j~=i && BB(m,i)==0
305 ceq(end) = ceq(end) - q(i,j,k,h)*p2(j,nj,u, i,ni+1,k, m);
308 end, end, end, end, end
311 % subject to THM4 {j in 1..M, k in 1..K[j], i in 1..M, m in 1..MR}: sum{t in 1..M} sum {h in 1..K[t]} sum {nj in 0..N} sum {nt in 0..N} nt*p2[j,nj,k,t,nt,h,m]
312 % >= N*sum {h in 1..K[i]} sum {nj in 0..N} sum {ni in 1..N} (p2[j,nj,k,i,ni,h,m]);
313 for j = 1:M,
for k = 1:K(j),
for i = 1:M,
for m = 1:MR
314 c(end+1) = 0; % <= inequality
315 % LHS with sign swapped since >= in GLPK
316 for t = 1:M,
for h = 1:K(t),
for nj = 1+(0:N),
for nt = 1+(0:N)
317 c(end) = c(end) - (nt-1)*p2(j,nj,k,t,nt,h,m); % rescaled back nt
319 % RHS with sign swapped since >= in GLPK
320 for h = 1:K(i),
for nj = 1+(0:N),
for ni = 1+(1:N)
321 c(end) = c(end) + N*(p2(j,nj,k,i,ni,h,m));