Initializing help system before first use

Pre-emptive Goal Programming with constraints


Type: Goal Programming
Rating: 3 (intermediate)
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 (i<NGOALS) do
    i+=1
    sethidden(Goal(i), false)        ! Add (=unhide) the next goal
    case gettype(Goal(i)) of         ! Add deviation variable(s)
     CT_GEQ: do
              Deviation:= dev(2*i)
              MinDev += Deviation 
             end-do
     CT_LEQ: do
              Deviation:= -dev(2*i-1)
              MinDev += dev(2*i-1) 
             end-do
     CT_EQ : do
              Deviation:= dev(2*i) - dev(2*i-1)
              MinDev += dev(2*i) + dev(2*i-1) 
             end-do
     else    writeln("Wrong constraint type")
             break
    end-case  
    Goal(i)+= Deviation
   
    minimize(MinDev)                 ! Solve the LP-problem
    writeln(" Solution(", i,"): x: ", getsol(x), ", y: ", getsol(y))

    if getobjval>0 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

© 2001-2019 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.