# Linear optimization with python

Linear programming is the technique used to maximize or minimize a function. The idea is to optimize a complex function by best representing them with linear relationships. In simpler terms, we try to optimize (to maximize or minimize) a function denoted in linear terms and bounded by linear constraints.

## Use case — Profit Maximization

Let’s Consider a manufacture company having two product, A and B and sell them with the profit of 4 and 5 Rs. Each product processed on two machines, X and Y. Type A product takes 2 minutes on X and 2 minutes on Y. Type B requires 2 minutes on X and 3 minutes on Y. The machine X is available not more than 5 hours and 30 min a day. Machine Y is available for 8 hours a day

**Step 1:** Let’s consider x1 is number of product A and x2 is number of product B

**Step 2: **For product A 4 Rs. is profit and for product B 5 Rs. is profit. So total profit is:

` Z = 4x1 + 5x2 `

**Step 3:** Now lets add a constraints. As Machine X is only available for 4 hours and 30 min and 2 minutes processing is required for product A and 2 minutes processing is requires for product B so total processing required is:

` 2x1 + 2x2 <= 330`

Similarly, machine Y is only available for 8 hours and 2 minutes processing is required for product A and 3 minutes processing is requires for product B so total processing required is:

` 2x1 + 3x2 <= 480`

Also number of production for each A and B is always grater than or equal to 0 so:

` x1,x2 >= 0`

So, now our problem is:

```
Maximize Z = 4x1 + 5x2
```

with consrtaints:

```
2x1 + 2x2 <= 330
2x1 + 3x2 <= 480
x1, x2 >= 0
```

Now let’s see how we can use pulp in python to solve this linear optimization problem

First, We import the PuLP package.

Then, We define our problem by giving a suitable name, also specifying that our aim is to maximize the objective function.

After that we define LpVariable to hold the variables of objective functions. The next arguments specifies the lower and upper bound of the defined variable. As per 3rd constraint, its non-negative, hence made second argument as 0 and 3rd as None (in-place of infinity). The last argument says if the required output is discrete or continuous.

Finally denotes the objective function in terms of defined variables, along with a short description. and add constraints in terms of variables.

```
# import PuLP
from pulp import *
# Create the 'prob' variable to contain the problem data
prob = LpProblem("The Product maximization", LpMaximize)
# Create problem variables
x1=LpVariable("Product_1_units",0,None,LpInteger)
x2=LpVariable("Product_2_units",0, None, LpInteger)
# The objective function is added to 'prob' first
prob += 4*x1 + 5*x2, "Profit to be maximized"
# The two constraints are entered
prob += 2*x1 + 2*x2 <= 330, "Machine X constraint"
prob += 2*x1 + 3*x2 <= 480, "Machine Y constraint"
# The problem data is written to an .lp file
prob.writeLP("Productmax.lp")
# The problem is solved using PuLP's choice of Solver
prob.solve()
```

```
# The status of the solution is printed to the screen
print("Status:", LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
# The optimised objective function value is printed to the screen
print("Total units can to be manufactured = ", value(prob.objective))
```