Project Assignment
Title: Modeling the Best Product Mix considering their Marginal Contribution
Sergio Vicente Simioni
June, 27, 2015

Report Content

  1. Executive Summary
  2. Conclusions
  3. Data Analysis

Content Description

Executive Summary

The project will model the best product mix among 4 different products based on their marginal contribution, whose general formula is:

\(\beta_1Product_1+\beta_2Product_2+\beta_3Product_3+\beta_4Product_4 = Max\),

where,

\(\beta_1\) = Marginal Contribution ( U$/Kg ) and Product = Volume ( ton )

Due to the characteristics of the problem, we are going to introduce some premises:
1 - The products are commodities and the market can absorb the excess of production through the interruption of the importation currently with higher price.
2 - The company should ensure at least 1 ton of each of the 4 products which will be allocated among their regular customers.
3 - The surplus of the production if occurs is going to be absorbed by the market.
4- The OEE ( Overall Equipment Effectiveness) = Total Planned Up-time is composed by: Downtime Losses ( Downtime + Changeover) + Speed Losses ( Idling and minor stoppages + Reduced speeds) + Quality Losses ( Defects + Start-ups)

   Problem Description:
   
    
1- The current Marginal Contribution for each product is:  U$26/kg, U$35/kg, U$25/kg and U$37/kg respectively

2- Each product should go through 3 different process: ROLL, CUT and WELD, these processes have, respectively, the following OEE and available hours per week: 56%/28 hours, 47%/34 hours and 28%/21 hours.

3- Bellow follow the timing in hours of each product to be processed in each of the 3 steps 
Process <- read.csv("C:/Users/Sergio Simioni/Desktop/Process.csv", sep=";")
head(Process)
##      X Product_1 Product_2 Product_3 Product_4
## 1 ROLL       1.7       2.1       1.4       2.4
## 2  CUT       1.1       2.5       1.7       2.6
## 3 WELD       1.6       1.3       1.6       0.8

Conclusions

The problem was analysed utilizing the lpSolveAPI R package, the results showed that to obtain the maximum profitability without violating either of the three constraints of the production, we should produce 1 ton, 7.92 ton, 5.19 ton and 1 ton of the products respectively, and the maximized results is U$469.98M

Final equation = 26 x 1 + 35 x 7.92 + 25 x 5.19 + 37 x 1 = U$ 469,98M

Sensibility Analysis

The sensibility analysis shows that the CUT process was utilized 32,3 hrs versus 35 hrs available, instead of this, the ROLL and WELD were fully utilized ( 28 hrs and 21 hrs respectively) becoming the bottleneck ( constraint ) of the process. As we have two constraints we are going to evaluate the sensibility of these two processes in order to identify the most relevant.If we increase 1 hr/week in the ROLL process we are going to elevate the results to U$ 485M, and on the other hand raising 1 hr/week in the WELD process the results will elevate to U$ 472M

Based on that, in order to obtain additional gains and according to the TOC ( Theory of the Constraints ) the company should:
First - focus on the de-bottleneck of the ROLL process, by detailing the OEE ( Overall Equipment Effectiveness). Second - subordinate everything else to the previous decision. Third - Elevate the system’s constraint and Fourth - after breaking the constraint, we need to return to the beginning and re-analyse the entire process again.

Data Analysis

library(lpSolveAPI)
library(knitr)
model<- make.lp(0,4)
name.lp(model, "Production Best Mix")
lp.control(model, sense="max")
## $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
## NULL
## 
## $timeout
## [1] 0
## 
## $verbose
## [1] "neutral"
set.objfn(model, c(26,35,25,37))
set.bounds( model, lower = c(1,1,1,1), upper = c(Inf,Inf,Inf,Inf))
set.type(model, c(1,2,3,4), type=c("real"))
coef1<- c(1.7,2.1,1.4,2.4)
add.constraint(model, coef1, "<=", 28)
coef2<- c(1.1,2.5,1.7,2.6)
add.constraint(model, coef2, "<=", 35)
coef3<- c(1.6,1.3,1.6,0.8)
add.constraint(model, coef3, "<=", 21)

