Report Content
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:
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
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)
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)")
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 |
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