$title Military Manpower Planning from Wagner (SPARTA,SEQ=108) $onText Soldiers can be enlisted for 1, 2, 3 or 4 years, and the decision is how many soldiers to enlist for each enlistment period in each year. This problem can be formulated using stock or flow variables. Four different formulations are presented here. The most readable formulation is the one using a stock variable. Although requiring more variables, the stock formulation has fewer nonzero entries in the matrix and is also preferred from a computational point of view. Wagner, H M, Military Manpower Planning Example. In Principles of Operations Research with Applications to Managerial Decisions, Second Edition. Prentice-Hall, 1975, p. 66. Keywords: linear programming, multi-period manpower planning, scenario analysis, military, scheduling $offText Set t 'time periods (years)' / 1*10 / l 'length of enlistment (years)' / len-1*len-4 /; Alias (l,lp), (t,tp); Set ttl(t,tp,l) 'variable map representing enlistment schedules'; ttl(t,tp,l) = yes$(ord(tp) <= ord(t) and ord(tp) + ord(l) > ord(t)); display ttl; Parameter infl(t) 'inflation index' / 1 1.00, 2 1.05, 3 1.12, 4 1.71, 5 1.80 6 1.90, 7 1.97, 8 2.10, 9 2.22,10 2.38 / req(t) 'troop requirement' / 1 5, 2 6, 3 7, 4 6, 5 4 6 9, 7 8, 8 8, 9 6, 10 4 / clen(l) 'cost of service' / len-1 50, len-2 85, len-3 115, len-4 143 /; Variable x(t,l) 'recruits by year and length of enlistment' e(t) 'enlisted men' z 'total cost'; Positive Variable x; Equation cost 'cost definition' bal1(t) 'troop balance - flow balance using lag operators' bal2(t) 'troop balance - flow balance with explicit conditions' bal3(t) 'troop balance - flow balance with intermediate cond' bal4(t) 'troop balance - stock balance'; cost.. z =e= sum((t,l), infl(t)*clen(l)*x(t,l)); bal1(t).. sum((l,lp), x(t-(ord(l)-1),lp+(ord(l)-1))) =g= req(t); bal2(t).. sum((tp,l)$(ord(tp) <= ord(t) and (ord(tp) + ord(l)) > ord(t)), x(tp,l)) =g= req(t); bal3(t).. sum(ttl(t,tp,l), x(tp,l)) =g= req(t); bal4(t).. e(t) =e= e(t-1) + sum(l, x(t,l) - x(t-ord(l),l)); e.lo(t) = req(t); Model sparta1 / cost, bal1 / sparta2 / cost, bal2 / sparta3 / cost, bal3 / sparta4 / cost, bal4 /; solve sparta1 using lp minimizing z; solve sparta2 using lp minimizing z; solve sparta3 using lp minimizing z; solve sparta4 using lp minimizing z; Parameter rep 'summary report'; rep('required',' ',t) = req(t); rep('enlisted',' ',t) = e.l(t); rep('m-cost',' ',t) = e.m(t); rep('recruits',l,t) = x.l(t,l); display rep;