Initializing help system before first use

Pre-emptive and Archimedian goal programming


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

goalobj.mos: goal programming using objective functions
  • changing constraint type
  • changing the objective function
File(s): goalctr.mos, goalobj.mos


goalctr.mos
(!*******************************************************
  * Mosel Example Problems                              *
  * ======================                              *
  *                                                     *
  * file goalctr.mos                                    *
  * ````````````````                                    *
  * Example for the use of the Mosel language           *
  * (Pre-emptive and Archimedian goal programming       *
  *  using constraints)                                 *  
  *                                                     *
  * (c) 2008 Fair Isaac Corporation                     *
  *     author: S. Heipcke, 2001, rev. Mar. 2006        *
  *******************************************************!)

model GoalCtr                       ! Start a new model

uses "mmxprs"                       ! Load the optimizer library

forward procedure preemptive        ! Declare some procedures that are
forward procedure archimedian       ! defined later

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
 
 limit:= 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

                                    ! Some declarations for a nice printout
declarations
 STypes={CT_GEQ, CT_LEQ, CT_EQ}
 ATypes: array(STypes) of string
end-declarations
 
 ATypes(CT_GEQ):= ">="; ATypes(CT_LEQ):= "<="; ATypes(CT_EQ):= "="
  
 preemptive                         ! Pre-emptive goal programming
 archimedian                        ! Archimedian goal programming

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

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

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

procedure preemptive

  writeln("Pre-emptive:")

(! 
  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) goal(i).hidden:=true

  i:=0
  while (i<NGOALS) do
    i+=1
    goal(i).hidden:=false           ! Add (=unhide) the next goal
    case goal(i).type 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: ", x.sol, ", y: ", y.sol)

    goal(i)-= deviation             ! Remove deviation variable(s) from goal
    if(getobjval>0) then
     writeln("Cannot satisfy goal ",i)
     break
    end-if  
  end-do

                                    ! Solution printout 
  writeln(" Goal", strfmt("Target",12), strfmt("Value",9))
  forall(g in 1..i) 
   writeln(strfmt(g,5), strfmt(ATypes(goal(g).type),3), 
     strfmt(-goal(g).coeff,9), 
     strfmt( goal(g).act-dev(2*g).sol+dev(2*g-1).sol ,9)) 

  printsol
  
end-procedure

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

procedure archimedian

  writeln("\nArchimedian:")

 declarations
  Penalty: array(1..NGOALS) of real ! Penalties for goal constraints 
 end-declarations

  Penalty:: [8, 3, 1]

  mindev:=0                         ! Re-initialize objective function

! Define the objective as weighted sum of the deviation variables  
  forall(g in 1..NGOALS) do
    case goal(g).type of            ! Add deviation variable(s)
     CT_GEQ: do
              deviation:= dev(2*g)
              mindev += Penalty(g)*deviation 
             end-do
     CT_LEQ: do
              deviation:= -dev(2*g-1)
              mindev += Penalty(g)*dev(2*g-1) 
             end-do
     CT_EQ : do
              deviation:= dev(2*g) - dev(2*g-1)
              mindev += Penalty(g)*(dev(2*g) + dev(2*g-1)) 
             end-do
     else    writeln("Wrong constraint type")
             break
    end-case  
    goal(g)+= deviation
  end-do
    
  minimize(mindev)                  ! Solve the LP-problem
  writeln(" Solution: x: ", x.sol, ", y: ", y.sol)

                                    ! Solution printout 
  writeln(" Goal", strfmt("Target",12), strfmt("Value",9), strfmt("Penalty",9))
  forall(g in 1..NGOALS) 
   writeln(strfmt(g,5), strfmt(ATypes(goal(g).type),3), 
     strfmt(-goal(g).coeff,9), 
     strfmt( goal(g).act-dev(2*g).sol+dev(2*g-1).sol ,9), 
     strfmt(Penalty(g),9))

  printsol

end-procedure
  
end-model

goalobj.mos
(!*******************************************************
  * Mosel Example Problems                              *
  * ======================                              *
  *                                                     *
  * file goalobj.mos                                    *
  * ````````````````                                    *
  * Example for the use of the Mosel language           *
  * (Archimedian and pre-emptive goal programming       *
  *  using objective functions)                         *  
  *                                                     *
  * (c) 2008 Fair Isaac Corporation                     *
  *     author: S. Heipcke, 2001                        *
  *******************************************************!)

model GoalObj                       ! Start a new model

uses "mmxprs"                       ! Load the optimizer library

