Skip to main content

Command Palette

Search for a command to run...

Maximize Profit with Scipy Optimize

Published
2 min read
N

Los Angeles

The problem is a classic product mix-problem, where the objective is to maximize profit given some production and ingredients constraints, in this case it is a coffee shop with three coffee types.

x0 -> Regular
x1 -> Latte
x2 -> Mocha

Constraints:

x0+x1+x2 <= 500
x1+x2 <= 350
x2 <= 125

Objective function

Maximize x0*1.5 + x1*2.00 + x2*2.25

The problem lies in both your objective function and the constraints. Since you are using scipy's minimize function, you must minimize the negative of the objective function to find the maximum of the function (It is slightly tricky).

#profit / cup
Reg = 1.25
Lat = 2.00
Moc = 2.25

#objective function to maximize
def objective(x):
    return -1.0*(x[0]*Reg + x[1]*Lat + x[2]*Moc)

If you look at the scipy documentation, all inequalities are in the form g(x)>=0. So, for example, if you want x2 <= 125, you must multiply by negative 1 (to switch the inequality), then add 125 which gets: g(x) = 125-x2 >= 0. So for the rest of your constraints:

#constraints
def cons_total_production(x):
    return (-1.0*sum(x))+500

def cons_choc(x):
    return (-1.0*x[2])+125

def cons_milk(x):
    return (-1.0*sum(x[1:]))+350

Which will give you the outputs:

 fun: -918.7499999999989
 jac: array([-1.25, -2.  , -2.25])
 message: 'Optimization terminated successfully.'
 nfev: 35
 nit: 7
 njev: 7
 status: 0
 success: True
 x: array([ 150.,  225.,  125.])

 fun: -890.62499998809
 jac: array([-1.25, -2.  , -2.25])
 message: 'Optimization terminated successfully.'
 nfev: 10
 nit: 2
 njev: 2
 status: 0
 success: True
 x: array([ 187.5,  187.5,  125. ])

Linear programming is so cool!

More from this blog

Nikhil Rao's Blog

18 posts

For the love of Data