Initializing help system before first use

Pre-emptive Goal Programming with constraints


Type: Goal Programming
Rating: 3
Description:
  • (un)hiding constraints
  • adding and deleting constraint terms
  • getting solution information
  • case statement
  • use of procedures
File(s): goalctr.mos


goalctr.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file goalctr.mos 
   ```````````````` 
   Pre-emptive Goal Programming with constraints,
   using function 'sethidden'.
 
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2001, rev. Mar. 2006
*******************************************************!)

model GoalCtr
 uses "mmxprs"

 forward procedure preemptive
 forward procedure print_sol(i:integer)

 declarations
  NGOALS=3                           ! Number of goals
  x,y: mpvar                         ! Variables
  dev: array(1..2*NGOALS) of mpvar   ! Deviation from goals
  MinDev: linctr                     ! Objective function
  Goal: array(1..NGOALS) of linctr   ! Goal constraints
 end-declarations
 
 100*x + 60*y <= 600                 ! Define a constraint
 
! Define the goal constraints
 Goal(1):=  7*x + 3*y >= 40
 Goal(2):= 10*x + 5*y = 60
 Goal(3):=  5*x + 4*y >= 35
  
 preemptive                          ! Pre-emptive Goal Programming

!***********************************************************************

 procedure preemptive
(! 
  Add successively the goals to the problem and solve it, until all
  goals have been added or a goal cannot be satisfied. This assumes that
  the goals are given ordered by priority.
!)

! Remove (=hide) goal constraint from the problem
  forall(i in 1..NGOALS) sethidden(Goal(i), true)

  i:=0
  while (i0 then
     writeln("Cannot satisfy goal ",i)
     break
    end-if  
    Goal(i)-= Deviation              ! Remove deviation variable(s) from goal
  end-do

  print_sol(i)                       ! Solution printout

 end-procedure

!***********************************************************************

 procedure print_sol(i:integer)
  declarations
   STypes={CT_GEQ, CT_LEQ, CT_EQ}
   ATypes: array(STypes) of string
  end-declarations
 
  ATypes::([CT_GEQ, CT_LEQ, CT_EQ])[">=", "<=", "="]
 
  writeln(" Goal", strfmt("Target",11), strfmt("Value",7))
  forall(g in 1..i) 
   writeln(strfmt(g,4), strfmt(ATypes(gettype(Goal(g))),4), 
     strfmt(-getcoeff(Goal(g)),6), 
     strfmt( getact(Goal(g))-getsol(dev(2*g))+getsol(dev(2*g-1)) ,8)) 

  forall(g in 1..NGOALS)
   if (getsol(dev(2*g))>0) then
    writeln(" Goal(",g,") deviation from target: -", getsol(dev(2*g)))
   elif (getsol(dev(2*g-1))>0) then
    writeln(" Goal(",g,") deviation from target: +", getsol(dev(2*g-1))) 
   end-if
 
 end-procedure

end-model