That is the (and certain final) a part of a Linear Programming sequence I’ve been writing. With the core ideas coated by the prior articles, this text focuses on purpose programming which is a much less frequent linear programming (LP) use case. Objective programming is a selected linear programming setup that may deal with the optimization of a number of goals in a single LP downside.
By the top of this text, you’ll perceive:
1. Definition of purpose programming and when it must be used
2. The weighted purpose programming method — illustrated with an instance
3. The preemptive purpose programming method — illustrated with an instance
Definition and Use Case of Objective Programming
Objective programming is a particular case of linear programming that enables for a number of — usually conflicting — goals to be balanced. With common LP issues, you decide a single metric to optimize (decrease or maximize) and set constraints to make sure that the optimum resolution is possible. Objective programming is a way that enables for a number of goal metrics to be focused on the similar time.
The ‘mindset’ of purpose programming is essentially totally different from plain vanilla LP issues. Primary LP searches for methods to get as little or as a lot of a single metric as potential — e.g., maximize revenue or decrease waste — topic to constraints. Usually conflicting priorities will probably be discovered within the goal operate or the constraints. For instance, maximize revenue (goal) topic to a most quantity of waste (constraint). With purpose programming, we will transfer necessary constraint metrics into the target operate so we will optimize on them reasonably than simply constraining them. We will maximize revenue and decrease waste on the similar time!
Now is an effective time to ascertain the instance we are going to probe for the remainder of the article:
Let’s think about that we handle a manufacturing facility that makes clothes. Our manufacturing facility could make pants, shirts, and clothes. Every article of clothes has prices, revenue, and waste related to their manufacturing. We need to create a manufacturing plan that may make a sure stage of revenue and in addition waste under a sure amount as a consequence of an environmental dedication. Let’s say that we need to make $150k a month in revenue and we additionally need to waste lower than 20k yards of cloth. Along with our targets, we will’t spend greater than $50k in supplies and labor.
The instance above sounds rather a lot like an everyday linear programming downside proper? Nicely, the twist is that we will’t make $150k in revenue and waste lower than 20k of yards on the similar time. In different phrases, there can be no possible resolution if we have been to plug this into an everyday linear programming downside. Sometimes, the targets set within the issues can not all be achieved with a single resolution, in any other case there wouldn’t be a degree in utilizing purpose programming. We might simply use common previous linear programming with our targets as constraints. The actual worth of purpose programming is that it might probably create a compromise between conflicting targets when common linear programming would yield an infeasible resolution.
The actual worth of purpose programming is that it might probably create a compromise between conflicting targets when common linear programming would yield an infeasible resolution.
How does purpose programming steadiness and compromise with conflicting targets? There are two widespread approaches: (1) weighted and (2) preemptive. We’ll cowl these intimately within the following sections.
The weights method
Right here, we’ll dive into the main points of the weights method. The weights methodology has a single goal operate and runs a single Optimization based mostly on (you guessed it) weights! The truth that just one optimization is run beneath the weights methodology could look like a given — however the preemptive methodology really runs a number of linear programming optimizations. We’ll get to that within the subsequent part…
The weights methodology has particular targets or targets for a number of metrics — e.g., make no less than $150k in revenue promoting garments or waste not more than 20k yards of cloth. For normal LP, we need to totally optimize. For the weights methodology of purpose programming, we need to get as near hitting targets as potential — after we attain a purpose, the optimization doesn’t see extra profit in additional maximization or minimization, so it prioritizes hitting the following most necessary purpose. If this appears complicated now, don’t fear it is going to make extra sense as we get into the instance.
The goal operate for the weights method is specifically formulated to reduce the weighted variations between a metric’s purpose and the precise worth of the metric. Let’s bounce to our instance from above — i.e., we need to make $150k in revenue and waste lower than 20k yards of uncooked materials. Our goal is to reduce how far off we’re from each of those targets.
Right here is the mathematical formulation for this goal:
With our goal operate arrange, we have to outline our constraints. We can have two kinds of constraints (1) purpose associated constraints and (2) common linear programming constraints (the identical sort of constraints you’ll discover in plain vanilla LP). Let’s discuss in regards to the purpose associated constraints first.
We might want to create two issues to arrange our purpose associated constraints, (1) revenue and waste features and (2) a number of slack variables. Let’s undergo these separately.
The revenue and waste features are very straight ahead. They mix our determination variables collectively to calculate complete revenue and complete waste give a selected resolution. Beneath are the formulation that tie revenue and waste to the variety of pants, shirts and clothes we produce:

