Pre-emptive and Archimedian goal programming
|
|
Type: | Goal Programming |
Rating: | 3 (intermediate) |
Description: | goalctr.mos: goal programming using constraints
goalobj.mos: goal programming using objective functions
|
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-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.