Solving Multiobjective Models With GAMS
Solving Multiobjective Models With GAMS
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
`xu
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 6.
For more information on goal programming see the following references: [3], [4],
[11], [12].
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 facilitys 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 dont 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
set i interviewers /
20007
20027
20031
21021
21106
21109
21116
49001
95012
96010
98002
98038
99012
/;
set j respondents /
$offlisting
$include respset.csv
$onlisting
/;
variables
x(i,j) assignment enqueteurs -> respondents
tdist total distance
y(j) active respondents
nr numer of respondents
;
parameter maxdist(i);
equations
totdist total travel distance
calcy(j) calc number of active respondents
mxassign(i) max 25 respondents for each interviewer
numresp number of respondents (objective)
numrespfx number of respondents (fixed)
;
model m1 /numresp,calcy,mxassign/;
model m2 /totdist,numrespfx,calcy,mxassign/;
parameter maxdistance(iter) /
iter1 5,
iter2 10,
iter3 20,
iter4 50
/;
loop(iter,
x.l(i,j) = 0;
y.l(j) = 0;
ij(i,j) = no;
ij(i,j)$(dist(i,j) <= maxdistance(iter)) = yes;
jj(j) = no;
jj(j)$(sum(ij(i,j),1)) = yes;
);
12 ERWIN KALVELAGEN
The data files are very large and not repeated here. In fact they were generated
using another GAMS model and exported to a CSV file using the GDXVIEWER
software [5]. The set IJ(I,J) is used to indicate allowable assignments i j.
The set JJ(J) is the set of remaining respondents that are reachable by any of the
interviewers.
Notice that we implemented the equation numrespx using a .L value. Such
constructs is a constant with the current value of the corresponding variable. In
general it is an error to have such a construct in your model, but in this case it has
a function. The loop is used to find solutions for different values of the maximum
travel distance for each interview. Using actual data an assignment was found that
reduced the totally traveled distance from 15000 km to 5000 km per week.
Reference:
Arthur J. Keown, Bernard W. Taylor III and John M.
Pinkerton, "Multiple Objective Capital Budgeting within
the University", Computers & Operations Research, 8,
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
/;
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 13
*
* 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
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);
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);
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 15
*-------------------------------------------------------------
* 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
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;
16 ERWIN KALVELAGEN
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:
---- designated_funds_goal =E= designated funds budget goal (<=)
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.
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 17
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
pssp , min , max , me1
me2 , me3 , me4 , me5
budget , expense , designatedfunds, libexpansion
accreditation , politics
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),
18 ERWIN KALVELAGEN
....
);
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.
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 [7] 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;
SOLVING MULTI-OBJECTIVE MODELS WITH GAMS 19
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 atica Avanzada (LA-
NIA), Xalapa, Veracruz, M exico, 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. Erwin Kalvelagen, Interfacing gams with other applications: Tutorial and examples, http:
//www.gams.com/interface/interface.html.
6. A. J. Keown and J. D. Martin, An integer GP model for capital budgeting in hospitals,
Financial Management 5 (1976), no. 3, 2835.
7. Arthur J. Keown, Bernard W. Taylor, and John M. Pinkerton, Multiple objective capital
budgeting within the university, Computers and Operations Research 8 (1981), 5970.
8. 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.
9. Pekka Korhonen, Multiple objective programming support, Interim Report IR-98-010, IIASA,
March 1998.
10. 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.
11. C. Romero, Handbook of critical issues in goal programming, Pergamon Press, 1991.
12. M. J. Schniederjans, Goal programming methodology and applications, Kluwer Publishers,
1995.
13. Ralph E. Steuer, Multiple criteria optimization : Theory, computation, and application, Wi-
ley, 1986.
14. H. M. Weingartner, Mathematical programming and the analysis of capital budgeting prob-
lems, Prentice Hall, 1963.