With our revenue and waste features established, let’s begin speaking about our slack variables. In purpose programming, slack variables are used to measure how far an answer is from hitting a purpose. In our instance, the variables P and W are each slack variables — they characterize how a lot decrease our revenue is in comparison with our revenue purpose and the way a lot increased our waste is in comparison with our waste purpose. Slack variables are embedded in constraints. Beneath are the constraint features for our revenue and waste targets — once more, the P’s and the W’s are our slack variables:

Notice that we’ve plus and minus slack variables — this enables us to overlook the purpose on both finish. We solely need to penalize the slack variable that goes in the other way of our purpose (e.g., we don’t need to penalize extra revenue than our purpose, we solely need to penalize much less revenue) — that’s the reason just one slack variable per purpose is within the goal operate. With this new notation, let’s rewrite our goal operate:

We’ve now carried out the entire particular work for purpose programming. The very last thing we have to do is shortly add our plain vanilla funds constraint. We’re utilizing an everyday constraint for our funds as a result of, in our instance, it’s a arduous constraint. Not like with revenue and waste, we can not violate the funds.

Now, we’ve a totally specified purpose programming downside. Let’s set it up in Python and resolve!
# $150,000 in revenue
downside += revenue + profit_deviation_neg - profit_deviation_pos == 150000, "Profit_Goal"
# Waste purpose: Not more than 20,000 yards of waste
downside += waste + waste_deviation_neg - waste_deviation_pos == 20000, "Cost_Goal"
# Funds constraint
downside += price <= 50000
# Resolve the issue
downside.resolve()
# Show the outcomes
print("Standing:", pulp.LpStatus[problem.status])
print("Pants produced:", pulp.worth(pants))
print("Shirts produced:", pulp.worth(shirts))
print("Clothes produced:", pulp.worth(clothes))
print("Value :", pulp.worth(price))
print("Revenue :", pulp.worth(revenue))
print("Revenue deviation (optimistic):", pulp.worth(profit_deviation_pos))
print("Revenue deviation (detrimental):", pulp.worth(profit_deviation_neg))
print("Waste :", pulp.worth(waste))
print("Waste deviation (optimistic):", pulp.worth(waste_deviation_pos))
print("Waste deviation (detrimental):", pulp.worth(waste_deviation_neg))
This optimization recommends we make 0 pants, 5,000 shirts and 0 clothes. We make $150k in revenue which matches our purpose precisely and we waste 50k yards of cloth which exceeds our max waste by 30k yards. The total outcomes are printed by the code and proven under:

Now that we’ve bought the fundamental construction of the weights method down, let’s really discuss in regards to the weights! In our first instance, we gave equal weights to a greenback of revenue and to a yard of waste. This most likely doesn’t make numerous sense as a result of they’re totally different models. Setting the weights is a subjective determination to be made by the practitioner. For our instance, we’ll determine that losing 1.5 yards of cloth is as unhealthy as making $1 of revenue is sweet. In different phrases, we’ll improve the burden of cloth waste to 1.5 in our goal operate.
downside += profit_deviation_neg + 1.5*waste_deviation_pos
The optimization with the up to date charges recommends we make about 8,572 pants, 7,143 shirts and 0 clothes. With this resolution, we generate $107k in revenue (which is a purpose miss of $43k) and we waste 20,000 yards of cloth which matches our purpose precisely. The total outcomes are printed by the code and proven under:

