- General Info
- Creator Info
- Features
- Technologies Used
- Setup
- Usage
- Algorithm
- Video Capture
- Screenshots
- Structure
- Project Status
- Room for Improvement
- Acknowledgements
- Contact
Sebuah aplikasi berbasis website sederhana yang dapat digunakan untuk melakukan pencarian data mata kuliah
agar memperoleh nilai maksimal dengan memanfaatkan algoritma dynamic programming
, menambah data mata kuliah
via text field dan JSON file
, menampilkan data mata kuliah
dan melakukan penghapusan data mata kuliah
. Website ini dibangun dengan React
sebagai Framework FrontEnd
, Golang
sebagai Framework BackEnd
, dan MySQL
sebagai database. Repository Backend dan Frontend terpisah satu sama lain. Tugas ini digunakan untuk memenuhi Tugas 8 Seleksi Lab IRK tahun 2023
.
Nama | NIM | |
---|---|---|
Mohammad Rifqi Farhansyah | 13521166 | [email protected] |
Mencari data mata kuliah
padaSearchPage
agar mendapatkan nilai maksimaldengan algoritma dynamic programming
Menambahkan data mata kuliah
denganTextField atau JSON File
padaAdd Page
Melihat data mata kuliah
danmenghapus data mata kuliah
padaData Page
Note: The version of the libraries above is the version that we used in this project. You can use the latest version of the libraries.
- Clone Repository ini dengan menggunakan command berikut
git clone https://github.com/rifqifarhansyah/CourseScheduler_Backend.git
- Buka Folder "coursescheduler_backend" di Terminal
- Jalankan script docker dengan menjalankan
docker compose build
- Lalu jalankan program dengan perintah
docker compose up
- Program backend akan otomatis dijalankan pada localhost
(default PORT:5001)
- Atau dengan cara lain yaitu membuka pranala berikut ini
- Untuk
mencari mata kuliah yang menghasilkan nilai maksimal
, masuk keSearch Page
lalu isi seluruhtext field yang diminta
, kemudian tekan tombolsearch
- Untuk
menambahkan mata kuliah
, masuk keAdd Page
lalu pilih metode yang hendak digunakan, apabila menggunakan metodetext field
, isi seluruhtext field yang diminta
, kemudian tekan tomboladd
- Apabila
penambahan mata kuliah
dilakukan viaJSON File
, maka terlebih dahulu cekJSON Example
, sesuaikan format JSON masukan, lalu tekanChoose File
untuk memilih file JSON yang hendak digunakan - Untuk
melihat data mata kuliah yang ada
, masuklah keData Page
- Sementara itu,
penghapusan data mata kuliah
dapat dilakukan dengan menekanicon kotak sampah
di samping tiap data mata kuliah padadata page
Algoritma Dynamic Programming
adalah sebuah metode untuk memecahkan masalah yang bisa dipecahkan dengan cara memecahkannya menjadi submasalah yang lebih kecil, kemudian menyimpan solusi dari setiap submasalah yang telah dipecahkan untuk menghindari perhitungan yang berulang. Teknik ini umumnya digunakan untuk mengoptimalkan masalah di mana solusi optimal dapat dicapai dengan menggabungkan solusi dari submasalah yang lebih kecil.
Pada kode program ini, terdapat fungsi searchCourses
yang menggunakan algoritma Dynamic Programming
untuk menyelesaikan masalah Knapsack (rucksack) dengan sedikit variasi
. Masalah Knapsack umumnya adalah masalah di mana kita memiliki beberapa item dengan nilai tertentu dan kapasitas tertentu di dalam knapsack, dan kita perlu memilih kombinasi item yang menghasilkan nilai maksimum tanpa melebihi kapasitas knapsack.
Dalam kasus kode di bawah, kita memiliki sejumlah mata kuliah dengan bobot SKS tertentu
dan nilai prediksi untuk setiap mata kuliah
. Tujuan dari algoritma ini adalah untuk memilih kombinasi mata kuliah yang memiliki bobot SKS maksimum yang tidak melebihi batas maksimum yang telah ditentukan, dengan nilai prediksi total yang maksimal.
- Langkah Persiapan
- Mata kuliah yang relevan dengan jurusan dan fakultas masukan diambil menggunakan fungsi
getCoursesByJurusanFakultas
. Kemudian, mata kuliah yang sesuai dengan semester yang diinginkan (semesterPengambilan) dipilih dan disimpan dalamvalidCourses
.
- Inisialisasi DP Table
dp
adalah tabel dua dimensi untuk menyimpan nilai prediksi maksimum yang dapat dicapai dengan memilih kombinasi mata kuliah tertentu, dengan jumlah SKS yang telah ditentukan. dp[i][w] akan berisi nilai prediksi maksimum dengan mempertimbangkan i mata kuliah pertama dan memiliki total SKS maksimum w.
- Dynamic Programming - Proses Pengisian DP Table
- Melalui iterasi untuk setiap mata kuliah dan total SKS yang mungkin, tabel dp diisi dengan nilai prediksi maksimum. Jika SKS dari mata kuliah ke-i (validCourses[i-1].JumlahSks) lebih kecil dari atau sama dengan total SKS w, maka ada dua pilihan: Memasukkan mata kuliah ke-i dalam kombinasi dengan mempertimbangkan nilai prediksi getKonversiValue(validCourses[i-1].PrediksiNilai) atau tidak memasukkan mata kuliah ke-i dalam kombinasi.Pilihan terbaik diambil menggunakan fungsi max untuk memperbarui nilai dp[i][w].
- Memilih Mata Kuliah yang Menghasilkan Nilai Prediksi Maksimum
- Setelah tabel dp terisi, kita dapat menemukan kombinasi mata kuliah dengan nilai prediksi maksimum yang tidak melebihi batas SKS (maxSKS).
Mata kuliah yang terpilih disimpan dalam
selectedCourses
dengan membalik iterasi melalui tabel dp.
- Hasil
selectedCourses
berisi daftar mata kuliah yang dipilih yang akan dikembalikan sebagai respons dari fungsisearchCoursesAPI
.
Untuk menganalisis kompleksitas algoritma di atas, kita perlu mempertimbangkan dua tahap utama dari algoritma tersebut:
-
Inisialisasi DP Table: Algoritma melakukan inisialisasi tabel dp dengan ukuran n+1 (jumlah mata kuliah + 1) baris dan maxSKS+1 kolom, di mana n adalah jumlah mata kuliah yang sesuai dengan semester yang diinginkan. Oleh karena itu, kompleksitas inisialisasi tabel adalah O(n * maxSKS).
-
Proses Pengisian DP Table: Algoritma menggunakan dua loop bersarang untuk mengisi nilai-nilai tabel dp. Loop pertama memiliki n iterasi, dan loop kedua memiliki maxSKS iterasi. Dalam setiap iterasi, terdapat operasi konstan yang dilakukan (cek kondisi, pemilihan nilai maksimum dengan fungsi max, dan operasi aritmatika lainnya). Oleh karena itu, kompleksitas pengisian tabel adalah O(n * maxSKS).
Oleh karena kedua tahap tersebut dilakukan secara terpisah (tidak bersarang), kompleksitas keseluruhan algoritma adalah penjumlahan dari kedua kompleksitas tersebut:
Kompleksitas Total = O(n * maxSKS) + O(n * maxSKS) = O(n * maxSKS)
Jadi, kompleksitas algoritma Dynamic Programming di atas adalah O(n * maxSKS), dengan n adalah jumlah mata kuliah yang sesuai dengan semester yang diinginkan dan maxSKS adalah kapasitas maksimum SKS yang diizinkan.
Gambar 1. Search Page
Gambar 2. Add Page via Text Field
Gambar 3. Add Page via JSON File
Gambar 4. JSON File Example
Gambar 5. Data and Remove Page
Gambar 6. Searching Result
│ .env
│ docker-compose.yml
│ Dockerfile
│ go.mod
│ go.sum
│ main
│ main.go
│ README.md
│
├───img
│ CourseScheduler.gif
│ SS1.png
│ SS2.png
│ SS3.png
│ SS4.png
│ SS5.png
│ SS6.png
│
└───tes
tes1.json
tes2.json
Project is: complete
Perbaikan yang dapat dilakukan pada program ini adalah:
- Meningkatkan efektifitas algoritma dynamic programming
- Terima kasih kepada Tuhan Yang Maha Esa