Case Study 1

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 avourable 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?

\(PROBLEM\) \(DEFINITION\)

We need to define the problem first:

  • x as wheat
  • y as barley

Then, we define the constrains:

  • x + y \(\leq\) 75
  • 120 x + 210 y \(\leq\) 15000
  • 110 x + 30 y \(\leq\) 4000
  • x \(\geq\) 0, y \(\geq\) 0

To get the maximize profit, we define the z

  • \(z\) = \((110)(1.3)x\) + \((30)(2)y\)
  • \(z\) = \(143x\) + \(60y\)

which means that \[\hat C = \begin{pmatrix} 143 \\ 60 \end{pmatrix}\].

Define the coefficient matrix

\[A = \begin{pmatrix} 1 & 1 & \\ 120 & 210 &\\ 110 & 30 & \end{pmatrix}\], and

\[B = \begin{pmatrix} 75 \\ 15000 \\ 4000 \end{pmatrix}\].

\(SOLUTION\) \(WITH\) \(LPSOLVE\)

Install the packages of lpsolve first and then use lpsolve library. lpsolve: is callable from R via an extension or module

After that, we set the coefficients of the decision variables -> c

## [1] 143  60

Then, we create constraint matrix B

##      [,1] [,2]
## [1,]    1    1
## [2,]  120  210
## [3,]  110   30

Right hand side of the constraints

## [1]    75 15000  4000

Direction of the constraints

## [1] "<=" "<=" "<="

\(THE\) \(OPTIMUM\) \(RESULT\)

we need to find the optimal solution

## List of 28
##  $ direction       : int 1
##  $ x.count         : int 2
##  $ objective       : num [1:2] 143 60
##  $ const.count     : int 3
##  $ constraints     : num [1:4, 1:3] 1 1 1 75 120 210 1 15000 110 30 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:4] "" "" "const.dir.num" "const.rhs"
##   .. ..$ : NULL
##  $ int.count       : int 2
##  $ int.vec         : int [1:2] 1 2
##  $ bin.count       : int 0
##  $ binary.vec      : int 0
##  $ num.bin.solns   : int 1
##  $ objval          : num 6266
##  $ solution        : num [1:2] 22 52
##  $ presolve        : int 0
##  $ compute.sens    : int 0
##  $ sens.coef.from  : num 0
##  $ sens.coef.to    : num 0
##  $ duals           : num 0
##  $ duals.from      : num 0
##  $ duals.to        : num 0
##  $ scale           : int 196
##  $ use.dense       : int 0
##  $ dense.col       : int 0
##  $ dense.val       : num 0
##  $ dense.const.nrow: int 0
##  $ dense.ctr       : num 0
##  $ use.rw          : int 0
##  $ tmp             : chr "Nobody will ever look at this"
##  $ status          : int 0
##  - attr(*, "class")= chr "lp"

When we print the optimum$status and the output is 0 it is mean sucess, while 2 have a meaning of no feasible solution.

## [1] 0

So, we got 0, which mean it is success

Now, we want to display the optimum values for x and y

##  x  y 
## 22 52

So, we got the optimum values for x and y are 22 and 52 values

Now, we want to check value of objective function at optimal point

## [1] "Total profit: 6266"

The total profit we got is 6266 dollars

Lastly, we need to disconnect from the model and the optimum solution

In conclusion, the farmer will get the maximum profit ($6266) by planting 22 acres of wheat and 52 acres of barley.

\(Solution\) \(with\) \(lpSolveAPI\)

The lpSoleveAPI R package is a second implementation of an interface of lpsolve to R.

First, we need to install the packages of lpSolveAPI

## Warning: package 'lpSolveAPI' was built under R version 3.6.3

Second, we need to set the constrain and the decision variables. The, we set the type of the problem we are trying to solve

