Goal programming \(GP\) is an extension of Linear Programming \(LP\). Essentially GP is LP with multiple objectives. The value of goal programming comes from a need to optimize conflicting objectives which do not have a feasible solution, and where sufficient information to devise an accurate objective function is absent. In both of these cases, goal programming can be used to satisfy objectives as best as possible. Goal programming was first introduced by Dr. Cooper in 1955.

Dr. Cooper was a prolific researcher across Operations Research, Management Science, Business, and Accounting. To illustrate his reach: he received four honorary degrees — an M.A. from Harvard University in 1976, and honorary doctorates from The Ohio State University in 1970, Carnegie Mellon in 1982, and the University of Alicante in 1995. With over 500 research articles and 27 books to his name, he was the epitome of an expert in his field.

To establish context, consider the foundation of GP: Linear Programming. LP problems seek to optimize a utility function subject to a set of constraints.
$$ \text{where } \quad \vec{x}_j \geq 0 \quad \text{for } j = 1, \dots, n $$
Problem statement: Maximize profit by choosing how many stools and chairs to produce.
There are chairs and stools: \(n\) = 2. Let \( x_1\) be the number of chairs to build and \( x_2\) the number of stools to build.
There are rods and wooden sheets: \(m\) = 2. Let \(i = 1\) represent the wooden sheet, and \(i = 2\) represent the rods.
There are three dominant vertices to the 2D solution space, one of which is the optimal solution. Because integer values are required, we can round down each vertex and evaluate profit at each. This yields near-optimal solutions.
For a larger or more critical problem, the branch-and-bound method for integer programming (IP) provides an exact solution. The following Julia implementation demonstrates this:
using JuMP, HiGHS
model = Model(HiGHS.Optimizer)
@variable(model, x1 >= 0, Int)
@variable(model, x2 >= 0, Int)
@constraint(model, 4 * x1 + 2 * x2 <= 75)
@constraint(model, 4 * x1 + 3 * x2 <= 100)
@objective(model, Max, 50 * x1 + 35 * x2)
optimize!(model)
x1_opt = value(x1)
x2_opt = value(x2)
optimal_profit = objective_value(model)
println("Optimal x1: ", x1_opt) # x_1 = 4
println("Optimal x2: ", x2_opt) # x_2 = 28
println("Optimal profit: ", optimal_profit) # Profit = $1,180
The exact optimal solution is the nearest feasible integer point to the LP relaxation vertex, which coincides with the intersection of the two active constraints.
There are two primary methodologies in Goal Programming:
Preemptive (lexicographical): Goals are ranked by priority. A higher-priority goal is treated as infinitely more important than any lower-priority goal. The model is solved top-down, with the highest-ranked goal addressed first.
Non-preemptive (weighted): All objectives are reduced to a common unit and combined into a single system to be solved simultaneously.
This document focuses on the preemptive methodology. Both methods require a decision maker to assign goal priorities, but the preemptive approach makes this hierarchy explicit and avoids the difficulty of finding common units across disparate objectives.
Goal programming is particularly useful when no feasible solution satisfies all goals simultaneously — typically because objectives are in conflict. Both hard constraints and soft goals can coexist in a GP model. The example below illustrates how this combination can produce an infeasible system that goal programming resolves.
This example is a mixture problem. A refinery blends two types of crude oil — Oil A and Oil B — to produce Regular and Premium Gasoline. The decision makers have established the following ordered priorities:
Additionally, sulfur content must remain below regulatory limits for either product to be sold.
The following information is known:
The goal is to determine which combination of Oil A and Oil B best satisfies the stated objectives. Not all objectives can be fully attained simultaneously. The Desmos visualization below allows you to explore the constraints interactively.
The deviation variable \(d_1^{+}\) captures how much the left-hand side exceeds the right-hand side in the first constraint, while \(d_1^{-}\) captures the shortfall. For \(\geq\) goals, we minimize \(d^{-}\) to drive the solution toward the target. Exceeding a goal carries no additional benefit in this formulation.
Download Goal Programming Example



Find values of \(x_1\) and \(x_2\) that satisfy the constraints and attain as many goals as possible. Use the Excel Solver as follows:
a) First, determine whether Goal 1 (regular gasoline volume) can be met. Minimize the negative deviation, since this is a \(\geq\) constraint.

b) Next, determine whether Goal 2 (premium gasoline volume) can be met while holding the deviation for Goal 1 at zero. Minimize the negative deviation, since this is a \(\geq\) constraint.

c) Finally, determine whether Goal 3 (crude oil cost) can be met while holding the deviations for Goals 1 and 2 fixed. Minimize the positive deviation, since this is a \(\leq\) constraint.

The lexicographically optimal solution is to use 6,250 units of Oil A and 1,250 units of Oil B. Goals 2 and 3 are not attained. The sulfur constraint for premium gasoline is binding; the sulfur constraint for regular gasoline has 0.25% slack.
What are the strengths of this approach?
What are the limitations of this approach?
Should any goals be revised to make the problem more feasible?
How would changes to the rates or costs of Oil A and Oil B affect the feasibility of the goals?
An advertising agency is planning a campaign for a client with a budget of $600,000. The client has identified three target audiences and expressed their reach requirements as goals:
| Type (per minute) | HIM | LIP | HIW | Cost |
|---|---|---|---|---|
| Football | 7 million | 10 million | 5 million | $100,000 |
| Soap Opera | 3 million | 5 million | 4 million | $60,000 |
Formulate the Goals and Constraints
Formulate the System with Deviation Variables
LINDO Formulation
MIN d1M + d2M + d3M
ST
HIM) 7x1 + 3x2 + d1M - D1P = 40
LIP) 10x1 + 5x2 + d2M - d2P = 60
HIW) 5x1 + 4x2 + d3M - D3P = 35
Budget) 100x1 + 60x2 <= 600