Maximize Profit with Scipy Optimize

·

2 min read

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!