(!******************************************************* * Mosel Example Problems * * ====================== * * * * file pplan.mos * * `````````````` * * Example for the use of the Mosel language * * (Manpower planning problem) * * * * (c) 2008 Fair Isaac Corporation * * author: S. Heipcke, 2001, rev. 2003, rev. 2010 * *******************************************************!) model Pplan ! Start a new model uses "mmxprs" ! Load the optimizer library parameters USESOS = false ! Set to true to use formulation with SOS end-parameters declarations RProj = 1..3 ! Range of projects NTime = 6 ! Time horizon RTime = 1..NTime ! Range of months to plan for DUR: array(RProj) of integer ! Duration of project p RESUSE: array(RProj,RTime) of integer ! Resource usage of project p in ! its t'th month RESMAX: array(RTime) of integer ! Resource available in month t BEN: array(RProj) of real ! Benefit per month once project finished x: array(RProj,RTime) of mpvar ! 1 if project p starts in month t, else 0 start: array(RProj) of mpvar ! Month in which project p starts end-declarations DUR :: [3, 3, 4] RESMAX:: [5, 6, 7, 7, 6, 6] BEN :: [10.2, 12.3, 11,2] RESUSE::(1,1..3) [3, 4, 2] RESUSE::(2,1..3) [4, 1, 5] RESUSE::(3,1..4) [3, 2, 1, 2] ! Other RESUSE entries are 0 by default ! Objective: Maximize Benefit ! If project p starts in month t, it finishes in month t+DUR(p)-1 and ! contributes a benefit of BEN(p) for the remaining NTime-(t+DUR(p)-1) ! months: MaxBen:= sum(p in RProj,t in 1..NTime-DUR(p)) (BEN(p)*(NTime-t-DUR(p)+1)) * x(p,t) ! Resource availability ! A project starting in month s is in its t-s+1'st month in month t: forall(t in RTime) ResMax(t):= sum(p in RProj,s in 1..t) RESUSE(p,t-s+1)*x(p,s) <= RESMAX(t) ! Logical Constraints: Each project starts once and only once: forall(p in RProj) One(p):= sum(t in RTime) x(p,t) = 1 ! Connect variables x(p,t) and start(p) forall(p in RProj) Connect(p):= sum(t in RTime) t*x(p,t) = start(p) ! Finish everything by the end of the planning period forall(p in RProj) start(p) <= NTime-DUR(p)+1 if not USESOS then ! Turn variables x into binaries forall(p in RProj,t in RTime) x(p,t) is_binary else ! Define SOS-1 sets that ensure that at ! most one x is non-zero for each project p. ! Use month index order for variables forall(p in RProj) XSet(p):= sum(t in RTime) t*x(p,t) is_sos1 end-if maximize(MaxBen) ! Solve the MIP-problem ! Print out the solution writeln("Solution ",if(USESOS,"(using SOS):","(without SOS):")) writeln(" Objective: ", getobjval) write(" ") forall(t in RTime) write(t) writeln forall(p in RProj) do write(p, ": ") forall(t in RTime) write( if(t