OPTIMASI
~ Program Linear dengan R ~
Nb: Untuk segala bentuk diskusi, kritik dan saran mengenai materi silahkan hubungi admin!
Alamat | Sebagai Berikut : \(\downarrow\) |
dsciencelabs@outlook.com | |
https://www.instagram.com/dsciencelabs/ | |
RPubs | https://rpubs.com/dsciencelabs/ |
Github | https://github.com/dsciencelabs/ |
Telegram | @dsciencelabs |
Optimasi Program Linier (OPL)
Optimasi Program linier merupakan teknik aplikasi dari matematika yang dikembangkan oleh George B. Dantzig pada tahun 1947. Kata “linier” berarti bahwa seluruh fungsi persamaan atau pertidaksamaan matematis yang disajikan dari permasalahan ini haruslah bersifat linier, sedangkan kata “program” merupakan sinonim untuk model perencanaan. Jadi, program linier mencakup perencanaan kegiatan‐kegiatan untuk mencapai hasil yang optimal, yaitu suatu hasil yang mencerminkan tercapainya sasaran atau tujuan tertentu yang paling baik. Dengan demikian, pemrograman linier merupakan proses penyusunan program linier yang solusinya menjadi dasar bagi pengambilan keputusan terhadap problem riil yang dimodelkan atau diprogramlinierkan. Program linier berkaitan dengan penjelasan suatu dunia nyata sebagai suatu model matematika yang terdiri atas sebuah fungsi tujuan.
Definisi OPL
Definisi sederhana dari program linier adalah suatu cara/teknik aplikasi matematika untuk menyelesaikan persoalan pengalokasian sumber‐sumber terbatas di antara beberapa aktivitas yang bertujuan untuk memaksimumkan keuntungan atau meminimumkan biaya yang dibatasi oleh batasan‐batasan tertentu, atau dikenal juga dengan teknik optimalisasi dan sistem kendala linier.
Bentuk Umum OPL
Bentuk umum optimasi program linier dapat dituliskan:
\[ \begin{align*} \min_x \quad f(c_1x_1,c_1x_1+\cdots+c_1x_1) & = \min_x(c^T x) &,\text{fungsi objektif}\\ Ax &\geq b &,\text{fungsi kendala}\\ x_j &\geq 0 \quad \forall j \in N &,\text{fungsi kendala}\\ \sum_{i=1}^n x_i &= 1 &,\text{fungsi kendala} \end{align*} \]
Dengan notasi matriks dapat dutiliskan dengan,
Keterangan dari simbol yang digunakan sebagai berikut:
- \(m =\) banyaknya jenis sumber yang terbatas atau fasilitas yang tersedia.
- \(n =\) banyaknya kegiatan‐kegiatan yang menggunakan sumber atau fasilitas terbatas tersebut
- \(x_j\) = variabel keputusan untuk kegiatan ke‐\(j=1,2,\cdots,n\)
- \(a_{ij} =\) banyaknya sumber \(i\) yang diperlukan untuk menghasilkan setiap unit keluaran (output) kegiatan \(j \space (i=1,2,\cdots,m; j=1,2,\cdots,n)\).
- \(b_i =\) banyaknya sumber (fasilitas) \(i\) yang tersedia untuk dialokasikan ke setiap unit kegiatan \((i=1,2,\cdots,m)\)
- \(c_j =\) kenaikan nilai \(f\) apabila pertambahaan tingkat kegiatan \((x_{ij})\) dengan satu satuan (unit) atau merupakan sumbangan setiap satuan keseluruhan kegiatan \(j\) terhadap nilai \(f\)
- \(f =\) nilai yang dioptimalkan (maksimum atau minimum). Bentuk program linier di atas juga dapat disajikan dengan
Nb: Bentuk umum program linier diatas adalah nilai optimum \(min \space f\), anda juga dapat menyesuaikanya pada kasus \(maks \space f.\)
OPL ~ Minimal
Contoh kasus ini diambil dari buku An Introduction to Management Science : Quantitative Approach to Decision Making, pada halaman 52, bab 2,5. Dalam hal ini, diperlihatkan bagaimana menyelesaikan masalah pemrograman linier sederhana dengan menggunakan R.
Permasalahan 1
M&D Chemicals memproduksi dua produk yang dijual sebagai bahan mentah ke perusahaan yang memproduksi sabun mandi dan deterjen pencuci pakain. Berdasarkan analisis tingkat persediaan saat ini dan permintaan potensial untuk bulan mendatang, manajemen M&D menetapkan bahwa produksi gabungan untuk produk A dan B harus berjumlah setidaknya 350 galon. Secara terpisah, pesanan pelanggan utama untuk 125 galon produk A juga harus dipenuhi. Produk A membutuhkan waktu pemrosesan 2 jam per galon dan produk B membutuhkan waktu pemrosesan 1 jam per galon. Untuk bulan mendatang, tersedia 600 jam waktu pemrosesan. Tujuan M&D adalah untuk memenuhi persyaratan ini dengan total biaya produksi minimum. Biaya produksi adalah $2 per galon untuk produk A dan $3 per galon untuk produk B. Misalkan, ada tambahan kendala bahwa produksi maksimum untuk B adalah 400 galon.
Rumusan Masalah
Berdasarkan latar belakang permasalahan di atas maka diperoleh:
- Fungsi tujuan: Dengan memperhatikan biaya produksi $2 per galon untuk produk A dan $3 per galon untuk produk B, maka fungsi tujuan yang sesuai dengan minimalisasi total biaya produksi dapat ditulis sebagai
\[Min(2x_A+3x_B)\]
- Kendala: Diperoleh beberapa fungsi kendala sebagai
berikut:
- Untuk memenuhi permintaan pelanggan utama untuk 125 galon produk A, kita tahu A harus setidaknya 125. \[x_A\geq 125\]
- Produksi gabungan untuk kedua produk harus berjumlah setidaknya 350 galon \[x_A+x_B≥350\]
- Waktu pemrosesan yang tersedia tidak boleh lebih dari 600 jam \[2x_A+x_B≤600\]
- Produksi B tidak boleh melebihi 400 galon \[x_b≤400\]
- Karena produksi A atau B tidak bisa negatif. \[x_A\geq 0,x_B \geq 0\]
- Variabel keputusan: Berdasarkan fungsi tujuan dan
batasan masalah yang ada maka diperoleh variabel keputasan,
- \(x_A =\) jumlah galon produk A
- \(x_B =\) jumlah galon produk B
Solusi Grafis dan Manual
Selanjutnya, fungsi tujuan, batasan, dan varibel keputasan tersebut dapat dituliskan dalam tabel
A | B | Arah kendala | Ketersedian |
1 | 0 | ≥ | 125 |
1 | 1 | ≥ | 350 |
2 | 1 | ≤ | 600 |
0 | 1 | ≤ | 400 |
Berkutnya, dengan mengunakan fungsi kendala pada grafik/plot maka diperoleh daerah yang diarsir sebagai daerah persimpangan yang memenuhi semua kendala. Solusi yang memenuhi semua kendala disebut solusi layak, dan daerah yang diarsir disebut daerah solusi layak, atau hanya daerah layak. Perhatikan grafik berikut:
Dengan mengamati plot di atas, diketahui bahwa \(x_b<400\) adalah kendala yang berlebihan. Sehingga, dalam hal ini permasalah yang sebenarnya adalah untuk menemukan nilai A dan B yang dapat memberikan nilai biaya total yang lebih kecil adalah,
\[ \begin{align*} x_A+x_B &\geq 350 \\ 2x_A+x_B &\leq 600 \end{align*} \]
Kemudian dapat dilakukan metode subtitusi atau metode eliminasi, diperoleh \(x_A=250\) (ini sudah memenuhi fungsi kendala \(x_A\geq 125\)) dan \(x_B=100\). Sehingga, titik ekstrim ini memberikan solusi biaya minimum dengan nilai fungsi tujuan \(Min(2x_A+3x_B) = 800.\)
Solusi dengan R
R dapat menyelesaikan permasalahan tersebut di atas dengan
menggunakan paket (libary) yaitu; lpSolve
dan
lpSolveAPI
yang merupakan sejenis API yang dibangun di atas
paket linprog
.
lpSolve
Berikut ini dilampirkan penyelesainnya;
library(lpSolve)
# Daftar koefisien fungsi tujuan
<- c(2,3)
Fungsi_tujuan
# Matriks kendala sisi kiri --> Left Hand Side (LHS)
<- matrix(c(1,0,
LHS 1,1,
2,1,
0,1), nrow = 4, byrow = TRUE)
# Matriks kendala sisi kanan --> Right Hand Side (RHS)
<- c(125, 350, 600,400)
RHS
# Daftar arah kendala
<- c(">=", ">=", "<=", '<=')
Arah_kendala
# Temukan solusi optimal
<- lp(direction="min",
model1 objective.in = Fungsi_tujuan,
const.mat = LHS,
const.rhs = RHS,
const.dir = Arah_kendala,
all.int = T,
compute.sens = TRUE)
print(model1)
## Success: the objective function is 800
Dari hasil diatas hanya memperlihatkan nilai dari fungsi tujuannya (objective function) saja. Untuk melihat struktur atau ringkasa penyelesain yang dilakukan paket ini secara keseluruhan gunakan perintah berikut:
str(model1)
## List of 28
## $ direction : int 0
## $ x.count : int 2
## $ objective : num [1:2] 2 3
## $ const.count : int 4
## $ constraints : num [1:4, 1:4] 1 0 2 125 1 1 2 350 2 1 ...
## ..- 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 800
## $ solution : num [1:2] 250 100
## $ presolve : int 0
## $ compute.sens : int 1
## $ sens.coef.from : num [1:2] -1e+30 2e+00
## $ sens.coef.to : num [1:2] 3e+00 1e+30
## $ duals : num [1:6] 0 4 -1 0 0 0
## $ duals.from : num [1:6] -1.00e+30 3.00e+02 4.75e+02 -1.00e+30 -1.00e+30 ...
## $ duals.to : num [1:6] 1.00e+30 4.75e+02 7.00e+02 1.00e+30 1.00e+30 ...
## $ 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"
Jika anda ingin melihat spesifik nilai tertentu, dapat mengunakan beberapa perintah yang dibawah ini:
# Menandakan status penyelesaian: 0 = berhasil, 2 = tidak ada solusi yang layak
print(model1$status)
## [1] 0
# Menampilkan nilai optimal untuk variabel keputusan x_A dan x_B
<- model1$solution
sol names(sol) <- c("x_A", "x_B")
print(sol)
## x_A x_B
## 250 100
# Memeriksa nilai fungsi tujuan pada titik optimum
print(paste("Biaya Minimum: ", model1$objval, sep=""))
## [1] "Biaya Minimum: 800"
# Putuskan koneksi dari model dan solusi optimal
rm(model1, Arah_kendala, sol)
lpSolveAPI
Berikut ini dilampirkan penyelesainnya;
library(lpSolveAPI)
# Tetapkan 4 kendala dan 2 variabel keputusan
<- make.lp(nrow = 4, ncol = 2)
model2
# Tetapkan jenis masalah
lp.control(model2, sense="min")
# Tetapkan jenis variabel keputusan
set.type(model2, 1:2, type=c("integer"))
# Tetapkan vektor koefisien fungsi tujuan
set.objfn(model2, Fungsi_tujuan)
# Daftar koefisien fungsi tujuan
<- c(2,3)
Fungsi_tujuan
# Matriks kendala sisi kiri --> Left Hand Side (LHS)
<- matrix(c(1,0,
LHS 1,1,
2,1,
0,1), nrow = 4, byrow = TRUE)
# Matriks kendala sisi kanan --> Right Hand Side (RHS)
<- c(125, 350, 600,400)
RHS
# Arah Kendala
add.constraint(model2, LHS[1, ], ">=", RHS[1])
add.constraint(model2, LHS[2, ], ">=", RHS[2])
add.constraint(model2, LHS[3, ], "<=", RHS[3])
add.constraint(model2, LHS[4, ], "<=", RHS[4])
print(model2)
## Model name:
## C1 C2
## Minimize 2 3
## R1 0 0 free 0
## R2 0 0 free 0
## R3 0 0 free 0
## R4 0 0 free 0
## R5 1 0 >= 125
## R6 1 1 >= 350
## R7 2 1 <= 600
## R8 0 1 <= 400
## Kind Std Std
## Type Int Int
## Upper Inf Inf
## Lower 0 0
# Cek solosi: status 0, artinya ditemukan solusi
solve(model2)
## [1] 0
# Dapatkan nilai variabel keputusan
get.variables(model2)
## [1] 250 100
# Mencari nilai optimum (dalam hal ini minimal)
get.objective(model2)
## [1] 800
OPL ~ Maksimal
Permasalahan 2
Sebuah perusahaan memproduksi 2 jenis mobil yang menjadi produk unggulan, yaitu: model A dan model B. Berdasarkan analisa jangka panjang yang dilakukan, diproyeksikan bahwa permintaan terhadap produk tersebut akan terus meningkat setidaknya 100 mobil model A dan 80 mobil model B setiap hari. Karena keterbatasan kapasitas produksi, tidak lebih dari 200 mobil model A dan 170 mobil model B dapat dibuat setiap hari. Untuk memenuhi kontrak pengiriman, setidaknya mereka mengirimkan sebanyak 200 mobil setiap hari. Jika setiap mobil model A yang dijual menghasilkan kerugian 2.000 dolar, tetapi setiap mobil model B menghasilkan keuntungan 5.000 dolar, berapa banyak dari setiap jenis yang harus dibuat setiap hari untuk memaksimalkan laba bersih?
library(lpSolve)
<- c(-2000 , 5000)
Fungsi_tujuan <- matrix (c(1,0 ,
LHS 0,1 ,
1,0 ,
0,1 ,
1,1) , ncol=2, byrow =TRUE)
<- c("<=", "<=", ">=", ">=", ">=")
Arah_kendala <- c(200 , 170 , 100, 80 , 200)
RHS
# Penyelesaian
<- lp ("max",
model3
Fungsi_tujuan,
LHS,
Arah_kendala,
RHS, compute.sens = TRUE)
# Nilai Optimal yang dimaksimumkan
print(model3)
## Success: the objective function is 650000
# Nilai variabel keputusan
$solution model3
## [1] 100 170
Referensi
- R Kipp Martin, Thomas A. Williams, David R. Anderson, and Dennis J.
Sweeney, 2012, An Introduction to Management Science : Quantitative
Approach to Decision Making, ISBN: 9788131518342, Edition: 13th,
Cengage Learning.
- https://www.kdnuggets.com/2018/05/optimization-using-r.html
- https://www.rdocumentation.org/packages/boot/versions/1.3-28/topics/simplex
- https://www.matem.unam.mx/~omar/math340/simplex-intro.html
- https://www.studiobelajar.com/program-linear/