Clearly, shifting the weights of the targets can have giant influence on the optimization outcomes. We have to fastidiously set our weights to adequately steadiness the relative significance of our targets!
Now that we’ve a stable understanding of how the weighted method works, let’s shift to speaking in regards to the purpose programming with the preemptive method.
Preemptive Method
Whereas the weights methodology balances targets utilizing weights within the goal operate, the preemptive methodology provides hierarchical precedence to targets via iterative optimizations. That’s numerous phrases, don’t fear, we’ll break it down!
Listed here are the steps to the preemptive method:
1. Run an everyday linear programming optimization in your first purpose — e.g., maximize revenue
2. Save the target worth from that run
3. Run one other common linear programming on the following most necessary purpose — e.g., decrease waste — however, add the target worth from the final run as a constraint
4. Repeat the method till you have got gone via all purpose metrics
Two necessary options of the preemptive methodology are (1) it prioritizes targets by rank and (2) the target worth of a better significance purpose can’t be decreased (due to the arduous constraint) when optimizing decrease precedence targets. Let’s go over an instance to construct instinct.
For our instance, let’s say that revenue is crucial purpose and minimizing waste is the second. We’ll begin out by operating a plain vanilla optimization that maximizes revenue:
# Outline the issue
downside = pulp.LpProblem("Clothing_Company_Goal_Programming", pulp.LpMaximize)
# Choice variables: variety of pants, shirts, and clothes produced
pants = pulp.LpVariable('pants', lowBound=0, cat='Steady')
shirts = pulp.LpVariable('shirts', lowBound=0, cat='Steady')
clothes = pulp.LpVariable('clothes', lowBound=0, cat='Steady')
# Revenue and value coefficients
revenue = 10 * pants + 3 * shirts + 15 * clothes
price = 5 * pants + 1 * shirts + 10 * clothes
waste = 1.5 * pants + 1 * shirts + 3 * clothes
# Goal operate: Maximize revenue
downside += revenue
# Constraints
# Funds constraint
downside += price <= 50000
# Resolve the issue
downside.resolve()
# Show the outcomes
print("Standing:", pulp.LpStatus[problem.status])
print("Pants produced:", pulp.worth(pants))
print("Shirts produced:", pulp.worth(shirts))
print("Clothes produced:", pulp.worth(clothes))
print("Value :", pulp.worth(price))
print("Revenue :", pulp.worth(revenue))
The outcomes of the revenue maximizing LP downside are under:

So, our goal operate says to make 50k shirts and acquire a revenue of $150k. This was solely the primary optimization we’re going to run although! Following the algorithm outlined above, we are going to now run one other LP that minimizes waste however, we are going to add a constraint of revenue ≥ $150k to make sure we don’t get a worse revenue.
# Outline the issue
downside = pulp.LpProblem("Clothing_Company_Goal_Programming", pulp.LpMinimize)
# Choice variables: variety of pants, shirts, and clothes produced
pants = pulp.LpVariable('pants', lowBound=0, cat='Steady')
shirts = pulp.LpVariable('shirts', lowBound=0, cat='Steady')
clothes = pulp.LpVariable('clothes', lowBound=0, cat='Steady')
# Revenue and value coefficients
revenue = 10 * pants + 3 * shirts + 15 * clothes
price = 5 * pants + 1 * shirts + 10 * clothes
waste = 1.5 * pants + 1 * shirts + 3 * clothes
# Goal operate: Reduce the material waste
downside += waste
# Funds constraint
downside += price <= 50000
downside += revenue >= 150000
# Resolve the issue
downside.resolve()
# Show the outcomes
print("Standing:", pulp.LpStatus[problem.status])
print("Pants produced:", pulp.worth(pants))
print("Shirts produced:", pulp.worth(shirts))
print("Clothes produced:", pulp.worth(clothes))
print("Value :", pulp.worth(price))
print("Revenue :", pulp.worth(revenue))
And listed below are the outcomes of this remaining optimization:

The astute observer will discover that the optimization is the very same 😅. This could usually be the case with the preemptive methodology. The constraint of beforehand optimized targets will be very restrictive. The one time when iterative optimizations are totally different is that if there are a number of methods to get the optimum values for earlier targets. For instance, if there have been two methods to get $150k in revenue; one had extra waste and the opposite had much less, our second iteration would return the outcomes of the answer with the decrease waste. Within the preemptive methodology, there isn’t a commerce off between the targets. Even when there was an answer that made $149k in revenue with 0 yards of waste, the preemptive methodology would all the time select $150k in revenue with 50k yards of waste. The additional $1000 of revenue is infinitely extra necessary than any quantity of wasted material.
The preemptive methodology must be used when targets are clearly prioritized, and there’s no substitution between them — that means no quantity of success in decrease precedence targets can compensate for decreased optimization in increased precedence ones. When used appropriately, the preemptive methodology may also help optimize a main purpose whereas looking for good options for decrease precedence targets very successfully.
Conclusion
Objective programming gives a framework that extends conventional linear programming to optimize a number of metrics on the similar time. The weighted method balances priorities by way of weights within the goal operate and is suitable when goal metrics have relative significance that may be quantified. The preemptive methodology is an iterative method that offers precedence to metrics based mostly on hierarchy. It’s acceptable when some goals are wholly extra necessary than others. Each approaches will be highly effective optimization methods when utilized within the right context!
Glad optimizing!