Email             :
RPubs            : https://rpubs.com/juliansalomo/
Github           : https://github.com/juliansalomo/
Jurusan          : Statistika
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.


Soal

Sebuah perusahaan memproduksi dua model kursi: A dan B. Model A membutuhkan 4 balok, 1 dudukan kursi, dan 1 sandaran kursi. Sedangkan model B membutuhkan 3 balok dan 1 dudukan kursi. Perusahaan memiliki stok awal 200 balok, 500 dudukan kursi, dan 100 sandaran kursi. Jika perusahaan membutuhkan lebih banyak balok, dudukan kursi, dan sandaran kursi, mereka dapat membeli kayu balok standar, yang harganya 80 euro per balok. Perusahaan dapat memproduksi 20 balok, 10 dudukan kursi, dan 2 sandaran kursi dari balok kayu standar. Biaya produksi model A adalah 30 euro/kursi, sedangkan biaya model B adalah 40 euro/kursi. Jika perusahaan menginformasikan bahwa jumlah minimum kursi yang harus diproduksi adalah 1000 unit per bulan. Tentukan model program linier, yang dapat meminimalkan total biaya.

Penentuan Variabel

  • \(A\) adalah jumlah kursi A yang akan diproduksi
  • \(B\) adalah jumlah kursi B yang akan diproduksi
  • \(C\) adalah jumlah balok kayu yang akan dibeli

Tabel Batasan

Balok dudukan kursi sandaran Biaya
\(A\) 4 1 1 30
\(B\) 3 1
40
\(C\) 20 10 2 80
Ketersediaan 200 500 100

Fungsi Tujuan

Dengan memperhatikan biaya produksi model A adalah 30 euro/kursi, biaya model B adalah 40 euro/kursi, dan biaya balok 80 euro/kursi

\[ Min(30x_A+40x_B+80x_C) \]

Fungsi Batasan

Balok

\[ 4x_A+3x_B \le 200+20x_C\\ 4x_A+3x_B-20x_C \le 200 \]

Dudukan kursi

\[ x_A+x_B \le 500+10x_C\\ x_A+x_B-10x_C \le 500 \]

Sandaran kursi

\[ x_A \le 100 +2x_C \\ x_A -2x_C \le 100 \]

Jumlah minimum produksi kursi

\[ x_A+x_B \ge 1000 \] # Matriks Koefisien {-}

\[ M=\begin{bmatrix} 1 & 1 & -10\\ 4&3&-20\\ 1&0&-2\\ -1&-1&0\\ \end{bmatrix}\\ N=\begin{bmatrix} 500\\ 200\\ 100\\ -1000\\ \end{bmatrix} \]

1 Menggunakan R

1.1 lpSolve

# Load lpSolve
library(lpSolve)

## koefisien variabel / fungsi objectif
O <- c(30, 40, 80)

# Buat matrix sebelah kiri
M <- matrix(c(1, 1, -10,
              4, 3, -20,
              1, 0, -2,
              1, 1, 0), nrow=4, byrow=TRUE)

# Buat matrix sebelah kanan
N <- c(500, 200, 100, 1000)

# set operator perbandingannya
constranints_direction  <- c("<=", "<=", "<=", ">=")

# panggil fungsi linear programming
optimum <-  lp(direction="min", #minimalkan biaya
               objective.in = O,
               const.mat = M,
               const.dir = constranints_direction,
               const.rhs = N,
               all.int = T)
# jika menghasilkan 0 maka feasible!
print(optimum$status)
## [1] 0
# nilai optimal dari x_A, x_B and x_C
best_sol <- optimum$solution
names(best_sol) <- c("x_A", "x_B", "x_C") 
print(best_sol)
## x_A x_B x_C 
## 420 580 161
#fungsi biaya
print(paste("Total cost: ", optimum$objval, sep=""))
## [1] "Total cost: 48680"

1.2 lpSolveAPI

library(lpSolveAPI)

lprec <- make.lp(nrow = 4, ncol = 3)