## $anti.degen
## [1] "fixedvars" "stalling" 
## 
## $basis.crash
## [1] "none"
## 
## $bb.depthlimit
## [1] -50
## 
## $bb.floorfirst
## [1] "automatic"
## 
## $bb.rule
## [1] "pseudononint" "greedy"       "dynamic"      "rcostfixing" 
## 
## $break.at.first
## [1] FALSE
## 
## $break.at.value
## [1] 1e+30
## 
## $epsilon
##       epsb       epsd      epsel     epsint epsperturb   epspivot 
##      1e-10      1e-09      1e-12      1e-07      1e-05      2e-07 
## 
## $improve
## [1] "dualfeas" "thetagap"
## 
## $infinite
## [1] 1e+30
## 
## $maxpivot
## [1] 250
## 
## $mip.gap
## absolute relative 
##    1e-11    1e-11 
## 
## $negrange
## [1] -1e+06
## 
## $obj.in.basis
## [1] TRUE
## 
## $pivoting
## [1] "devex"    "adaptive"
## 
## $presolve
## [1] "none"
## 
## $scalelimit
## [1] 5
## 
## $scaling
## [1] "geometric"   "equilibrate" "integers"   
## 
## $sense
## [1] "maximize"
## 
## $simplextype
## [1] "dual"   "primal"
## 
## $timeout
## [1] 0
## 
## $verbose
## [1] "neutral"

Third, we need to set the type of decision variables

Fourth, we set the objective function coefficients vector C

Fifth, we add the constraints

sixth, we display the lpsolve matrix

## Model name: 
##            C1   C2             
## Maximize  143   60             
## R1          0    0  free      0
## R2          0    0  free      0
## R3          0    0  free      0
## R4          1    1    <=     75
## R5        120  210    <=  15000
## R6        110   30    <=   4000
## Kind      Std  Std             
## Type      Int  Int             
## Upper     Inf  Inf             
## Lower       0    0

The, we solve the problem using solve function. If the result is 0 then it is success.

## [1] 0

After that, we get the decision variables values

## [1] 22 52

We get the decision variables values are 22 and 52

Thus, we get the value of the objective function

## [1] 6266

We get the value of the objective function is 6266

For your information, the default boundaries on the decision variable are c(0,0) and c(Inf, Inf)

## $lower
## [1] 0 0
## 
## $upper
## [1] Inf Inf

\(In\) \(Conclusion\)

We can use lpSolve and lpSolveAPI to solve optimization.

The farmer will get the maximum profit ($6266) by planting 22 acres of wheat and 52 acres of barley.