forward procedure preemptive        ! Declare some procedures that are
forward procedure archimedian       ! defined later

declarations
 NGOALS=3                           ! Number of goals
 x,y: mpvar                         ! Variables
 dev: array(1..2*NGOALS) of mpvar   ! Deviation from goals
 Type: array(1..NGOALS) of string   ! Type of goal objectives
 Sense: array(1..NGOALS) of string  ! Sense of goal objectives
 Weight: array(1..NGOALS) of real   ! Weights of goals
 Deviation: array(1..NGOALS) of real  ! Max. deviation from goals
 Target: array(1..NGOALS) of real   ! Target (RHS) values for goals
 wobj: linctr                       ! Objective function
 goal: array(1..NGOALS) of linctr   ! Goal constraints
end-declarations

 limit:= 42*x + 13*y <= 100         ! Define a constraint

                                    ! Define the goal objectives
 Weight::[100, 1, 0.1]
 Type:: ["perc", "abs", "perc"]
 Sense:: ["max", "min", "max"]
 Deviation:: [10, 4, 20] 
 goal(1):=   5*x +  2*y - 20
 goal(2):=  -3*x + 15*y - 48
 goal(3):= 1.5*x + 21*y - 3.8

 archimedian                        ! Archimedian goal programming
 preemptive                         ! Pre-emptive goal programming

!***********************************************************************
 
procedure archimedian

  writeln("Archimedian:")
  
! Define the objective function as weighted sum of the goals
  forall(g in 1..NGOALS)
   if(Sense(g)="max") then
    wobj-=Weight(g)*goal(g)
   else 
    wobj+=Weight(g)*goal(g)
   end-if  

  minimize(wobj)                    ! Solve the LP-problem
 
                                    ! Solution printout 
  writeln(" Solution: x: ", x.sol, ", y: ", y.sol)
  writeln(" Goal", strfmt("Target",9), strfmt("Value",12))
  forall(g in 1..NGOALS) do
   writeln(strfmt(g,5), strfmt(Sense(g), 9),
    strfmt(goal(g).act + goal(g).coeff , 12,6)) 
  end-do

end-procedure

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

procedure preemptive

  writeln("\nPre-emptive:")
 
(! 
  Optimize successively the goals. After optimizing a goal turn it 
  into a constraint.
!)
 
  i:=0
  while (i<NGOALS) do
    i+=1
    case Sense(i) of
     "max": do
             maximize(goal(i))                 ! Optimize the next goal
             if(getprobstat<>XPRS_OPT) then
               writeln("Cannot satisfy goal ",i)
               break
             else
               Target(i):=getobjval
               if (Type(i)="perc") then
                Target(i)-= abs(Target(i))*Deviation(i)/100
               else
                Target(i)-= Deviation(i)
               end-if
               if(i<NGOALS) then
                goal(i):= goal(i) >= Target(i) ! Turn goal into a constraint
               else
                goal(i).type:=CT_GEQ           ! Only for printout
               end-if
             end-if 
            end-do
     "min": do
             minimize(goal(i))                 ! Optimize the next goal
             if(getprobstat<>XPRS_OPT) then
               writeln("Cannot satisfy goal ",i)
               break
             else
               Target(i):=getobjval
               if (Type(i)="perc") then
                Target(i)+= abs(Target(i))*Deviation(i)/100
               else
                Target(i)+= Deviation(i)
               end-if
               if(i<NGOALS) then
                goal(i):= goal(i) <= Target(i) ! Turn goal into a constraint
               else
                goal(i).type:=CT_LEQ           ! Only for printout
               end-if
             end-if
            end-do
     else  writeln("Unknown objective sense")
           break
    end-case  
   
    writeln(" Solution(", i,"): x: ", x.sol, ", y: ", y.sol)
  end-do

                                    ! Some declarations for a nice printout
 declarations
  STypes={CT_GEQ, CT_LEQ}
  ATypes: array(STypes) of string
 end-declarations
 
  ATypes::([CT_GEQ, CT_LEQ])[">=", "<="]
                                    ! Solution printout 
  writeln(" Goal", strfmt("Target",15), strfmt("Value",12))
  forall(g in 1..i) do
   write(strfmt(g,5), strfmt(ATypes(goal(g).type), 3), 
     strfmt(Target(g), 12,6))
   if(g=NGOALS) then
    writeln(strfmt(getobjval, 12,6))
   else   
    writeln(strfmt(goal(g).act+goal(g).coeff+Target(g) , 12,6)) 
   end-if 
  end-do

end-procedure

end-model

© 2001-2020 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.