Optimization Story: Masalah Penjadwalan Tenaga Kesehatan di Rumah Sakit
Gara-gara tulisan saya terakhir terkait Linear Programming untuk menyelesaikan masalah product portofolio di marketplace yang lalu, saya jadi gak mau lepas untuk ngoprek lebih lanjut terkait hal ini.
Setelah membaca jurnal ini itu dan tulisan ini itu, saya mendapati salah satu faedah dari linear programming adalah bisa untuk menyelesaikan schedulling problem. Mulai dari yang simpel hingga yang rumit.
Salah satu teknik yang saya ketahui bisa menyelesaikan schedulling problem adalah dengan memanfaatkan algoritma travelling salesman problem dengan memodifikasi matriks jarak sehingga bisa applied dengan masalah jadwal. Topik ini akan saya simpan untuk tulisan di kemudian hari yah.
Nah kali ini, saya akan memberikan contoh bagaimana linear programming bisa digunakan untuk menyelesaikan schedulling problem sederhana di rumah sakit.
Ingat yah, ini masih case yang sederhana. Kalau rumit gimana? Percayalah, masalah rumit bisa dipecah menjadi masalah-masalah yang sederhana. Jadi secara algoritma, bisa kita pecah-pecah menjadi beberapa algoritma yang saling terhubung.
Problem
Pada masa pandemi ini, suatu rumah sakit membutuhkan tenaga kesehatan yang siap sedia setiap hari. Di setiap harinya, mereka membutuhkan minimal nakes tertentu agar pelayanan bisa dilakukan secara maksimal. Tapi mereka tidak bisa mempekerjakan terlalu banyak nakes karena alasan ruang dan budget yang terbatas.
Berikut adalah tabel kebutuhan nakes di rumah sakit tersebut setiap harinya:
hari | min_nakes_required | max_nakes_required |
---|---|---|
Senin | 24 | 29 |
Selasa | 22 | 27 |
Rabu | 23 | 28 |
Kamis | 11 | 16 |
Jumat | 16 | 21 |
Sabtu | 20 | 25 |
Minggu | 12 | 17 |
Jika berlaku kondisi sebagai berikut:
- Setiap nakes yang bekerja hanya diperbolehkan bekerja 5 hari secara berturut-turut dan harus istirahat (libur) secara 2 hari berturut-turut.
- Shift atau jam kerja kita abaikan dulu sementara.
Pertanyaannya:
Berapa banyak nakes yang harus dipekerjakan oleh rumah sakit tersebut?
Mencari Solusi
Untuk memudahkan saya membuat formulasi matematika dari problem di atas, saya akan buat terlebih dahulu tabel jadwal berikut:
hari | x1 | x2 | x3 | x4 | x5 | x6 | x7 | min_nakes_required | max_nakes_required |
---|---|---|---|---|---|---|---|---|---|
Senin | v | v | v | v | v | 24 | 29 | ||
Selasa | v | v | v | v | v | 22 | 27 | ||
Rabu | v | v | v | v | v | 23 | 28 | ||
Kamis | v | v | v | v | v | 11 | 16 | ||
Jumat | v | v | v | v | v | 16 | 21 | ||
Sabtu | v | v | v | v | v | 20 | 25 | ||
Minggu | v | v | v | v | v | 12 | 17 |
Keterangan:
- menandakan kelompok nakes yang perlu dipekerjakan.
- Nilai berupa bilangan bulat positif: .
v
menandakan hari saat kelompok nakes harus masuk kerja.
Formulasi Matematika
Dari tabel di atas, kita akan buat formulasi matematikanya berikut:
Objective Function
Tujuan kita kali ini adalah menentukan jumlah nakes seminimal mungkin yang bisa memenuhi tabel di atas:
Constraint
Dari tabel, kita bisa tuliskan constraints sebagai berikut:
- Hari Senin:
- Hari Selasa:
- Hari Rabu:
- Hari Kamis:
- Hari Jumat:
- Hari Sabtu:
- Hari Minggu:
Saatnya mencari solusi!
Jika kita buat matriks dari persamaan di atas:
## Constraint minimum required
## x1 x2 x3 x4 x5 x6 x7 min
## [1,] "1" "0" "0" "1" "1" "1" "1" "24"
## [2,] "1" "1" "0" "0" "1" "1" "1" "22"
## [3,] "1" "1" "1" "0" "0" "1" "1" "23"
## [4,] "1" "1" "1" "1" "0" "0" "1" "11"
## [5,] "1" "1" "1" "1" "1" "0" "0" "16"
## [6,] "0" "1" "1" "1" "1" "1" "0" "20"
## [7,] "0" "0" "1" "1" "1" "1" "1" "12"
## Constraint maximum required
## x1 x2 x3 x4 x5 x6 x7 max
## [1,] "1" "0" "0" "1" "1" "1" "1" "29"
## [2,] "1" "1" "0" "0" "1" "1" "1" "27"
## [3,] "1" "1" "1" "0" "0" "1" "1" "28"
## [4,] "1" "1" "1" "1" "0" "0" "1" "16"
## [5,] "1" "1" "1" "1" "1" "0" "0" "21"
## [6,] "0" "1" "1" "1" "1" "1" "0" "25"
## [7,] "0" "0" "1" "1" "1" "1" "1" "17"
Saat saya hitung dengan library(lpSolve)
, saya dapatkan
## Success: the objective function is 28
Kita cukup memerlukan 28 orang nakes untuk memenuhi kebutuhan rumah sakit tersebut. Bagaimana konfigurasi nakesnya?
## Konfigurasi Nakes per Kelompok Kerja
kelompok_nakes | banyak_nakes |
---|---|
x1 | 8 |
x2 | 3 |
x3 | 0 |
x4 | 5 |
x5 | 0 |
x6 | 12 |
x7 | 0 |
Oke, biar tidak bingung, saya kembalikan ke tabel di atas.
## Konfigurasi Final Solusi
hari | x1 | x2 | x3 | x4 | x5 | x6 | x7 | min_required | max_required | rekomendasi_pekerja |
---|---|---|---|---|---|---|---|---|---|---|
Senin | 8 | 0 | 0 | 5 | 0 | 12 | 0 | 24 | 29 | 25 |
Selasa | 8 | 3 | 0 | 0 | 0 | 12 | 0 | 22 | 27 | 23 |
Rabu | 8 | 3 | 0 | 0 | 0 | 12 | 0 | 23 | 28 | 23 |
Kamis | 8 | 3 | 0 | 5 | 0 | 0 | 0 | 11 | 16 | 16 |
Jumat | 8 | 3 | 0 | 5 | 0 | 0 | 0 | 16 | 21 | 16 |
Sabtu | 0 | 3 | 0 | 5 | 0 | 12 | 0 | 20 | 25 | 20 |
Minggu | 0 | 0 | 0 | 5 | 0 | 12 | 0 | 12 | 17 | 17 |
Summary
Dari kasus ini, saya bisa mendapatkan konfigurasi terbaik berapa banyak nakes yang harus dipekerjakan setiap harinya.
Jika mau dibuat lebih detail, misalkan:
- Detail shift.
- Tambahan constraint wages dan syarat-syarat per nakes.
Saya tinggal membuat formulasi matematika yang lebih detail lagi.