LS0tDQp0aXRsZTogIkxhYjM6IExpbmVhciBQcm9ncmFtbWluZyBNb2RlbGluZyINCmF1dGhvcjogIlNvZmlhIE5pY2tsYXVzIFNldGlhYnVkaSAyMDE5NDkyMDAxNSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQoNCi0tLQ0KDQpgYGB7ciBMb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzQwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly9naXRodWIuY29tL0Jha3RpLVNpcmVnYXIvaW1hZ2VzL2Jsb2IvbWFzdGVyL2xvZ28ucG5nP3Jhdz10cnVlIikNCmBgYA0KDQojIENhc2UgU3R1ZHkgMQ0KDQpgYGANClN1cHBvc2UgYSBmYXJtZXIgaGFzIDc1IGFjcmVzIG9uIHdoaWNoIHRvIHBsYW50IHR3byBjcm9wczogd2hlYXQgYW5kIGJhcmxleS4gVG8gcHJvZHVjZSB0aGVzZSBjcm9wcywgaXQgY29zdHMgdGhlIGZhcm1lciAoZm9yIHNlZWQsIGZlcnRpbGl6ZXIsIGV0Yy4pICQxMjAgcGVyIGFjcmUgZm9yIHRoZSB3aGVhdCBhbmQgJDIxMCBwZXIgYWNyZSBmb3IgdGhlIGJhcmxleS4gVGhlIGZhcm1lciBoYXMgJDE1MDAwIGF2YWlsYWJsZSBmb3IgZXhwZW5zZXMuIEJ1dCBhZnRlciB0aGUgaGFydmVzdCwgdGhlIGZhcm1lciBtdXN0IHN0b3JlIHRoZSBjcm9wcyB3aGlsZSBhd2FpdGluZyBhdm91cmFibGUgbWFya2V0IGNvbmRpdGlvbnMuIFRoZSBmYXJtZXIgaGFzIHN0b3JhZ2Ugc3BhY2UgZm9yIDQwMDAgYnVzaGVscy4gRWFjaCBhY3JlIHlpZWxkcyBhbiBhdmVyYWdlIG9mIDExMCBidXNoZWxzIG9mIHdoZWF0IG9yIDMwIGJ1c2hlbHMgb2YgYmFybGV5LiBJZiB0aGUgbmV0IHByb2ZpdCBwZXIgYnVzaGVsIG9mIHdoZWF0IChhZnRlciBhbGwgZXhwZW5zZXMgaGF2ZSBiZWVuIHN1YnRyYWN0ZWQpIGlzICQxLjMwIGFuZCBmb3IgYmFybGV5IGlzICQyLjAwLCBob3cgc2hvdWxkIHRoZSBmYXJtZXIgcGxhbnQgdGhlIDc1IGFjcmVzIHRvIG1heGltaXplIHByb2ZpdD8NCmBgYA0KJFBST0JMRU0kICRERUZJTklUSU9OJA0KDQpXZSBuZWVkIHRvIGRlZmluZSB0aGUgcHJvYmxlbSBmaXJzdDoNCg0KICAqIHggYXMgd2hlYXQNCiAgKiB5IGFzIGJhcmxleQ0KDQpUaGVuLCB3ZSBkZWZpbmUgdGhlIGNvbnN0cmFpbnM6DQoNCiAgKiB4ICsgeSAkXGxlcSQgNzUNCiAgKiAxMjAgeCArIDIxMCB5ICRcbGVxJCAxNTAwMA0KICAqIDExMCB4ICsgMzAgeSAkXGxlcSQgNDAwMA0KICAqIHggJFxnZXEkIDAsIHkgJFxnZXEkIDANCg0KVG8gZ2V0IHRoZSBtYXhpbWl6ZSBwcm9maXQsIHdlIGRlZmluZSB0aGUgeg0KIA0KICogJHokID0gJCgxMTApKDEuMyl4JCArICQoMzApKDIpeSQNCiAqICR6JCA9ICQxNDN4JCArICQ2MHkkDQogDQogd2hpY2ggbWVhbnMgdGhhdCBcW1xoYXQgQyA9IFxiZWdpbntwbWF0cml4fSAxNDMgXFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZW5ke3BtYXRyaXh9XF0uDQoNCkRlZmluZSB0aGUgY29lZmZpY2llbnQgbWF0cml4DQoNClxbQSA9IFxiZWdpbntwbWF0cml4fSAxICYgMSAmIFxcDQogICAgICAgICAgICAgICAgICAgICAgMTIwICYgMjEwICZcXCANCiAgICAgICAgICAgICAgICAgICAgICAxMTAgJiAzMCAmIA0KICAgICAgIFxlbmR7cG1hdHJpeH1cXSwgYW5kIA0KDQpcW0IgPSBcYmVnaW57cG1hdHJpeH0gNzUgXFwgDQogICAgICAgICAgICAgICAgICAgICAgMTUwMDAgXFwgDQogICAgICAgICAgICAgICAgICAgICAgNDAwMCANCiAgICAgIFxlbmR7cG1hdHJpeH1cXS4NCg0KDQokU09MVVRJT04kICRXSVRIJCAkTFBTT0xWRSQNCg0KSW5zdGFsbCB0aGUgcGFja2FnZXMgb2YgbHBzb2x2ZSBmaXJzdCBhbmQgdGhlbiB1c2UgbHBzb2x2ZSBsaWJyYXJ5LiBgbHBzb2x2ZTpgIGlzIGNhbGxhYmxlIGZyb20gUiB2aWEgYW4gZXh0ZW5zaW9uIG9yIG1vZHVsZQ0KDQpgYGB7cn0NCmxpYnJhcnkobHBTb2x2ZSkNCg0KYGBgDQoNCkFmdGVyIHRoYXQsIHdlIHNldCB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBkZWNpc2lvbiB2YXJpYWJsZXMgLT4gYw0KDQpgYGB7cn0NCkMgPC0gYygxNDMsNjApDQpDDQpgYGANCg0KVGhlbiwgd2UgY3JlYXRlIGNvbnN0cmFpbnQgbWF0cml4IEINCg0KYGBge3J9DQpBIDwtIG1hdHJpeChjICgxLCAxICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwLCAyMTAsICANCiAgICAgICAgICAgICAgICAxMTAsIDMwICksIG5yb3c9MywgYnlyb3c9VFJVRSkNCkENCmBgYA0KDQpSaWdodCBoYW5kIHNpZGUgb2YgdGhlIGNvbnN0cmFpbnRzDQpgYGB7cn0NCkIgPC0gYyg3NSwxNTAwMCw0MDAwKQ0KQg0KYGBgDQoNCg0KRGlyZWN0aW9uIG9mIHRoZSBjb25zdHJhaW50cw0KDQpgYGB7cn0NCmNvbnN0cmFpbnRzX2RpcmVjdGlvbiA8LWMoIjw9IiwgIjw9IiwiPD0iKQ0KY29uc3RyYWludHNfZGlyZWN0aW9uDQpgYGANCg0KJFRIRSQgJE9QVElNVU0kICRSRVNVTFQkDQoNCndlIG5lZWQgdG8gZmluZCB0aGUgb3B0aW1hbCBzb2x1dGlvbg0KYGBge3J9DQpvcHRpbXVtIDwtIGxwKGRpcmVjdGlvbiA9Im1heCIsDQogICAgICAgICAgICAgIG9iamVjdGl2ZS5pbj0gQywNCiAgICAgICAgICAgICAgY29uc3QubWF0ID0gQSwNCiAgICAgICAgICAgICAgY29uc3QuZGlyID0gY29uc3RyYWludHNfZGlyZWN0aW9uLA0KICAgICAgICAgICAgICBjb25zdC5yaHMgPSBCLA0KICAgICAgICAgICAgICBhbGwuaW50ID0gVCkNCnN0cihvcHRpbXVtKQ0KYGBgDQoNCldoZW4gd2UgcHJpbnQgdGhlIG9wdGltdW0kc3RhdHVzIGFuZCB0aGUgb3V0cHV0IGlzIDAgaXQgaXMgbWVhbiBzdWNlc3MsIHdoaWxlIDIgaGF2ZSBhIG1lYW5pbmcgb2Ygbm8gZmVhc2libGUgc29sdXRpb24uIA0KDQpgYGB7cn0NCnByaW50KG9wdGltdW0kc3RhdHVzKQ0KYGBgDQpTbywgd2UgZ290IDAsIHdoaWNoIG1lYW4gaXQgaXMgc3VjY2Vzcw0KDQpOb3csIHdlIHdhbnQgdG8gZGlzcGxheSB0aGUgb3B0aW11bSB2YWx1ZXMgZm9yIHggYW5kIHkNCg0KYGBge3J9DQpiZXN0X3NvbHV0aW9uIDwtIG9wdGltdW0kc29sdXRpb24NCm5hbWVzKGJlc3Rfc29sdXRpb24pIDwtIGMoIngiLCJ5IikNCnByaW50KGJlc3Rfc29sdXRpb24pDQpgYGANClNvLCB3ZSBnb3QgdGhlIG9wdGltdW0gdmFsdWVzIGZvciB4IGFuZCB5IGFyZSAyMiBhbmQgNTIgdmFsdWVzDQoNCk5vdywgd2Ugd2FudCB0byBjaGVjayB2YWx1ZSBvZiBvYmplY3RpdmUgZnVuY3Rpb24gYXQgb3B0aW1hbCBwb2ludA0KDQpgYGB7cn0NCnByaW50KHBhc3RlKCJUb3RhbCBwcm9maXQ6ICIsIG9wdGltdW0kb2JqdmFsLCBzZXA9IiIpKQ0KYGBgDQpUaGUgdG90YWwgcHJvZml0IHdlIGdvdCBpcyA2MjY2IGRvbGxhcnMNCg0KTGFzdGx5LCB3ZSBuZWVkIHRvIGRpc2Nvbm5lY3QgZnJvbSB0aGUgbW9kZWwgYW5kIHRoZSBvcHRpbXVtIHNvbHV0aW9uDQoNCmBgYHtyfQ0Kcm0ob3B0aW11bSwgY29uc3RyYWludHNfZGlyZWN0aW9uLGJlc3Rfc29sdXRpb24pDQpgYGANCg0KSW4gY29uY2x1c2lvbiwgdGhlIGZhcm1lciB3aWxsIGdldCB0aGUgbWF4aW11bSBwcm9maXQgKCQ2MjY2KSBieSBwbGFudGluZyAyMiBhY3JlcyBvZiB3aGVhdCBhbmQgNTIgYWNyZXMgb2YgYmFybGV5Lg0KDQokU29sdXRpb24kICR3aXRoJCAkbHBTb2x2ZUFQSSQgDQoNClRoZSBgbHBTb2xldmVBUElgIFIgcGFja2FnZSAgaXMgYSBzZWNvbmQgaW1wbGVtZW50YXRpb24gb2YgYW4gaW50ZXJmYWNlIG9mIGxwc29sdmUgdG8gUi4NCg0KRmlyc3QsIHdlIG5lZWQgdG8gaW5zdGFsbCB0aGUgcGFja2FnZXMgb2YgYGxwU29sdmVBUElgDQoNCmBgYHtyfQ0KbGlicmFyeShscFNvbHZlQVBJKQ0KYGBgDQoNClNlY29uZCwgd2UgbmVlZCB0byBzZXQgdGhlIGNvbnN0cmFpbiBhbmQgdGhlIGRlY2lzaW9uIHZhcmlhYmxlcy4gVGhlLCB3ZSBzZXQgdGhlIHR5cGUgb2YgdGhlIHByb2JsZW0gd2UgYXJlIHRyeWluZyB0byBzb2x2ZQ0KDQpgYGB7cn0NCmxwcmVjIDwtIG1ha2UubHAobnJvdz0zLCBuY29sPTIpDQpscC5jb250cm9sKGxwcmVjLHNlbnNlPSJtYXgiKQ0KYGBgDQoNClRoaXJkLCB3ZSBuZWVkIHRvIHNldCB0aGUgdHlwZSBvZiBkZWNpc2lvbiB2YXJpYWJsZXMNCmBgYHtyfQ0Kc2V0LnR5cGUobHByZWMsMToyLCB0eXBlPSBjKCJpbnRlZ2VyIikpDQpgYGANCg0KRm91cnRoLCB3ZSBzZXQgdGhlIG9iamVjdGl2ZSBmdW5jdGlvbiBjb2VmZmljaWVudHMgdmVjdG9yIEMNCmBgYHtyfQ0Kc2V0Lm9iamZuKGxwcmVjLEMpDQpgYGANCg0KRmlmdGgsIHdlIGFkZCB0aGUgY29uc3RyYWludHMNCmBgYHtyfQ0KYWRkLmNvbnN0cmFpbnQobHByZWMsIEFbMSwgXSwgIjw9IiwgQlsxXSkNCmFkZC5jb25zdHJhaW50KGxwcmVjLCBBWzIsIF0sICI8PSIsIEJbMl0pDQphZGQuY29uc3RyYWludChscHJlYywgQVszLCBdLCAiPD0iLCBCWzNdKQ0KYGBgDQoNCnNpeHRoLCB3ZSBkaXNwbGF5IHRoZSBscHNvbHZlIG1hdHJpeA0KYGBge3J9DQpscHJlYw0KYGBgDQoNClRoZSwgd2Ugc29sdmUgdGhlIHByb2JsZW0gdXNpbmcgc29sdmUgZnVuY3Rpb24uIElmIHRoZSByZXN1bHQgaXMgMCB0aGVuIGl0IGlzIHN1Y2Nlc3MuIA0KYGBge3J9DQpzb2x2ZShscHJlYykNCmBgYA0KDQpBZnRlciB0aGF0LCB3ZSBnZXQgdGhlIGRlY2lzaW9uIHZhcmlhYmxlcyB2YWx1ZXMNCmBgYHtyfQ0KZ2V0LnZhcmlhYmxlcyhscHJlYykNCmBgYA0KV2UgZ2V0IHRoZSBkZWNpc2lvbiB2YXJpYWJsZXMgdmFsdWVzIGFyZSAyMiBhbmQgNTINCg0KVGh1cywgd2UgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0aXZlIGZ1bmN0aW9uDQpgYGB7cn0NCmdldC5vYmplY3RpdmUobHByZWMpDQpgYGANCldlIGdldCB0aGUgdmFsdWUgb2YgdGhlIG9iamVjdGl2ZSBmdW5jdGlvbiBpcyA2MjY2DQoNCg0KRm9yIHlvdXIgaW5mb3JtYXRpb24sIHRoZSBkZWZhdWx0IGJvdW5kYXJpZXMgb24gdGhlIGRlY2lzaW9uIHZhcmlhYmxlIGFyZSBjKDAsMCkgYW5kIGMoSW5mLCBJbmYpDQpgYGB7cn0NCmdldC5ib3VuZHMobHByZWMpDQpgYGANCg0KJEluJCAkQ29uY2x1c2lvbiQNCg0KV2UgY2FuIHVzZSBgbHBTb2x2ZWAgYW5kIGBscFNvbHZlQVBJYCB0byBzb2x2ZSBvcHRpbWl6YXRpb24uIA0KDQpUaGUgZmFybWVyIHdpbGwgZ2V0IHRoZSBtYXhpbXVtIHByb2ZpdCAoJDYyNjYpIGJ5IHBsYW50aW5nIDIyIGFjcmVzIG9mIHdoZWF0IGFuZCA1MiBhY3JlcyBvZiBiYXJsZXkuDQoNCg==