# Operations Research 101 with Python

March 2020 · 3 minute read

Recently my sister asked me to help her with some linear programming problems in Excel. I have not used Excel solver for what feels like decades and I was pleasantly surprised how easy it was to setup and solve a linear programming problem with it. But since I am not really an Excel fan, I wanted to check how fast I could solve a linear programming problem with Python. I decided to use Google’s OR Tools Package, because a former colleague of mine who has quite a lot of experience in OR likes it a lot. So let’s get going:

## Problem

A firm wants to supply 550,000 liters of gasonline and has to decide on the optimum number of trucks given a fixed budget of EUR 600,000. There are three trucks available with the following stats:

Model Capacity (l) Purchase Price (EUR) Monthly OPEX (EUR) # Trips/Month # Trucks
Super 5,000 67,000 550 15 S
Regular 2,500 55,000 425 20 R
Eco 1,000 45,000 350 25 E

The company does not want to purchase more than 15 trucks total, at least 3 of the Eco ones and no more than 7 of the Super trucks. The company wants to minimize monthly operating costs, so how many trucks of each type should it purchase?

Let’s get started with OR-Tools:)

from __future__ import print_function
from ortools.linear_solver import pywraplp

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-2-7b3da395caf7> in <module>
1 from __future__ import print_function
----> 2 from ortools.linear_solver import pywraplp
3
4

~\Miniconda3\lib\site-packages\ortools\linear_solver\pywraplp.py in <module>
11 # Import the low-level C/C++ module
12 if __package__ or "." in __name__:
---> 13     from . import _pywraplp
14 else:
15     import _pywraplp

ImportError: DLL load failed: The specified module could not be found.


Ok, I have to admit getting an error this fast was kind of unexpected:) Thankfully, installing Microsoft Visual C++ Redistributable für Visual Studio 2019 from here solved the issue for me. So, let’s move on to the actual exercise:

solver = pywraplp.Solver('TruckProblem', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

S = solver.IntVar(0.0, 15, 'S')
R = solver.IntVar(0.0, 15, 'R')
E = solver.IntVar(0.0, 15, 'E')

print('Number of variables:', solver.NumVariables())

Number of variables: 3

# Budget constraint
solver.Add(67000*S + 55000*R + 45000*E <= 600000)

# Capacity contraint

solver.Add(5000*15*S + 2500*20*R + 1000*25*E >= 550000)

# Truck constraints

<ortools.linear_solver.pywraplp.Constraint; proxy of <Swig Object of type 'operations_research::MPConstraint *' at 0x000002311F302F90> >

solver.Minimize(550*S + 425*R + 350*E)

status = solver.Solve()

if status == pywraplp.Solver.OPTIMAL:
print('Solution:')
print('Minimum Monthly OPEX =', solver.Objective().Value())
print('S =', S.solution_value())
print('R =', R.solution_value())
print('E =', E.solution_value())
else:
print('The problem does not have an optimal solution.')

Solution:
Minimum Monthly OPEX = 4650.0
S = 5.0
R = 2.0
E = 3.0


Finally:) Apart from the initial problem with setting up or-tools, working with it is super intuitive and Google’s examples which I used to setup this toy problem make it very easy to get started. While I liked Excel’s intuitive user interface, it is quite easy to make an error somewhere in a cell formula that goes unnoticed, so personally I prefer working with or-tools, even for simple problems like this one.

Hope this post was somewhat helpful or at least helped pass some time during the Corona lock-down. #staysafe #stayhome:)