### Linear programming in R using lpsolve

You can read more about linear programming basics here. Here’s how one can work through this example in R using lpsolve library.

## Problem

Problem definition copied from the above link:

Suppose a farmer has 75 acres on which to plant two crops: wheat and barley. To produce these crops, it costs the farmer (for seed, fertilizer, etc.) \$120 per acre for the wheat and \$210 per acre for the barley. The farmer has \$15000 available for expenses. But after the harvest, the farmer must store the crops while awaiting favourable market conditions. The farmer has storage space for 4000 bushels. Each acre yields an average of 110 bushels of wheat or 30 bushels of barley. If the net profit per bushel of wheat (after all expenses have been subtracted) is \$1.30 and for barley is \$2.00, how should the farmer plant the 75 acres to maximize profit?

## Mathematical definition

Also copied from the above:

```maximize
P = (110)(1.30)x + (30)(2.00)y = 143x + 60y
subject to
120x + 210y <= 15000
110x + 30y <= 4000
x + y <= 75
x >= 0
y >= 0
```

To reference this again, we have this as the generic mathematical formulation:

```- A linear function to be maximized or minimized
maximize c1 x1 + c2 x2
- Problem constraints of the following form
a11 x1 + a12 x2 <= b1
a21 x1 + a22 x2 <= b2
a31 x1 + a32 x2 <= b3
- Default lower bounds of zero on all variables
```

Matching to our problem, we have:

```- A linear function to be maximized or minimized
P = (110)(1.30)x + (30)(2.00)y = 143x + 60y
c1 = 143
c2 = 60
- Problem constraints of the following form
120x + 210y <= 15000
a11 = 120
a12 = 210
b1  = 15000
110x + 30y <= 4000
a21 = 110
a22 = 30
b2  = 4000
x + y <= 75
a31 = 1
a32 = 1
b3  = 75
- Default lower bounds of zero on all variables
x >= 0
y >= 0
```

Note that lpsolve by default includes the last condition (i.e. all variables non-negative).

## Using R to solve

See this for more details.

• Install lpsolve library
```> install.packages("lpSolveAPI")
```
```> library("lpSolveAPI")
```
• Represent our problem
```> lprec <- make.lp(0, 2)
> lp.control(lprec, sense="max")
> set.objfn(lprec, c(143, 60))
> add.constraint(lprec, c(120, 210), "<=", 15000)
> add.constraint(lprec, c(110, 30), "<=", 4000)
> add.constraint(lprec, c(1, 1), "<=", 75)
```
• Display the lpsolve matrix
```> lprec
Model name:
C1    C2
Maximize   143    60
R1         120   210  <=  15000
R2         110    30  <=   4000
R3           1     1  <=     75
Kind       Std   Std
Type      Real  Real
Upper      Inf   Inf
Lower        0     0
```
• Solve
```> solve(lprec)
 0
```
• Get maximum profit
```> get.objective(lprec)
 6315.625
```
• Get the solution
```> get.variables(lprec)
 21.875 53.125
```

Thus, to achieve the maximum profit (\$6315.625), the farmer should plant 21.875 acres of wheat and 53.125 acres of barley.