lp.control(lprec, sense="min")
## $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] "minimize"
## 
## $simplextype
## [1] "dual"   "primal"
## 
## $timeout
## [1] 0
## 
## $verbose
## [1] "neutral"
set.type(lprec, 1:3, type=c("integer"))

set.objfn(lprec, O)

# Tambahkan kendala
add.constraint(lprec, M[1, ], "<=", N[1])
add.constraint(lprec, M[2, ], "<=", N[2])
add.constraint(lprec, M[3, ], "<=", N[3])
add.constraint(lprec, M[4, ], ">=", N[4])

lprec
## Model name: 
##            C1   C2   C3            
## Minimize   30   40   80            
## R1          0    0    0  free     0
## R2          0    0    0  free     0
## R3          0    0    0  free     0
## R4          0    0    0  free     0
## R5          1    1  -10    <=   500
## R6          4    3  -20    <=   200
## R7          1    0   -2    <=   100
## R8          1    1    0    >=  1000
## Kind      Std  Std  Std            
## Type      Int  Int  Int            
## Upper     Inf  Inf  Inf            
## Lower       0    0    0
solve(lprec)
## [1] 0

0 berarti ditemukan solusi optimum

Nilai untuk \(x_a\), \(x_B\), dan \(x_C\) adalah:

get.variables(lprec)
## [1] 420 580 161

Nilai optimum tujuannya adalah:

get.objective(lprec)
## [1] 48680

2 Menggunakan Python

Pengerjaan dengan python

