LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
qrf_noblo_mmi_linear.m
1function [UN,QN,p2opt,lp]=qrf_noblo_mmi_linear(MAPs,N,rt,alpha,lponly)
2% LPONLY (optional): when true, return the assembled linear system in LP
3% without solving, so the polytope can be tested for feasibility directly.
4% Feasibility -- not an fmincon iterate -- is the decisive oracle for this
5% constraint system (see _kb/log.md, 2026-07-19).
6%%% PARAMETERS %%%
7% f; % finite capacity queue
8% M, integer, > 0; % number of queues
9% MR, integer, > 0; % number of independent blocking configurations
10% MM {m in 1:MR, i in 1:M} >=0; % blocking order
11% MM1 {m in 1:MR, i in 1:M}; % blocking order
12% ZZ {m in 1:MR} >=0; % nonzeros in independent blocking configurations
13% ZM, integer, >=0; % max of ZZ
14% BB {m in 1:MR, i in 1:M} >=0; % blocking state
15% K {i in 1:M}, integer, > 0; % number of phases for each queue
16% F {i in 1:M}, integer, > 0; % capacity
17% N, integer, >0; % population
18% mu {i in 1:M, k in 1:K(i), h in 1:K(i)} >=0; % completion transition rates
19% v {i in 1:M, k in 1:K(i), h in 1:K(i)} >=0; % background transition rates
20% r {i in 1:M, j in 1:M} >=0; % routing probabilities
21
22%%% VARIABLES %%%
23%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;
24%var e {i = 1:M, k = 1:K(i)} >=0;
25
26M = length(MAPs);
27MR = 1;
28MM = 0;
29F = repmat(N,M,1);
30MM1 = ones(1,3);
31ZZ = zeros(1,M);
32ZM = 0;
33BB = zeros(MR,M);
34
35for i=1:M
36 K(i)=size(MAPs{i}{1},1);
37end
38
39r = zeros(M);
40for i=1:M
41 for j=1:M
42 r(i,j)=rt(i,j);
43 end
44end
45
46for i=1:M
47 for h=1:size(MAPs{i}{1},1)
48 for k=1:size(MAPs{i}{1},1)
49 mu(i,h,k)=MAPs{i}{2}(h,k);
50 end
51 end
52end
53
54for i=1:M
55 for h=1:size(MAPs{i}{1},1)
56 for k=1:size(MAPs{i}{1},1)
57 if h==k
58 v(i,k,h)=0;
59 else
60 v(i,k,h)=MAPs{i}{1}(h,k);
61 end
62 end
63 end
64end
65
66% q {i in 1:M, j in 1:M, k in 1:K(i), h in 1:K(i), n in 0:N}, with the
67% load-dependent scaling alpha(i,n) folded in, and q(...,n=0)=0. The
68% population index n is that of station i, the station emitting the
69% transition; MATLAB stores it shifted as 1+n.
70q = zeros(M,M,max(K),max(K),N+1);
71for i = 1:M
72 for j = 1:M
73 for k = 1:K(i)
74 for h = 1:K(i)
75 for ni = 1:N
76 if j ~= i
77 q(i,j,k,h,1+ni) = rt(i,j)*mu(i,k,h)*alpha(i,ni);
78 else
79 q(i,j,k,h,1+ni) = v(i,k,h)*alpha(i,ni)+rt(i,i)*mu(i,k,h)*alpha(i,ni);
80 end
81 end
82 end
83 end
84 end
85end
86
87n = M*(N+1)*max(K)*M*(N+1)*max(K)*MR + M*max(K);
88x0 = zeros(n,1);
89
90options = optimset('fmincon');
91options.Display = 'off';
92options.LargeScale = 'off';
93options.MaxIter = 100;
94options.MaxFunEvals = 1e5;
95options.MaxSQPIter = 500;
96options.TolCon = 1e-8;
97options.Algorithm = 'sqp';
98%options.Algorithm = 'active-set';
99%options.OutputFcn = @outfun;
100
101[A,b,Aeq,beq] = sub_qrfcon(q,M,MR,MM,BB,F,N);
102
103lp = struct('A',A,'b',b,'Aeq',Aeq,'beq',beq,'lb',x0*0,'ub',x0*0+1);
104if nargin >= 5 && ~isempty(lponly) && lponly
105 UN = []; QN = []; p2opt = [];
106 return
107end
108%[xopt, fopt] = fmincon(@(x) mmi(x),x0,A,b,Aeq,beq,x0*0,x0*0+1,[],options);
109% Start on the polytope: from an infeasible start fmincon exhausts its
110% iteration budget restoring feasibility and returns a point outside the
111% polytope. The matrices are already assembled here, so the phase-1 LP is
112% direct; cf. qrf_noblo_start for the callback-based variants and for why
113% this is a quadprog and not a linprog.
114lpopts = optimset('Display','off','MaxIter',1000,'TolFun',1e-12,'TolCon',1e-12);
115x0 = quadprog(speye(n), zeros(n,1), A, b, Aeq, beq, ...
116 zeros(n,1), ones(n,1), [], lpopts);
117% Judge the phase 1 by the residual, not the exit flag; see qrf_noblo_start.
118if isempty(x0)
119 error('qrf_noblo_mmi_linear:infeasible', ...
120 'QRF no-blocking polytope phase 1 returned no point');
121end
122x0 = x0(:);
123req = 0; rub = 0;
124if ~isempty(Aeq), req = max(abs(Aeq*x0 - beq)); end
125if ~isempty(A), rub = max(A*x0 - b); end
126if req > 1e-8 || rub > 1e-8
127 error('qrf_noblo_mmi_linear:infeasible', ...
128 ['QRF no-blocking polytope phase 1 did not reach feasibility ' ...
129 '(max equality residual %.3e, max inequality residual %.3e)'], req, rub);
130end
131
132[xopt, fopt] = fmincon(@(x) mem(x),x0,A,b,Aeq,beq,x0*0,x0*0+1,[],options);
133[p2opt,~] = sub_qrfvar(xopt);
134
135for ti=1:M
136 UN(ti) = 0;
137 QN(ti) = 0;
138 for m=1:MR
139 for ni=1+(1:F(ti))
140 for ki=1:K(ti)
141 UN(ti) = UN(ti) + p2opt(ti,ni,ki,ti,ni,ki, m);
142 QN(ti) = QN(ti) + (ni-1)*p2opt(ti,ni,ki,ti,ni,ki, m); % rescaled back ni
143 end
144 end
145 end
146end
147
148% add LB>=0 to both p2 and e
149% LINEAR PROGRAMMING: UTILIZATION UPPER BOUND AT QUEUE 1
150%minimize U1min: sum {m in 1..MR} sum {k in 1..K[1]} sum {n1 in 1..F[1]} p2[1,n1,k,1,n1,k,m];
151
152
153 function fobj = mmi(x)
154 % MMI
155 %minimize MI: sum {m in 1..MR} sum {i in 1..M, j in 1..M, ki in 1..K[i], kj in 1..K[j]: i<>j} sum {nj in 0..F[j]} sum {ni in 0..F[j]} p2[i,ni,ki,j,nj,kj,m]*(log(1e-6+p2[i,ni,ki,j,nj,kj,m])-log(1e-6+p2[i,ni,ki,i,ni,ki,m])-log(1e-6+p2[j,nj,kj,j,nj,kj,m]));
156 [p2,~] = sub_qrfvar(x);
157 fobj = 0;
158 for m = 1:MR
159 for i = 1:M
160 for ki = 1:K(i)
161 for j = 1:M
162 if i~=j
163 for kj = 1:K(j)
164 for ni = 1+(1:F(i))
165 for nj = 1+(1:F(j))
166 fobj = fobj + p2(i,ni,ki,j,nj,kj,m)*(log(1e-6+p2(i,ni,ki,j,nj,kj,m))-log(1e-6+p2(i,ni,ki,i,ni,ki,m))-log(1e-6+p2(j,nj,kj,j,nj,kj,m)));
167 end
168 end
169 end
170 end
171 end
172 end
173 end
174 end
175 end
176
177 function fobj = mem(x)
178 % MEM
179 %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]);
180 [p2,~] = sub_qrfvar(x);
181 fobj = 0;
182 for m = 1:MR
183 for i = 1:M
184 for k = 1:K(i)
185 for ni = 1+(1:F(i))
186 fobj = fobj - p2(i,ni,k,i,ni,k,m)*log(1e-6 + p2(i,ni,k,i,ni,k,m));
187 end
188 end
189 end
190 end
191 end
192
193 function fobj = umin(x, i)
194 [p2,~] = sub_qrfvar(x);
195 fobj = sum(p2(i,1+(1:F(i)),1:K(i),i,1+(1:F(i)),1:K(i), 1:MR),'all');
196 end
197
198 function [p2,e] = sub_qrfvar(x)
199 ctr = 1;
200 p2 = zeros(M,N+1,max(K),M,N+1,max(K),MR);
201 for j = 1:M
202 for nj = 1+(0:N)
203 for k = 1:K(j)
204 for i = 1:M
205 for ni = 1+(0:N)
206 for h = 1:K(i)
207 for m = 1:MR
208 p2(j,nj,k,i,ni,h,m) = x(ctr);
209 ctr = ctr + 1;
210 end
211 end
212 end
213 end
214 end
215 end
216 end
217 e = zeros(M,max(K));
218 for i=1:M
219 for k=1:K(i)
220 e(i,k) = x(ctr);
221 ctr = ctr + 1;
222 end
223 end
224 end
225
226 function vec = deltae(j,k)
227 % p2 = zeros(M,N+1,max(K),M,N+1,max(K),MR);
228 % e = zeros(M,max(K));
229 vec = sparse(1,M*(N+1)*max(K)*M*(N+1)*max(K)*MR + M*max(K));
230 idx = M*(N+1)*max(K)*M*(N+1)*max(K)*MR;
231 idx = idx + max(K)*(j-1);
232 idx = idx + k;
233 vec(idx) = 1;
234 end
235
236
237 function vec = deltap2(j,nj,k,i,ni,h,m)
238 % p2 = zeros(M,N+1,max(K),M,N+1,max(K),MR);
239 % e = zeros(M,max(K));
240 vec = sparse(1,M*(N+1)*max(K)*M*(N+1)*max(K)*MR + M*max(K));
241 idx = (N+1)*max(K)*M*(N+1)*max(K)*MR*(j-1);
242 idx = idx + max(K)*M*(N+1)*max(K)*MR*(nj-1);
243 idx = idx + M*(N+1)*max(K)*MR*(k-1);
244 idx = idx + (N+1)*max(K)*MR*(i-1);
245 idx = idx + max(K)*MR*(ni-1);
246 idx = idx + MR*(h-1);
247 idx = idx + m;
248 vec(idx) = 1;
249 end
250
251 function [A,b,Aeq,beq] = sub_qrfcon(q,M,MR,MM,BB,F,N)
252 A=sparse(0,M*(N+1)*max(K)*M*(N+1)*max(K)*MR + M*max(K));
253 Aeq=sparse(0,M*(N+1)*max(K)*M*(N+1)*max(K)*MR + M*max(K));
254 b=sparse(0,1);
255 beq=sparse(0,1);
256
257 %% DEFINITIONS
258 % 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;
259 for j = 1:M
260 % LHS
261 Aeq(end+1,:) = 0;
262 for nj = 1+(0:N), for k = 1:K(j), for m = 1:MR
263 Aeq(end,:) = Aeq(end,:) + deltap2(j,nj,k,j,nj,k,m);
264 end, end, end
265 beq(end+1,1) = 1;
266 % RHS
267 end
268
269 % 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;
270 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
271 if i==j && (nj-1)==(ni-1) && h~=k % rescaled back nj and ni
272 Aeq(end+1,:) = deltap2(j,nj,k,i,ni,h,m); %=0
273 beq(end+1,1) = 0;
274 end
275 end, end, end, end, end, end, end
276
277 % 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;
278 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
279 if i==j && (nj-1)~=(ni-1) % rescaled back nj and ni
280 Aeq(end+1,:) = deltap2(j,nj,k,i,ni,h,m); %=0
281 beq(end+1,1) = 0;
282 end
283 end, end, end, end, end, end, end
284
285 % 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;
286 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
287 if i~=j && (nj-1)+(ni-1)>N % rescaled back nj and ni
288 Aeq(end+1,:) = deltap2(j,nj,k,i,ni,h,m);
289 beq(end+1,1) = 0;
290 end
291 end, end, end, end, end, end, end
292
293 % 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;
294 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
295 if BB(m,j)==1
296 Aeq(end+1,:) = deltap2(j,1+0,k,i,ni,h,m);
297 beq(end+1,1) = 0;
298 end
299 end, end, end, end, end, end
300
301 % 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;
302 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
303 Aeq(end+1,:) = deltap2(j,nj,k,i,ni,h,m);
304 beq(end+1,1) = 0;
305 end, end, end, end, end, end, end
306
307 % 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;
308 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
309 if BB(m,j)==1 && i~=j && i~=f && (ni-1)+(nj-1)+F(f)>N % rescaled back ni and nj
310 Aeq(end+1,:) = deltap2(j,nj,k,i,ni,h,m);
311 beq(end+1,1) = 0;
312 end
313 end, end, end, end, end, end, end
314
315 % 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];
316 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
317 Aeq(end+1,:) = deltap2(i,ni,h,j,nj,k,m) - deltap2(j,nj,k,i,ni,h,m);
318 beq(end+1,1) = 0;
319 end, end, end, end, end, end, end
320
321 % 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];
322 for j = 1:M, for k =1:K(j), for nj = 1+(0:N), for i = 1:M, for m = 1:MR
323 if i~=j
324 % LHS
325 Aeq(end+1,:) = deltap2(j,nj,k,j,nj,k,m);
326 beq(end+1,1) = 0;
327 % RHS
328 for ni = 1+(0:N) % full range per AMPL MARGINALS; ZERO3 zeroes nj+ni>N
329 for h = 1:K(i)
330 Aeq(end,:) = Aeq(end,:) - deltap2(j,nj,k,i,ni,h,m);
331 end
332 end
333 end
334 end, end, end, end, end
335
336 %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];
337 for j = 1:M, for i = 1:M, for ki = 1:K(i)
338 % LHS
339 Aeq(end+1,:) = deltae(i,ki);
340 % RHS
341 for nj = 1+(0:N), for kj = 1:K(j), for m = 1:MR, for ni = 1+(1:N)
342 if BB(m,i)==0
343 Aeq(end,:) = Aeq(end,:) - deltap2(j,nj,kj,i,ni,ki,m);
344 end
345 end, end, end, end
346 beq(end+1,1) = 0;
347 end, end, end
348
349 %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];
350 % Load-dependent form (cf. THM2 of qrboundsrsrd_skel.mod): q carries the
351 % population index of station i, so the aggregated e[i,k] must be resolved
352 % per population. UEFF plus MARGINALS give e[i,k] = sum_{ni>=1} of the
353 % station-i marginal p2[i,ni,k,i,ni,k,m], so that marginal is the
354 % population-resolved summand. For alpha(i,:) constant this collapses
355 % exactly onto the e-based constraint above.
356 for i = 1:M, for k =1:K(i)
357 Aeq(end+1,:) = 0;
358 beq(end+1,1) = 0;
359 for ni = 1+(1:F(i)), for m = 1:MR
360 % LHS
361 for j = 1:M, for h = 1:K(i)
362 Aeq(end,:) = Aeq(end,:) + q(i,j,k,h,ni)*deltap2(i,ni,k,i,ni,k,m);
363 end, end
364 % RHS
365 for j = 1:M, for h = 1:K(i)
366 Aeq(end,:) = Aeq(end,:) - q(i,j,h,k,ni)*deltap2(i,ni,h,i,ni,h,m);
367 end, end
368 end, end
369 end, end
370
371 %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];
372 for j = 1:M, for k =1:K(j), for nj = 1+(0:F(j)), for m = 1:MR
373 Aeq(end+1,:) = 0;
374 beq(end+1,1) = 0;
375 % LHS
376 for i = 1:M, for ni = 1+(1:F(i)), for ki = 1:K(i)
377 Aeq(end,:) = Aeq(end,:) + (ni-1)*deltap2(j,nj,k,i,ni,ki,m); % recaled back ni
378 end, end, end
379 % RHS
380 Aeq(end,:) = Aeq(end,:) - N*deltap2(j,nj,k,j,nj,k,m);
381 end, end, end, end
382
383 %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;
384 Aeq(end+1,:) = 0;
385 % LHS
386 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)
387 Aeq(end,:) = Aeq(end,:) + (ni-1)*(nj-1)*deltap2(j,nj,kj,i,ni,ki,m); % rescaled back ni and nj
388 end, end, end, end, end, end, end
389 % RHS
390 beq(end+1,1) = N^2;
391
392 %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}
393 % q[j,i,k,h]*p2[j,nj,k, i,0,u, m] + 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 MM[m,1]<>i} q[j,i,k,h]*p2[j,nj,k, i,0,u, m]
394 % = 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]
395 % + 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 and nj<F[j]} q[i,j,k,u]*p2[j,nj,h, i,1,k, m]
396 % + sum {j in 1..M, nj in 0..F[j], y in 1..K[j], m in 1..MR: j<>i and j==f and BB[m,i]==1 and nj==F[j] and MM[m,1]==i} sum {p in 1..K[f], w in 1..M: w<>f and w<>i} q[f,w,y,p]*p2[f,nj,y, i,1,u, m] ;
397
398 f = -1; % never equal to FC station
399 for i = 1:M, for u = 1:K(i)
400 if i~=f
401 Aeq(end+1,:)=0;
402 beq(end+1,1) = 0;
403 % LHS
404 for j = 1:M, for nj = 1+(1:F(j)), for k = 1:K(j), for h = 1:K(j), for m = 1:MR
405 if j~=i && j~=f && BB(m,j)==0
406 Aeq(end,:)= Aeq(end,:) + q(j,i,k,h,nj)*deltap2(j,nj,k, i,1+0,u, m);
407 end
408 end, end, end, end, end
409
410 for j = 1:M, for nj = 1+(1:F(j)), for k = 1:K(j), for h = 1:K(j), for m = 1:MR
411 if j~=i && j==f && MM(m,1)~=i
412 Aeq(end,:)= Aeq(end,:) + q(j,i,k,h,nj)*deltap2(j,nj,k, i,1+0,u, m);
413 end
414 end, end, end, end, end
415 % RHS
416 for j = 1:M, for nj = 1+(0:F(j)), for k = 1:K(i), for h = 1:K(j), for m = 1:MR
417 if j~=i && j~=f && BB(m,i)==0
418 Aeq(end,:)= Aeq(end,:) - q(i,j,k,u,1+1)*deltap2(j,nj,h, i,1+1,k, m);
419 end
420 end, end, end, end, end
421
422 for j = 1:M, for nj = 1+(0:F(j)), for k = 1:K(i), for h = 1:K(j), for m = 1:MR
423 if j~=i && j==f && BB(m,i)==0 && (nj-1)<F(j) % rescaled back nj
424 Aeq(end,:)= Aeq(end,:) - q(i,j,k,u,1+1)*deltap2(j,nj,h, i,1+1,k, m);
425 end
426 end, end, end, end, end
427
428 for j = 1:M, for nj = 1+(0:F(j)), for y = 1:K(j), for m = 1:MR
429 if j~=i && j==f && BB(m,i)==1 && (nj-1)==F(j) && MM(m,1)==i % rescaled back nj
430 for p = 1:K(f), for w = 1:M
431 if w~=f && w~=i
432 Aeq(end,:)= Aeq(end,:) - q(f,w,y,p,nj)*deltap2(f,nj,y, i,1+1,u, m);
433 end
434 end, end
435 end
436 end, end, end, end
437 end % if
438 end, end
439
440 % subject to THM3 {i in 1..M, ni in 0..(F[i]-1): i<>f}:
441 % 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]
442 % + 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 MM[m,1]<>i} q[j,i,k,h]*p2[j,nj,k, i,ni,u, m]
443 % = 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]
444 % + 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 and nj<F[j]} sum {h in 1..K[i]} q[i,j,k,h]*p2[j,nj,u, i,ni+1,k, m]
445 % + 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]==1 and nj==F[j] and MM[m,1]==i} sum {p in 1..K[f], w in 1..M: w<>f and w<>i} q[f,w,u,p]*p2[f,nj,u, i,ni+1,k, m] ;
446 for i = 1:M, for ni = 1+(0:(F(i)-1))
447 if i~=f
448 Aeq(end+1,:)=0;
449 beq(end+1,1) = 0;
450 % LHS
451 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
452 if j~=i && j~=f && BB(m,j)==0
453 Aeq(end,:)= Aeq(end,:) + q(j,i,k,h,nj)*deltap2(j,nj,k, i,ni,u, m);
454 end
455 end, end, end, end, end, end
456 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
457 if j~=i && j==f && MM(m,1)~=i
458 Aeq(end,:)= Aeq(end,:) + q(j,i,k,h,nj)*deltap2(j,nj,k, i,ni,u, m);
459 end
460 end, end, end, end, end, end
461 % RHS
462 for j = 1:M, for nj = 1+(0:F(j)), for k = 1:K(i), for u = 1:K(j), for m = 1:MR
463 if j~=i && j~=f && BB(m,i)==0
464 for h = 1:K(i)
465 Aeq(end,:)= Aeq(end,:) - q(i,j,k,h,ni+1)*deltap2(j,nj,u, i,ni+1,k, m);
466 end
467 end
468 end, end, end, end, end
469 for j = 1:M, for nj = 1+(0:F(j)), for k = 1:K(i), for u = 1:K(j), for m = 1:MR
470 if j~=i && j==f && BB(m,i)==0 && (nj-1)<F(j) % rescaled back nj
471 for h = 1:K(i)
472 Aeq(end,:)= Aeq(end,:) - q(i,j,k,h,ni+1)*deltap2(j,nj,u, i,ni+1,k, m);
473 end
474 end
475 end, end, end, end, end
476 for j = 1:M, for nj = 1+(0:F(j)), for k = 1:K(i), for u = 1:K(j), for m = 1:MR
477 if j~=i && j==f && BB(m,i)==1 && (nj-1)==F(j) && MM(m,1)==i % rescaled back nj
478 for p = 1:K(f), for w = 1:M
479 if w~=f && w~=i
480 Aeq(end,:)= Aeq(end,:) - q(f,w,u,p,nj)*deltap2(f,nj,u, i,ni+1,k, m);
481 end
482 end, end
483 end
484 end, end, end, end, end
485 end
486 end, end
487
488 % subject to THM3f {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 and ni < F[i]} q[j,i,k,h]*p2[j,nj,k, i,ni,u, m]
489 % + 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 ni==F[i] and MM[m,1]==j} sum {w in 1..M: w<>f} q[j,i,k,h]*p2[j,nj,k, i,ni,u, m]
490 % = sum {j in 1..M, nj in 0..F[j], k in 1..K[i], h in 1..K[i], u in 1..K[j]: j<>i and ni < F[i]} q[i,j,k,h]*p2[j,nj,u, i,ni+1,k, 1];
491 for i = 1:M, for ni = 1+(0:(F(i)-1))
492 if i==f
493 Aeq(end+1,:) = 0;
494 beq(end+1,1) = 0;
495 % LHS
496 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
497 if j~=i && j~=f && BB(m,j)==0 && (ni-1) < F(i) % rescaled back ni
498 Aeq(end,:) = Aeq(end,:) + q(j,i,k,h,nj)*deltap2(j,nj,k, i,ni,u, m);
499 end
500 end, end, end, end, end, end
501 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
502 if j~=i && j==f && (ni-1)==F(i) && MM(m,1)==j % rescaled back ni
503 for w = 1:M
504 if w~=f
505 Aeq(end,:) = Aeq(end,:) + q(j,i,k,h,nj)*deltap2(j,nj,k, i,ni,u, m);
506 end
507 end
508 end
509 end, end, end, end, end, end
510 % RHS
511 for j = 1:M, for nj = 1+(0:F(j)), for k = 1:K(i), for h = 1:K(i), for u = 1:K(j)
512 if j~=i && (ni-1) < F(i) % rescaled back ni
513 Aeq(end,:) = Aeq(end,:) - q(i,j,k,h,ni+1)*deltap2(j,nj,u, i,ni+1,k, 1);
514 end
515 end, end, end, end, end
516 end % if
517 end, end
518
519 % 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]
520 % >= 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]);
521 for j = 1:M, for k = 1:K(j), for i = 1:M, for m = 1:MR
522 A(end+1,:) = 0; % <= inequality
523 b(end+1,1) = 0;
524 % LHS with sign swapped since >= in GLPK
525 for t = 1:M, for h = 1:K(t), for nj = 1+(0:N), for nt = 1+(0:N)
526 A(end,:) = A(end,:) - (nt-1)*deltap2(j,nj,k,t,nt,h,m); % rescaled back nt
527 end, end, end, end
528 % RHS with sign swapped since >= in GLPK
529 for h = 1:K(i), for nj = 1+(0:N), for ni = 1+(1:N)
530 A(end,:) = A(end,:) + N*(deltap2(j,nj,k,i,ni,h,m));
531 end, end, end
532 end, end, end, end
533 end
534end
535
Definition Station.m:245