OPTIMASI

~ Program Linear dengan R ~

Nb: Untuk segala bentuk diskusi, kritik dan saran mengenai materi silahkan hubungi admin!


Alamat Sebagai Berikut : \(\downarrow\)
Email
Instagram 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,

Gambar 1: Matriks Program Linier, sumber:dsciencelabs.


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:

Gambar 2: Solusi Grafis Kasus Minimalisasi, sumber:dsciencelabs.


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 
Fungsi_tujuan <- c(2,3)

# Matriks kendala sisi kiri --> Left Hand Side (LHS)  
LHS <- matrix(c(1,0,
                1,1,
                2,1,
                0,1), nrow = 4, byrow = TRUE)

# Matriks kendala sisi kanan --> Right Hand Side (RHS) 
RHS <- c(125, 350, 600,400)

# Daftar arah kendala
Arah_kendala  <- c(">=", ">=", "<=", '<=')

# Temukan solusi optimal 
model1 <-  lp(direction="min",
               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 
sol <- model1$solution 
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
model2 <- make.lp(nrow = 4, ncol = 2)

# 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 
Fungsi_tujuan <- c(2,3)

# Matriks kendala sisi kiri --> Left Hand Side (LHS)  
LHS <- matrix(c(1,0,
                1,1,
                2,1,
                0,1), nrow = 4, byrow = TRUE)

# Matriks kendala sisi kanan --> Right Hand Side (RHS) 
RHS <- c(125, 350, 600,400)

# 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)

Fungsi_tujuan <- c(-2000 , 5000)   
LHS <- matrix (c(1,0 , 
                    0,1 , 
                    1,0 , 
                    0,1 , 
                    1,1) , ncol=2, byrow =TRUE)     
Arah_kendala <- c("<=", "<=", ">=", ">=", ">=")
RHS <- c(200 , 170 , 100, 80 , 200)               

# Penyelesaian
model3 <- lp ("max", 
              Fungsi_tujuan, 
              LHS, 
              Arah_kendala, 
              RHS, 
              compute.sens = TRUE)

# Nilai Optimal yang dimaksimumkan
print(model3)
## Success: the objective function is 650000
# Nilai variabel keputusan
model3$solution 
## [1] 100 170

Referensi