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