LS0tDQp0aXRsZTogIk9wdGltaXphdGlvbiINCnN1YnRpdGxlOiAiQXNzaWdubWVudCBXZWVrIDUiDQphdXRob3I6ICJKdWxpYW4gU2Fsb21vICgyMDE5NDkyMDAwMykiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBodG1sX2RvY3VtZW50OiBudWxsDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHNhbmRzdG9uZQ0KICAgIGNzczogRDovSnVsaWFuIFNhbG9tby9NYXRhbmEvMDAwMC9zdHlsZS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNsYXNzLnNvdXJjZSA9ICJub2NvcHkiLA0KICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLm91dHB1dCA9ICJub2NvcHkiLA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGLA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGKQ0KYGBgDQoNCmBgYHtyIG1lLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiRDovSnVsaWFuIFNhbG9tby9NYXRhbmEvMDAwMC9sb2dvLnBuZyIpDQpgYGANCg0KRW1haWwgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7OiAganVsaWFuc2Fsb21vMkBnbWFpbC5jb20gPGJyPg0KUlB1YnMgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogaHR0cHM6Ly9ycHVicy5jb20vanVsaWFuc2Fsb21vLyA8YnI+DQpHaXRodWIgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7IDogaHR0cHM6Ly9naXRodWIuY29tL2p1bGlhbnNhbG9tby8gPGJyPg0KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbU3RhdGlzdGlrYV0oaHR0cHM6Ly9tYXRhbmF1bml2ZXJzaXR5LmFjLmlkLz9seT1hY2FkZW1pYyZjPXNiKSA8YnI+DQpBZGRyZXNzICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgOiBBUkEgQ2VudGVyLCBNYXRhbmEgVW5pdmVyc2l0eSBUb3dlciA8YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyBKbC4gQ0JEIEJhcmF0IEthdiwgUlQuMSwgQ3VydWcgU2FuZ2VyZW5nLCBLZWxhcGEgRHVhLCBUYW5nZXJhbmcsIEJhbnRlbiAxNTgxMC4NCg0KKioqKg0KIyB7LX0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkobHBTb2x2ZSkNCmBgYA0KDQoNCiMgU29hbCB7LX0NCg0KU2VidWFoIHBlcnVzYWhhYW4gbWVtcHJvZHVrc2kgZHVhIG1vZGVsIGt1cnNpOiBBIGRhbiBCLiBNb2RlbCBBIG1lbWJ1dHVoa2FuIDQgYmFsb2ssIDEgZHVkdWthbiBrdXJzaSwgZGFuIDEgc2FuZGFyYW4ga3Vyc2kuIFNlZGFuZ2thbiBtb2RlbCBCIG1lbWJ1dHVoa2FuIDMgYmFsb2sgZGFuIDEgZHVkdWthbiBrdXJzaS4gUGVydXNhaGFhbiBtZW1pbGlraSBzdG9rIGF3YWwgMjAwIGJhbG9rLCA1MDAgZHVkdWthbiBrdXJzaSwgZGFuIDEwMCBzYW5kYXJhbiBrdXJzaS4gSmlrYSBwZXJ1c2FoYWFuIG1lbWJ1dHVoa2FuIGxlYmloIGJhbnlhayBiYWxvaywgZHVkdWthbiBrdXJzaSwgZGFuIHNhbmRhcmFuIGt1cnNpLCBtZXJla2EgZGFwYXQgbWVtYmVsaSBrYXl1IGJhbG9rIHN0YW5kYXIsIHlhbmcgaGFyZ2FueWEgODAgZXVybyBwZXIgYmFsb2suIFBlcnVzYWhhYW4gZGFwYXQgbWVtcHJvZHVrc2kgMjAgYmFsb2ssIDEwIGR1ZHVrYW4ga3Vyc2ksICBkYW4gMiBzYW5kYXJhbiBrdXJzaSBkYXJpIGJhbG9rIGtheXUgc3RhbmRhci4gQmlheWEgcHJvZHVrc2kgbW9kZWwgQSBhZGFsYWggMzAgZXVyby9rdXJzaSwgc2VkYW5na2FuIGJpYXlhIG1vZGVsIEIgYWRhbGFoIDQwIGV1cm8va3Vyc2kuIEppa2EgcGVydXNhaGFhbiBtZW5naW5mb3JtYXNpa2FuIGJhaHdhIGp1bWxhaCBtaW5pbXVtIGt1cnNpIHlhbmcgaGFydXMgZGlwcm9kdWtzaSBhZGFsYWggMTAwMCB1bml0IHBlciBidWxhbi4gVGVudHVrYW4gbW9kZWwgcHJvZ3JhbSBsaW5pZXIsIHlhbmcgZGFwYXQgbWVtaW5pbWFsa2FuIHRvdGFsIGJpYXlhLg0KIA0KIyBQZW5lbnR1YW4gVmFyaWFiZWwgey19DQoNCiogJEEkIGFkYWxhaCBqdW1sYWgga3Vyc2kgQSB5YW5nIGFrYW4gZGlwcm9kdWtzaQ0KKiAkQiQgYWRhbGFoIGp1bWxhaCBrdXJzaSBCIHlhbmcgYWthbiBkaXByb2R1a3NpDQoqICRDJCBhZGFsYWgganVtbGFoIGJhbG9rIGtheXUgeWFuZyBha2FuIGRpYmVsaQ0KDQojIFRhYmVsIEJhdGFzYW4gey19DQoNCistLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rDQp8ICAgICAgICAgICAgIHwgQmFsb2sgICAgfGR1ZHVrYW4ga3Vyc2l8c2FuZGFyYW4gIHxCaWF5YSAgICAgICAgfA0KKz09PT09PT09PT09PT0rPT09PT09PT09PSs9PT09PT09PT09PT09Kz09PT09PT09PT0rPT09PT09PT09PT09PSsNCnwgJEEkICAgICAgICAgfDQgICAgICAgICB8MSAgICAgICAgICAgIHwxICAgICAgICAgfDMwICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKw0KfCAkQiQgICAgICAgICB8MyAgICAgICAgIHwxICAgICAgICAgICAgfC0gICAgICAgICB8NDAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rDQp8ICRDJCAgICAgICAgIHwyMCAgICAgICAgfDEwICAgICAgICAgICB8MiAgICAgICAgIHw4MCAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsNCnxLZXRlcnNlZGlhYW4gfDIwMCAgICAgICB8NTAwICAgICAgICAgIHwxMDAgICAgICAgfC0gICAgICAgICAgICB8DQorLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKw0KDQojIEZ1bmdzaSBUdWp1YW4gey19DQoNCkRlbmdhbiBtZW1wZXJoYXRpa2FuIGJpYXlhIHByb2R1a3NpIG1vZGVsIEEgYWRhbGFoIDMwIGV1cm8va3Vyc2ksIGJpYXlhIG1vZGVsIEIgYWRhbGFoIDQwIGV1cm8va3Vyc2ksIGRhbiBiaWF5YSBiYWxvayA4MCBldXJvL2t1cnNpDQoNCiQkDQpNaW4oMzB4X0ErNDB4X0IrODB4X0MpDQokJA0KDQojIEZ1bmdzaSBCYXRhc2FuIHstfQ0KDQo+IEJhbG9rDQoNCiQkIA0KNHhfQSszeF9CIFxsZSAyMDArMjB4X0NcXA0KNHhfQSszeF9CLTIweF9DIFxsZSAyMDANCiQkDQoNCj4gRHVkdWthbiBrdXJzaQ0KDQokJA0KeF9BK3hfQiBcbGUgNTAwKzEweF9DXFwNCnhfQSt4X0ItMTB4X0MgXGxlIDUwMA0KJCQNCg0KPiBTYW5kYXJhbiBrdXJzaQ0KDQokJA0KeF9BIFxsZSAxMDAgKzJ4X0MgXFwNCnhfQSAtMnhfQyBcbGUgMTAwDQokJA0KDQo+IEp1bWxhaCBtaW5pbXVtIHByb2R1a3NpIGt1cnNpDQoNCiQkDQp4X0EreF9CIFxnZSAxMDAwDQokJA0KIyBNYXRyaWtzIEtvZWZpc2llbiB7LX0NCg0KJCQNCk09XGJlZ2lue2JtYXRyaXh9DQoxICYgMSAmIC0xMFxcDQo0JjMmLTIwXFwNCjEmMCYtMlxcDQotMSYtMSYwXFwNClxlbmR7Ym1hdHJpeH1cXA0KTj1cYmVnaW57Ym1hdHJpeH0NCjUwMFxcDQoyMDBcXA0KMTAwXFwNCi0xMDAwXFwNClxlbmR7Ym1hdHJpeH0NCiQkDQoNCiMgTWVuZ2d1bmFrYW4gUg0KDQojIyBscFNvbHZlDQoNCmBgYHtyfQ0KIyBMb2FkIGxwU29sdmUNCmxpYnJhcnkobHBTb2x2ZSkNCg0KIyMga29lZmlzaWVuIHZhcmlhYmVsIC8gZnVuZ3NpIG9iamVjdGlmDQpPIDwtIGMoMzAsIDQwLCA4MCkNCg0KIyBCdWF0IG1hdHJpeCBzZWJlbGFoIGtpcmkNCk0gPC0gbWF0cml4KGMoMSwgMSwgLTEwLA0KICAgICAgICAgICAgICA0LCAzLCAtMjAsDQogICAgICAgICAgICAgIDEsIDAsIC0yLA0KICAgICAgICAgICAgICAxLCAxLCAwKSwgbnJvdz00LCBieXJvdz1UUlVFKQ0KDQojIEJ1YXQgbWF0cml4IHNlYmVsYWgga2FuYW4NCk4gPC0gYyg1MDAsIDIwMCwgMTAwLCAxMDAwKQ0KDQojIHNldCBvcGVyYXRvciBwZXJiYW5kaW5nYW5ueWENCmNvbnN0cmFuaW50c19kaXJlY3Rpb24gIDwtIGMoIjw9IiwgIjw9IiwgIjw9IiwgIj49IikNCg0KIyBwYW5nZ2lsIGZ1bmdzaSBsaW5lYXIgcHJvZ3JhbW1pbmcNCm9wdGltdW0gPC0gIGxwKGRpcmVjdGlvbj0ibWluIiwgI21pbmltYWxrYW4gYmlheWENCiAgICAgICAgICAgICAgIG9iamVjdGl2ZS5pbiA9IE8sDQogICAgICAgICAgICAgICBjb25zdC5tYXQgPSBNLA0KICAgICAgICAgICAgICAgY29uc3QuZGlyID0gY29uc3RyYW5pbnRzX2RpcmVjdGlvbiwNCiAgICAgICAgICAgICAgIGNvbnN0LnJocyA9IE4sDQogICAgICAgICAgICAgICBhbGwuaW50ID0gVCkNCiMgamlrYSBtZW5naGFzaWxrYW4gMCBtYWthIGZlYXNpYmxlIQ0KcHJpbnQob3B0aW11bSRzdGF0dXMpDQojIG5pbGFpIG9wdGltYWwgZGFyaSB4X0EsIHhfQiBhbmQgeF9DDQpiZXN0X3NvbCA8LSBvcHRpbXVtJHNvbHV0aW9uDQpuYW1lcyhiZXN0X3NvbCkgPC0gYygieF9BIiwgInhfQiIsICJ4X0MiKSANCnByaW50KGJlc3Rfc29sKQ0KDQojZnVuZ3NpIGJpYXlhDQpwcmludChwYXN0ZSgiVG90YWwgY29zdDogIiwgb3B0aW11bSRvYmp2YWwsIHNlcD0iIikpDQpgYGANCg0KIyMgbHBTb2x2ZUFQSQ0KDQpgYGB7cn0NCmxpYnJhcnkobHBTb2x2ZUFQSSkNCg0KbHByZWMgPC0gbWFrZS5scChucm93ID0gNCwgbmNvbCA9IDMpDQoNCmxwLmNvbnRyb2wobHByZWMsIHNlbnNlPSJtaW4iKQ0KDQpzZXQudHlwZShscHJlYywgMTozLCB0eXBlPWMoImludGVnZXIiKSkNCg0Kc2V0Lm9iamZuKGxwcmVjLCBPKQ0KDQojIFRhbWJhaGthbiBrZW5kYWxhDQphZGQuY29uc3RyYWludChscHJlYywgTVsxLCBdLCAiPD0iLCBOWzFdKQ0KYWRkLmNvbnN0cmFpbnQobHByZWMsIE1bMiwgXSwgIjw9IiwgTlsyXSkNCmFkZC5jb25zdHJhaW50KGxwcmVjLCBNWzMsIF0sICI8PSIsIE5bM10pDQphZGQuY29uc3RyYWludChscHJlYywgTVs0LCBdLCAiPj0iLCBOWzRdKQ0KDQpscHJlYw0KDQpzb2x2ZShscHJlYykNCmBgYA0KDQowIGJlcmFydGkgZGl0ZW11a2FuIHNvbHVzaSBvcHRpbXVtDQoNCk5pbGFpIHVudHVrICR4X2EkLCAkeF9CJCwgZGFuICR4X0MkIGFkYWxhaDoNCg0KYGBge3J9DQpnZXQudmFyaWFibGVzKGxwcmVjKQ0KYGBgDQoNCk5pbGFpIG9wdGltdW0gdHVqdWFubnlhIGFkYWxhaDoNCg0KYGBge3J9DQpnZXQub2JqZWN0aXZlKGxwcmVjKQ0KYGBgDQoNCiMgTWVuZ2d1bmFrYW4gUHl0aG9uDQoNCltQZW5nZXJqYWFuIGRlbmdhbiBweXRob25dKGh0dHBzOi8vY29sYWIucmVzZWFyY2guZ29vZ2xlLmNvbS9kcml2ZS8xcFRHODBrX3Ric2VzQVB5dm1PcW41SW5SSlVPaW1RNlc/dXNwPXNoYXJpbmcp