Kal 02
Kal 02
ERWIN KALVELAGEN
1. Multi-objective programming
GAMS models have a single objective. In some cases a problem may require
a so-called multi-objective formulation: different objectives need to be optimized.
Mathematically a multi-objective programming problem can be stated as:
z1 = cT1 x
z2 = cT2 x
MOLP minimize ..
x
.
zK = cTK x
subject to Ax ∼ b
`≤x≤u
where ∼ is a vector of relational operators {≤, = . ≥}. In the above model we have
K objectives. This model can not be cast directly as a linear programming problem
without making some assumptions. The easiest way to deal with this problem is to
create a linear weighted objective:
K
X
(1) min z 0 = wi zi
i=1
The problem here is to find a suitable set of weights wi . Specifying weights is
especially difficult if the objectives have different units (i.e. combining a profit
criterion with a customer satisfaction quantity). This linear weighted objective is
an example of a value or utility function
(2) min z 0 = Ψ(z)
Such functions are sometimes called ’scalarizing functions’ [8]. As an example we
mention the portfolio optimization problem where both return and risk need to
be optimized. For these problems often a linear combination of the two objectives
is used. A multiple objective capital budgeting model based on this technique is
described in section 4. For an example of a multiple objective model in water
allocation modeled along these lines in GAMS see [9].
If the K objectives follow a dominance order, i.e. objective k should be optimized
first, before considering the value of objective j, then we can implement a simple
model m /all/;
loop(j,
* select correct objective function
p(i) = 0;
p(j) = 1;
* solve problem
solve m using lp minimizing obj;
* add fixed objective
z.fx(j) = z.l(j);
);
2. Goal programming
A special form of multiple objective programming is goal programming[4]. Goal
programming deals with multiple, possibly conflicting goals, which may be mea-
sured in nonhomogeneous units. An objective fi (x) is reformulated into a goal by
considering an aspiration level bi . Goals can have the form fi (x) ≤ bi , fi (x) = bi or
−
fi (x) ≥ bi . After adding slacks or deviations s+
i ≥ 0 and si ≥ 0, we can minimize
appropriate slacks to try to achieve the goals. The formulation of these slacks is
summarized in table 1.
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 3
The term non-preemptive goal programming is used when we can model the
problem by using linear weights on the deviations to construct a single objective.
Preemptive goal programming assumes a strict dominance order of the goals, which
can be solved using a sequence of linear programming problems as described in
the previous section. In the context of goal programming this algorithm is called
Sequential Linear Goal Programming (SGLP) (somehow the order is mixed up in
the acronym). An example of a preemptive goal programming formulation of a
budget allocation problem is described in section 5.
For more information on goal programming see the following references: [3], [4],
[10], [11].
where r is the interest rate. These calculations are carried out on constants, and
are not part of the decision model itself. The model therefore does not become
nonlinear because of the net present value calculations. Assuming a total budget
of C we can write the model as:
X
CAP BUDGET maximize Bi xi
x
Xi
subject to Ci xi ≤ C
i
xi ∈ {0, 1} ∀i
Financial
Present Value Present value of incremental cash flows.
Resource Efficiency Enhances employee productivity.
Quality
Facility Quality Improves facility’s appearance or usefulness,
including expenditures to meet safety, code,
or accreditation standards.
Patient/Family Satisfaction Improves patients’ clinical experience by low-
ering waiting times, throughput times. and
general comfort.
Patient Outcomes Improves patients’ clinical outcomes.
Physician Relationships Increases physicians’ satisfaction by improv-
ing equipment reliability, introducing newer
technology, and/or enhancing physicians’ ef-
ficiency of effectiveness.
Strategic
Information Integration Promotes integration of data/information
within the hospital or healthcare system, be-
tween hospital and physician, and with other
healthcare entities.
Market Share Enhances market share by increasing patient
volume and/or attracting new patients.
Table 2. Attributes for project proposals
A constraint like
(6) xk = xj
would implement a mutual contingency: either both projects j and k are selected
or neither of them.
Notice that the data entry for mutually contingent projects is simplified by cre-
ating a set MC. However this is not convenient for writing the constraints of the
form xi = xk . Therefore we create two sets MCLHS and MCRHS which make the spec-
ification of the equations trivial. This illustrates the modeling paradigm of making
equations as simple as possible. An important additional advantage is that we can
debug the sets MCLHS and MCRHS by displaying them. We don’t need a complete
model before we can do this. The equation MUTCONT is now so simple we can ba-
sically assume it is correct once we have made sure the sets MCLHS and MCRHS are
correct. If this was not the case we would need to look at the equation and column
listing in the listing file, which is only available after we can generate a complete
model. It is noted that mutually contingent projects need to be specified pairwise.
I.e. if there are three mutually contingent projects xi , xj and xk , then we need to
specify this in two pairs, e.g. (xi , xj ) and (xi , xk ).
The model shows a significant amount of data manipulation: a small part of
the GAMS source is devoted to specifying the model equations perse. This is not
unusual for practical models.
Reference:
$offtext
set i ’projects’ /
p1 ’Ultrasound Siemens Upgrade’
p2 ’INTRAOPERATIVE MONITORING EQUIPMENT’
p3 ’Central Data Repository’
p4 ’Communication Closets/Cabling’
p5 ’Radiology Digital Fluoro’
p6 ’Clinical Information system’
p7 ’Centralized Scheduling’
p8 ’Upgrade Pneumatic Tube System - All Bldgs’
p9 ’Mobile/Radio frequency computers’
p10 ’Ultrasound Acuson Upgrade’
p11 ’Pneumatic Tube, Point to Point’
p12 ’Remodeling of Immediate Care Center’
p13 ’Birthing Center Expansion’
p14 ’Medical Vacuum Pumps - CCB’
p15 ’Adult Ventilators’
p16 ’Cardiac Cath Lab Renovation and Upgrade’
p17 ’Radiology Portable C-Arm’
p18 ’MRI Patient Monitors’
p19 ’ACB Pharmacy Renovation’
p20 ’SMS Product Line Manager’
p21 ’SMS Imaging’
p22 ’Echocardiograph’
p23 ’OP Rad/fluoro rooms’
p24 ’Replace Oxyquip Medical Gases outlets - CCB’
p25 ’Doors for all OR rooms’
p26 ’Human Resource/Payroll Information System’
p27 ’Anesthesia Machine Modulus SmartVent System’
p28 ’ABIOMED EXTERNAL ARTIFICAL HEART PROGRAM’
p29 ’Replace all 486 computers’
p30 ’Robot-Rx’
p31 ’EXTERIOR SIGNAGE’
6 ERWIN KALVELAGEN
* quality attributes
FQ ’facility quality: appearance or usefulness, incl. safety, code, accreditation standards’
SAT ’patient and family satisfaction’
OUTC ’patient clinical outcome’
PHYS ’physician satisfaction’
* strategic
IINT ’Information Integration’
SHAR ’Market share’
/;
p34 0 0 0 0 0 0 1 0
p35 0 0 0 0 0 0 0 0
p36 831553 8 0 4 20 0 0 8
p37 0 0 0 0 0 0 0 0
p38 832118 31 0 8 21 0 50 0
p39 0 0 0 0 0 0 0 0
p40 0 0 0 0 0 1 0 0
p41 0 0 0 0 0 0 0 0
p42 0 0 0 0 0 0 0 0
p43 0 0 0 0 0 0 0 0
p44 0 0 0 0 0 0 0 0
p45 0 0 0 0 0 0 0 0
;
*
* some projects are non-discretionary
*
set nd(i) ’non-discretionary projects’ /p46,p47,p48/;
set d(i) ’discretionary projects’;
d(i) = not nd(i);
*
* we scale the scores from 0 - 100
*
parameter minscore(attr) ’minimum score’;
minscore(attr) = smin(d, score(d,attr));
parameter scaled_score(i,attr);
scaled_score(d, attr) = 100*(score(d,attr)-minscore(attr))/(maxscore(attr)-minscore(attr));
display scaled_score;
*
* the weights for the different attributes
*
parameter weight(attr) /
PV 100
EFF 100
FQ 50
SAT 75
OUTC 70
PHYS 45
IINT 50
SHAR 100
/;
*
* calculate weighted value scores
* (these results are slightly different than in the
* reference)
*
parameter val(i) ’weighted value scores’;
val(i) = sum(attr, w(attr)*scaled_score(i,attr));
display val;
p11 144241, p12 683382, p13 3935679, p14 235244, p15 90000
p16 1500000, p17 192576, p18 90960, p19 525000, p20 1500000
p21 700000, p22 362000, p23 914000, p24 210900, p25 150000
p26 250000, p27 803975, p28 863509, p29 122756, p30 1643576
p31 128004, p32 128004, p33 150000, p34 145910, p35 140000
p36 734464, p37 150000, p38 1500000, p39 171500, p40 209125
p41 190803, p42 250750, p43 420500, p44 450050, p45 779925
p46 2620000, p47 300000, p48 5125000
/;
*
* the available budget limits the number of projects that can be
* carried out.
*
parameter budget ’in millions’ / 15.8 /;
*
* mutually exclusive projects
* In this case projects 1 and 10 are equipment upgrades from
* competitive vendors.
*
set mes ’number of mutually exlusive sets’ /me1/;
set me(mes,i) ’specification of mutually exclusive projects’ /
me1.(p1,p10)
/;
*
* mutually contingent projects
* need to be specified in pairs
*
set mcs ’number of mutually contingent sets’ /mc1/;
set mc(mcs,i) ’specification of mutually contingent projects’ /
mc1.(p20,p21)
/;
loop(mcs,
abort$(sum(mc(mcs,i),1)<>2) "The set mc need to be specified in pairs";
);
*
* create a set mclhs and mcrhs for easier writing of the equations
*
set mclhs(mcs,i); mclhs(mc) = no;
set mcrhs(mcs,i);
scalar lhs;
loop(mcs,
lhs = 1;
loop(mc(mcs,i),
if (lhs,
mclhs(mc) = yes;
lhs = 0;
else
mcrhs(mc) = yes;
);
);
);
variables
z ’objective’
x(i) ’project selection’
;
binary variable x;
equations
objective ’objective function’
budgetcon ’budget constraint’
mutexcl(mes) ’mutually exclusive projects’
mutcont(mcs) ’mutually contingent projects’
;
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 9
*
* non-discretionary projects need to be selected
*
x.fx(nd) = 1;
*
* objective: maximize value
*
objective.. z =e= sum(i, val(i)*x(i));
*
* budget constraint
*
budgetcon.. sum(i, cost(i)*x(i)) =l= budget*1.0e6;
*
* mutually exclusive projects: only one can be selected from
* sets.
*
mutexcl(mes).. sum(me(mes,i), x(i)) =l= 1;
*
* mutually contingent projects: all projects in sets need to
* selected together
*
mutcont(mcs).. sum(mclhs(mcs,i), x(i)) =e= sum(mcrhs(mcs,i), x(i));
model m /all/;
option optcr=0;
solve m maximizing z using mip;
option x:0;
display x.l;
p1 1, p2 1, p3 1, p4 1, p5 1, p6 1, p7 1, p8 1
p9 1, p12 1, p13 1, p16 1, p46 1, p47 1, p48 1
Reference:
Arthur J. Keown, Bernard W. Taylor III and John M.
Pinkerton, "Multiple Objective Capital Budgeting within
the University", Computers & Operations Research, 8,
10 ERWIN KALVELAGEN
59-70, 1981.
$offtext
set i ’projects’ /
p1 ’CDC Computer System’
p2 ’IBM Computer System’
p3 ’Upgrading of current Univac Computer System’
p4 ’Remote Batcher on North Campus’
p5 ’Remote Batcher in Engineering Building’
p6 ’Remote Batcher in Business Building’
p7 ’Expansion of Main Library’
p8 ’Expansion of Business School Library’
p9 ’Expansion of Engineering Library’
p10 ’Expansion of North Campus Library’
p11 ’Construction of Additional Small Experiments Lab’
p12 ’Construction of Additional Large Experiments Lab’
p13 ’Build new Engineering-Physics Research Facilities - Prototype A’
p14 ’Build new Engineering-Physics Research Facilities - Prototype B’
p15 ’Renovate Business Building - Prototype A’
p16 ’Renovate Business Building - Prototype B’
p17 ’Renovate Engineering Building’
p18 ’Build Behavioral Observation Labs - Prototype A’
p19 ’Build Behavioral Observation Labs - Prototype B’
p20 ’Improvement in Engineering Lab Equipment’
p21 ’Improvement in Chemistry Lab Equipment’
p22 ’Improvement in Physics Lab Equipment’
/;
*
* cost: initial cost
* exp: annual operating expenses
* libsqf: library expansion in square feet
* busqasd: Business Department Quality Adjusted Student Days
* engqasd: Engineering Department Quality Adjusted Student Days
* chemqasd: Chemistry Department Quality Adjusted Student Days
* physqasd: Physics Department Quality Adjusted Student Days
* psyqasd: Psychology Department Quality Adjusted Student Days
* desigf: Investment from Designated Funds
* acp: Accreditation Satisfaction Projects
* pssp: Political-Social Satisfaction Projects
*
table data(*,*)
cost exp libsqf busqasd engqasd chemqasd physqasd psyqasd desigf acp pssp
p1 190000 25000 20000 15000 10000 10000 5000 1 1
p2 230000 30000 30000 23000 15000 15000 8000 1 1
p3 90000 25000 8000 6000 4000 4000 2000 1 1
p4 60000 6000 6000 10000 1
p5 50000 5000 12000 50000
p6 50000 5000 14000 1
p7 250000 40000 15000 15000 10000 22000 22000 15000
p8 150000 25000 8000 40000 100000 1
p9 100000 15000 5000 25000
p10 150000 23000 8000 20000 20000 1
p11 50000 10000 2000 10000 6000
p12 80000 16000 4000 15000 12000 190000
p13 190000 20000 40000 20000 120000
p14 120000 12000 20000 25000
p15 160000 10000 45000 1
p16 80000 5000 20000 1
p17 80000 5000 20000 80000
p18 120000 10000 20000 18000 1
p19 70000 6000 10000 13000 1
p20 1 .1 .17
p21 1 .1 .15
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 11
p22 1 .1 .20
min 12500 50000 40000 15000 35000 30000 120000 2 1
max 450000 200000
;
binary variables
y(disc) ’discrete projects’
;
positive variables
x(cont) ’continuous projects’
dmin(goals) ’negative deviations’
dplus(goals) ’positive deviations’
;
equation
budget_goal ’budget constraint formulated as a <= goal’
expense_goal ’operating expenses goal (<=)’
designated_funds_goal ’designated funds budget goal (<=)’
lib_expansion_goal ’library expansion goal (>=)’
accreditation_goal ’projects advised by accreditation teams’
political_social_goal ’projects needed for political reasons’
department_performance_goal(qasd) ’improve QASDs’
mutual_exclusive(mes) ’mutually exclusive projects’
contingency ’handle contingency of p18 or p19 on p15’
;
*-------------------------------------------------------------
* goals
*-------------------------------------------------------------
budget_goal..
sum(disc, data(disc,’cost’)*y(disc)) + sum(cont, data(cont,’cost’)*x(cont))
+ dmin(’budget’) - dplus(’budget’) =e= data(’max’,’cost’);
expense_goal..
sum(disc, data(disc,’exp’)*y(disc)) + sum(cont, data(cont,’exp’)*x(cont))
+ dmin(’expense’) - dplus(’expense’) =e= data(’max’,’exp’);
designated_funds_goal..
sum(disc, data(disc,’desigf’)*y(disc))
+ dmin(’designatedfunds’) - dplus(’designatedfunds’) =e= data(’min’,’desigf’);
12 ERWIN KALVELAGEN
lib_expansion_goal..
sum(disc, data(disc,’libsqf’)*y(disc))
+ dmin(’libexpansion’) - dplus(’libexpansion’) =e= data(’min’,’libsqf’);
accreditation_goal..
sum(disc, data(disc,’acp’)*y(disc))
+ dmin(’accreditation’) - dplus(’accreditation’) =e= data(’min’,’acp’);
political_social_goal..
sum(disc, data(disc,’pssp’)*y(disc))
+ dmin(’politics’) - dplus(’politics’) =e= data(’min’,’pssp’);
department_performance_goal(qasd)..
sum(disc, data(disc,qasd)*y(disc)) + sum(cont, data(cont,qasd)*x(cont))
+ dmin(qasd) - dplus(qasd) =e= data(’min’,qasd);
*-------------------------------------------------------------
* hard constraints
*-------------------------------------------------------------
x.up(cont) = data(’max’,cont);
*-------------------------------------------------------------
* slacks to be minimized
*-------------------------------------------------------------
set goalplus(goals) /
budget
expense
/;
set goalmin(goals) /
designatedfunds
libexpansion
accreditation
politics
busqasd
engqasd
chemqasd
physqasd
psyqasd
/;
*-------------------------------------------------------------
* objective
*-------------------------------------------------------------
variable obj;
equation objective;
objective.. obj =e= sum(goals, pmin(goals)*dmin(goals)+pplus(goals)*dplus(goals));
*-------------------------------------------------------------
* preemption order
*-------------------------------------------------------------
parameter preempt(goals) /
budget 1
expense 2
designatedfunds 3
libexpansion 4
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 13
accreditation 5
politics 6
busqasd 7
engqasd 8
chemqasd 9
physqasd 10
psyqasd 11
/;
model m /all/;
option limrow=10;
option limcol=0;
option optcr=0;
*
* to check the solution reported in the reference
* use this code:
*
$ontext
y.fx(disc) = 0;
y.fx(’p4’) = 1;
y.fx(’p6’) = 1;
y.fx(’p8’) = 1;
y.fx(’p9’) = 1;
y.fx(’p17’) = 1;
x.fx(cont) = 0;
x.fx(’p21’) = 20000;
$offtext
loop(g1,
loop(g$(preempt(g) = preempt_level),
pplus(goals) = 0;
pmin(goals) = 0;
pplus(goalplus(g)) = 1;
pmin(goalmin(g)) = 1;
dmin.fx(goalmin(g)) = dmin.l(g);
dplus.fx(goalplus(g)) = dplus.l(g);
);
preempt_level = preempt_level + 1;
);
display y.l,x.l;
In the above model the table data is declared as table data(*,*). This is
convenient but quite dangerous. If we would have made a typo in the equations
like:
designated_funds_goal..
sum(disc, data(disc,’desigf’)*y(disc))
+ dmin(’designatedfunds’) - dplus(’designatedfunds’) =e= data(’min’,’designatedfunds’);
then this would not have flagged an error. Instead the right-hand side of this
equation would be zero. The only way to verify that the model is correct is to look
carefully at the equation listing. Here we see that:
14 ERWIN KALVELAGEN
There are two types of projects: discrete projects which can only be selected as
a whole, and continuous projects which can be given funds in any positive amount.
This means we need two sets of variable, as we can not declare a variable x(i) with
some of them integer and some of them continuous. As result we have both discrete
variables y(.) and continuous variables x(.) each defined over proper subsets of
I.
The loop is somewhat more complicated than needed at first sight. A simpler
approach would just be:
loop(g,
....
);
However the set g (aliased to the set goals) has a different order than specified in
the set statement. The set goals is declared as:
set goals /budget, expense, designatedfunds, libexpansion, accreditation,
politics, busqasd, engqasd, chemqasd, physqasd, psyqasd/;
which has a different order. The reason is that in GAMS set elements are ordered
corresponding to an invisible pool of elements also known as the universe. This
pool is formed by elements as they come. We can make the universe visible by the
following statements:
alias (*,universe);
display universe;
The universe just after the declaration of the set goal is shown below:
---- 104 SET universe Aliased with *
p1 , p2 , p3 , p4
p5 , p6 , p7 , p8
p9 , p10 , p11 , p12
p13 , p14 , p15 , p16
p17 , p18 , p19 , p20
p21 , p22 , cost , exp
libsqf , busqasd , engqasd , chemqasd
physqasd , psyqasd , desigf , acp
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 15
which indicates we should lexicographically solve the model first for the budget
goal, then for the annual expense goal and so on. For this we use a nested loop:
scalar preempt_level /1/;
loop(g1,
loop(g$(preempt(g) = preempt_level),
....
);
preempt_level = preempt_level + 1;
);
The g1 loop is just to make sure we run 11 iterations: g1 is not further used . The
inner g loop is not really a loop, it just selects one goal g for the current preemption
level.
The construction of the objective in each solve is somewhat involved, and again
the equation listing provides feedback. The pertinent parts are reproduced below:
objective.. - dplus(budget) + obj =E= 0 ; (LHS = 0)
...
objective.. - dplus(expense) + obj =E= 0 ; (LHS = 0)
...
objective.. - dmin(designatedfunds) + obj =E= 0 ;
(LHS = -120000, INFES = 120000 ***)
...
objective.. - dmin(libexpansion) + obj =E= 0 ;
(LHS = -12500, INFES = 12500 ***)
...
objective.. - dmin(accreditation) + obj =E= 0 ; (LHS = -2, INFES = 2 ***)
...
objective.. - dmin(politics) + obj =E= 0 ; (LHS = -1, INFES = 1 ***)
...
objective.. - dmin(busqasd) + obj =E= 0 ; (LHS = 0)
...
objective.. - dmin(engqasd) + obj =E= 0 ; (LHS = -3000, INFES = 3000 ***)
...
objective.. - dmin(chemqasd) + obj =E= 0 ; (LHS = -9000, INFES = 9000 ***)
...
objective.. - dmin(physqasd) + obj =E= 0 ; (LHS = -16000, INFES = 16000 ***)
...
objective.. - dmin(psyqasd) + obj =E= 0 ;
(LHS = -5000.00000000001, INFES = 5000.00000000001 ***)
This list gives shows that the correct deviations or slacks are minimized at each
cycle.
16 ERWIN KALVELAGEN
The results for each cycle are as follows. The goals “budget”, “expense”, “des-
ignatedfunds”, “accreditation”, “politics”, “busqasd” and “engqasd” could also be
met completely. Their optimal objective function was zero. In fact this means
that these goals could have been formulated as hard constraints. The subsequent
goal “chemqasd” is missed by 9000 units. After that the goals “physqasd” and
“psyqasd” are not completely attained (objective is 25000 and 30000 respectively).
The final solution is:
---- 279 VARIABLE y.L discrete projects
( ALL 0.000 )
The solution reported by the authors [6] is yp4 = yp6 = yp8 = yp9 = yp17 = 1 and
xp21 = 20000 with all the other variables equal to zero. This solution is violating
the “budget” goal, which can easily be verified by setting:
y.fx(disc) = 0;
y.fx(’p4’) = 1;
y.fx(’p6’) = 1;
y.fx(’p8’) = 1;
y.fx(’p9’) = 1;
y.fx(’p17’) = 1;
x.fx(cont) = 0;
x.fx(’p21’) = 20000;
and then solving the model. This gives an objective of 10000 for the first cycle.
References
1. Enrique Ballestero and Carlos Romero, Multiple criteria decision making and its applications
to economic problems, Kluwer, 1998.
2. Carlos A. Coello Coello, An updated survey of GA-based multiobjective optimization tech-
niques, Tech. Report Lania-RD-98-08, Laboratorio Nacional de Informática Avanzada (LA-
NIA), Xalapa, Veracruz, México, December 1998.
3. J. P. Ignizio, Goal programming and extensions, Lexington Books, 1976.
4. , Introduction to linear goal programming, Sage University Papers Series, Quantitative
applications in the social sciences, Sage Publications, 1985.
5. A. J. Keown and J. D. Martin, An integer GP model for capital budgeting in hospitals,
Financial Management 5 (1976), no. 3, 28–35.
6. Arthur J. Keown, Bernard W. Taylor, and John M. Pinkerton, Multiple objective capital
budgeting within the university, Computers and Operations Research 8 (1981), 59–70.
7. Don N. Kleinmuntz and Catherine E. Kleinmuntz, Multiobjective capital budgeting in not-for-
profit hospitals and healthcare systems, Tech. report, Department of Business Administration,
University of Illinois at Urbana-Champaign, December 2001.
8. Pekka Korhonen, Multiple objective programming support, Interim Report IR-98-010, IIASA,
March 1998.
9. Daene C. McKinney and Ximing Cai, Multiobjective optimization model for water allocation
in the aral sea basin, Tech. report, Environmental and Water Resources Engineering Program,
Department of Civil Engineering, University of Texas at Austin, 1996.
10. C. Romero, Handbook of critical issues in goal programming, Pergamon Press, 1991.
11. M. J. Schniederjans, Goal programming methodology and applications, Kluwer Publishers,
1995.
12. Ralph E. Steuer, Multiple criteria optimization : Theory, computation, and application, Wi-
ley, 1986.
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 17
13. H. M. Weingartner, Mathematical programming and the analysis of capital budgeting prob-
lems, Prentice Hall, 1963.