Modeling of the problem

print(model)
## Model name: Production Best Mix
##             C1    C2    C3    C4        
## Maximize    26    35    25    37        
## R1         1.7   2.1   1.4   2.4  <=  28
## R2         1.1   2.5   1.7   2.6  <=  35
## R3         1.6   1.3   1.6   0.8  <=  21
## Kind       Std   Std   Std   Std        
## Type      Real  Real  Real  Real        
## Upper      Inf   Inf   Inf   Inf        
## Lower        1     1     1     1
solve(model)
## [1] 0
get.objective(model)
## [1] 469.9805
get.variables(model)
## [1] 1.000000 7.922078 5.188312 1.000000
get.constraints(model)
## [1] 28.00000 32.32532 21.00000
solution<- as.data.frame(get.primal.solution(model))

names(solution) <- c("Results")
rownames(solution)<- c("Maximized Result (U$M)", "Roll_Utilization(hrs)","Cut_Utilization(hrs)","Weld_Utilization(hrs)", "Product1 (ton)","Product2 (ton)","Product3 (ton)", "Product4 (ton)")

Final Results

kable(solution, align = 'c', digits =2)
Results
Maximized Result (U$M) 469.98
Roll_Utilization(hrs) 28.00
Cut_Utilization(hrs) 32.33
Weld_Utilization(hrs) 21.00
Product1 (ton) 1.00
Product2 (ton) 7.92
Product3 (ton) 5.19
Product4 (ton) 1.00

Sensibility Analysis increasing 1 hour per week for each process

model<- make.lp(0,4)
name.lp(model, "Production Best Mix")
lp.control(model, sense="max")
## $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
## NULL
## 
## $timeout
## [1] 0
## 
## $verbose
## [1] "neutral"
set.objfn(model, c(26,35,25,37))
set.bounds( model, lower = c(1,1,1,1), upper = c(Inf,Inf,Inf,Inf))
set.type(model, c(1,2,3,4), type=c("real"))
coef1<- c(1.7,2.1,1.4,2.4)
add.constraint(model, coef1, "<=", 29)
coef2<- c(1.1,2.5,1.7,2.6)
add.constraint(model, coef2, "<=", 35)
coef3<- c(1.6,1.3,1.6,0.8)
add.constraint(model, coef3, "<=", 21)
solve(model)
## [1] 0
get.objective(model)
## [1] 485.2403
model<- make.lp(0,4)
name.lp(model, "Production Best Mix")
lp.control(model, sense="max")
## $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
## NULL
## 
## $timeout
## [1] 0
## 
## $verbose
## [1] "neutral"
set.objfn(model, c(26,35,25,37))
set.bounds( model, lower = c(1,1,1,1), upper = c(Inf,Inf,Inf,Inf))
set.type(model, c(1,2,3,4), type=c("real"))
coef1<- c(1.7,2.1,1.4,2.4)
add.constraint(model, coef1, "<=", 28)
coef2<- c(1.1,2.5,1.7,2.6)
add.constraint(model, coef2, "<=", 36)
coef3<- c(1.6,1.3,1.6,0.8)
add.constraint(model, coef3, "<=", 21)
solve(model)
## [1] 0
get.objective(model)
## [1] 469.9805
model<- make.lp(0,4)
name.lp(model, "Production Best Mix")
lp.control(model, sense="max")
## $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
## NULL
## 
## $timeout
## [1] 0
## 
## $verbose
## [1] "neutral"
set.objfn(model, c(26,35,25,37))
set.bounds( model, lower = c(1,1,1,1), upper = c(Inf,Inf,Inf,Inf))
set.type(model, c(1,2,3,4), type=c("real"))
coef1<- c(1.7,2.1,1.4,2.4)
add.constraint(model, coef1, "<=", 28)
coef2<- c(1.1,2.5,1.7,2.6)
add.constraint(model, coef2, "<=", 35)
coef3<- c(1.6,1.3,1.6,0.8)
add.constraint(model, coef3, "<=", 22)
solve(model)
## [1] 0
get.objective(model)
## [1] 472.2532