Narasi Cerita
Pada tugas kali ini saya mendapat kasus Knapsack Problem yang harus diselesaikan menggunakan algoritma Depth First Search (DFS). Knapsack Problem adalah salah satu contoh permasalahan optimasi yang sering muncul dalam mata kuliah Algoritma dan Struktur Data. Inti dari permasalahan ini adalah bagaimana cara memilih kombinasi barang yang bisa dimasukkan ke dalam tas dengan kapasitas tertentu, sehingga nilai barang yang dibawa menjadi maksimal tetapi tidak melebihi batas kapasitas tas.
Dalam kasus saya, kapasitas tas yang diberikan adalah 10 kg, dan tersedia 5 buah barang dengan berat serta nilai yang berbeda-beda:
- Barang 1 → berat 6 kg, nilai 30
- Barang 2 → berat 3 kg, nilai 14
- Barang 3 → berat 4 kg, nilai 16
- Barang 4 → berat 2 kg, nilai 9
- Barang 5 → berat 5 kg, nilai 20
Strategi penyelesaian dengan algoritma DFS dilakukan dengan cara:
- Setiap barang memiliki dua kemungkinan: dipilih atau tidak dipilih.
- DFS akan menelusuri semua kombinasi barang secara rekursif.
- Jika total berat kombinasi tidak melebihi kapasitas tas (10 kg), maka nilai total barang tersebut dibandingkan dengan nilai maksimum yang sudah ditemukan.
- Setelah seluruh kemungkinan kombinasi ditelusuri, nilai terbesar akan menjadi solusi optimal.
Dari hasil penelusuran, ditemukan beberapa kombinasi menarik:
- Barang 1 + Barang 2 → total berat 9 kg, total nilai 44
- Barang 2 + Barang 4 + Barang 5 → total berat 10 kg, total nilai 43
- Barang 1 + Barang 3 → total berat 10 kg, total nilai 46
Dari ketiga contoh kombinasi di atas, nilai terbesar adalah 46, sehingga kombinasi terbaik adalah Barang 1 (6 kg, 30) dan Barang 3 (4 kg, 16).
Coding Program (Java)
public class KnapsackDFS {
static int[] weight = {6, 3, 4, 2, 5};
static int[] value = {30, 14, 16, 9, 20};
static int capacity = 10;
static int maxValue = 0;
public static void main(String[] args) {
dfs(0, 0, 0);
System.out.println("Nilai maksimum yang bisa diperoleh = " + maxValue);
}
static void dfs(int index, int totalWeight, int totalValue) {
// Jika semua barang sudah dicek
if (index == weight.length) {
if (totalWeight <= capacity) {
maxValue = Math.max(maxValue, totalValue);
}
return;
}
// Pilih barang ke-index
if (totalWeight + weight[index] <= capacity) {
dfs(index + 1, totalWeight + weight[index], totalValue + value[index]);
}
// Tidak pilih barang ke-index
dfs(index + 1, totalWeight, totalValue);
}
}
Output Program
Nilai maksimum yang bisa diperoleh = 46
Codingan di atas mendefinisikan kelas DFS untuk menyelesaikan Knapsack Problem.
Pertama, dibuat array weight untuk menyimpan berat barang, array value
untuk menyimpan nilai barang, variabel capacity untuk kapasitas tas (10 kg),
serta maxValue untuk menyimpan hasil nilai maksimum.
Pada method main, fungsi dfs(0,0,0) dipanggil yang artinya mulai dari
barang pertama dengan total berat dan nilai awal 0, lalu hasil akhir nilai maksimum ditampilkan.
Fungsi dfs bekerja secara rekursif, di mana setiap barang memiliki dua pilihan:
dipilih (jika total berat tidak melebihi kapasitas) atau tidak dipilih. Jika semua barang sudah dicek
(index == weight.length), maka program akan mengevaluasi apakah total berat masih dalam kapasitas,
dan jika iya, maxValue diperbarui dengan nilai terbesar antara nilai sebelumnya dan nilai baru.
Dengan cara ini semua kombinasi barang diperiksa, dan akhirnya didapatkan nilai maksimum 46 dengan kombinasi terbaik Barang 1 dan Barang 3.
Kesimpulan
Dari percobaan yang saya lakukan, algoritma DFS berhasil menemukan solusi optimal untuk Knapsack Problem dengan kapasitas 10 kg dan 5 buah barang. Kombinasi terbaik adalah Barang 1 (6 kg, 30) dan Barang 3 (4 kg, 16) dengan total nilai 46.
Melalui tugas ini, saya jadi lebih memahami bagaimana algoritma DFS bekerja dalam menelusuri semua kemungkinan solusi secara menyeluruh. Walaupun untuk jumlah barang yang lebih banyak DFS bisa menjadi kurang efisien karena eksplorasi cabang sangat banyak, tetapi pada kasus kecil seperti ini algoritma DFS sangat efektif dan dapat menjamin hasil optimal.



.jpeg)





.jpeg)







.jpeg)



