Algoritma DLS (Depth Limited Search) adalah salah satu algoritma yang digunakan untuk pencarian jalur. Contoh yang dibahas kali ini adalah mengenai pencarian jalur yang melalui semua titik.
Algoritma ini merupakan variasi dari Algoritma DFS (Depth First Search) yang sudah dijelaskan sebelumnya. Jika Algoritma DFS (Depth First Search) melakukan perhitungan (yang dimulai dengan titik terakhir) dengan cara menghabiskan semua tingkatan / kedalaman dari sebuah titik, maka algoritma ini memiliki batasan dimana perhitungan pada sebuah titik hanya dihitung sampai pada kedalaman tertentu. Setelah semua kemungkinan pada kedalaman itu sudah habis, kemudian akan dilanjutkan pada titik berikutnya.
Diasumsikan ada 5 titik yang harus dilalui semuanya, yaitu A,B,C,D,E
semua titik tidak terhubung secara langsung dengan titik-titik lainnya, melainkan hanya melalui jalur tertentu saja
setiap jalur juga memiliki biaya sendiri-sendiri
maka tentukan jalur yang harus diambil untuk mengelilingi semua titik yang ada
Diasumsikan data jalur yang tersedia adalah sebagai berikut
Titik awal | Titik Tujuan | Biaya |
---|---|---|
Titik A | Titik B | 10 |
Titik A | Titik E | 11 |
Titik B | Titik A | 12 |
Titik B | Titik C | 20 |
Titik B | Titik D | 6 |
Titik B | Titik E | 9 |
Titik C | Titik B | 15 |
Titik C | Titik D | 14 |
Titik D | Titik B | 7 |
Titik D | Titik C | 5 |
Titik E | Titik C | 8 |
Titik E | Titik D | 13 |
Jika diilustrasikan dalam gambar, maka model data awal adalah sebagai berikut
Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan jumlah titik yang harus dihubungkan
Diasumsikan dalam kasus ini, jumlah titik ada 5 buah
Const jumlahTitik As Integer = 5
* Tentukan limit atau batas maksimal kedalaman pencarian
Karena ada 5 titik yang akan dicari solusinya, maka limit harus bernilai minimal 5 buah agar solusi dapat ditemukan
Jika tidak, maka solusi tidak dapat ditemukan karena pencarian titik tidak akan sampai pada pencarian 5 titik.
Const limit As Integer = 5
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan inisialisasi daftar titik sebanyak jumlah titik, dan masukkan masing-masing titik ke dalam daftar
Dim daftarTitik() As Integer = New Integer(jumlahTitik - 1) {0, 1, 2, 3, 4}
2. Lakukan inisialisasi daftar jalur sesuai dengan data yang tersedia
Terdapat matriks berukuran [jumlah titik x jumlah titik] untuk menyimpan jalur dari masing-masing titik
Jika tidak ada jalur diantara 2 titik, maka nilai jalurnya adalah 0
Dim daftarBiaya(,) As Double = New Double(jumlahTitik - 1, jumlahTitik - 1) { _ {0, 10, 0, 0, 11}, _ {12, 0, 20, 6, 9}, _ {0, 15, 0, 14, 0}, _ {0, 7, 5, 0, 0}, _ {0, 0, 8, 13, 0} _ }
3. Tentukan titik awal pencarian jalur
Console.WriteLine("Tentukan titik awal pencarian jalur antara 1 sampai dengan " & jumlahTitik & ": ") Dim idxTitikAwal As Integer = Integer.Parse(Console.ReadLine) - 1
4. Lakukan perhitungan pencarian jalur melalui semua titik yang ada
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 4a – 4e)
Dim jalur As ArrayList = DLS(daftarTitik, daftarBiaya, idxTitikAwal)
Memasuki perhitungan pada fungsi DLS
4a. Masukkan titik awal sebagai titik pertama yang akan dicari jalurnya
Dim daftarInduk As New ArrayList() daftarInduk.Add(idxTitikAwal)
4b. Kemudian masukkan titik-titik lain secara terurut dari titik terakhir ke titik pertama
For i As Integer = daftartitik.Length - 1 To 0 Step -1 If i <> idxTitikAwal Then daftarInduk.Add(i) Next
4c. Inisialisasi variabel depth / kedalaman untuk mengetahui kedalaman pada saat pencarian jalur
Dim depth(daftartitik.Count - 1) As Integer Dim depthNormal(daftartitik.Count - 1) As Integer For i As Integer = 0 To depthNormal.Length - 1 depth(i) = daftartitik.Count - i depthNormal(i) = daftartitik.Count - 1 - i Next
4d. Masukkan titik pertama ke dalam jalur yang akan dihitung
Dan hilangkan titik tersebut dari daftar titik yang sudah dihitung
Dim jalur As New ArrayList() jalur.Add(daftarInduk(0)) daftarInduk.RemoveAt(0) depth(jalur.Count - 1) -= 1
4e. Lakukan perhitungan selama masih ada titik yang belum dihitung (poin 4e1 – 4e4)
4e1. Masukkan titik berikutnya ke dalam jalur yang sedang dihitung
Dan hilangkan titik tersebut dari daftar titik yang sudah dihitung
jalur.Add(titikBerikutnya) daftarInduk.RemoveAt(0)
4e2. Hitung kedalaman pada titik yang sedang dihitung
Apabila nilai kedalaman adalah 0, maka beri nilai awal kedalaman
Selain itu kurangkan nilai kedalamannya dengan 1
If depth(jalur.Count - 1) <= 0 Then depth(jalur.Count - 1) = depthNormal(jalur.Count - 1) Else depth(jalur.Count - 1) -= 1 End If
4e3. Jika terdapat jalur antara titik sebelumnya dan titik berikutnya,
dan semua titik sudah dihitung semua atau jumlah titik yang sedang dihitung belum melebihi limit / batas maksimal kedalaman,
maka lakukan pengecekan apakah semua titik sudah dihitung semua
Jika kondisi tersebut benar, maka hentikan perhitungan
If daftarBiaya(titikSebelumnya, titikBerikutnya) <> 0 _ AndAlso (jalur.Count = daftartitik.Count Or jalur.Count < limit) Then If jalur.Count = daftartitik.Count Then Console.WriteLine("Jalur sudah ditemukan") Console.Write("Jalur yang terbentuk = ") For i As Integer = 0 To jalur.Count - 1 Dim titik As Integer = jalur(i) Console.Write(IIf(i = 0, "", "-") & Chr(titik + 65)) Next Console.WriteLine("") End If . . .
4e4. Jika kondisi diatas tidak terpenuhi,
maka lakukan perhitungan berikut (poin 4e4a – 4e4g)
Else . . .
4e4a. Tampilkan pesan kesalahan apabila jumlah titik yang sedang dihitung sudah melebihi limit / batas maksimal kedalaman
If jalur.Count >= limit Then Console.WriteLine("Perhitungan dihentikan karena sudah mencapai limit / batas maksimal kedalaman") End If
4e4b. Tampilkan pesan kesalahan apabila tidak terdapat jalur antara titik sebelumnya dan titik berikutnya
If daftarBiaya(titikSebelumnya, titikBerikutnya) = 0 Then Console.WriteLine("Jalur tidak valid karena Titik " & Chr(titikSebelumnya + 65) & " dan Titik " & Chr(titikBerikutnya + 65) & " tidak memiliki jarak") Console.WriteLine("") End If
4e4c. Kurangi kedalaman pada posisi titik terhitung untuk masing-masing sisa titik yang tidak terhitung
For i As Integer = 0 To daftarInduk.Count - 1 depth(jalur.Count - 1) -= 1 Next
4e4d. Dan untuk sisa titik tersebut, beri nilai kedalaman dengan angka 0
For i As Integer = jalur.Count To depth.Count - 1 depth(i) = 0 Next
4e4e. Untuk semua titik dengan nilai kedalaman 0,
Hilangkan titik-titik tersebut dari jalur yang sedang dihitung
dan masukkan kembali titik-titik tersebut kedalam daftar titik yang sudah dihitung
While depth(jalur.Count - 1) <= 0 Dim titikTerakhir As Integer = jalur(jalur.Count - 1) daftarInduk.Add(titikTerakhir) jalur.Remove(titikTerakhir) Console.WriteLine("Melepas Titik " & Chr(titikTerakhir + 65)) If jalur.Count = 0 Then Console.WriteLine("") Console.WriteLine("Jalur Tidak Ditemukan") Return jalur End If depth(jalur.Count - 1) -= 1 End While
4e4f. Tentukan titik berikutnya dengan urutan terdekat setelah titik yang terakhir dihitung
Yaitu titik dengan selisih indeks negatif terendah
Dim minSelisihNegatif As Integer = Integer.MinValue For i As Integer = 0 To daftarInduk.Count - 2 If daftarInduk(i) - titikTujuan < 0 AndAlso minSelisihNegatif < daftarInduk(i) - titikTujuan Then minSelisihNegatif = daftarInduk(i) - titikTujuan titikTerdekat = daftarInduk(i) idxtitikTerdekat = i End If Next
4e4g. Setelah menemukan titik terdekat,
Urutkan semua titik yang belum dihitung selain titik terdekat dari titik terakhir ke titik pertama
Kemudian masukkan titik terdekat ini pada urutan pertama sebelum urutan tersebut
daftarInduk.RemoveAt(idxtitikTerdekat) daftarInduk.Sort() daftarInduk.Reverse() daftarInduk.Insert(0, titikTerdekat)
5. Setelah menemukan jalur, maka hitung biaya untuk jalur tersebut
Dim biaya As Double = 0 For i As Integer = 0 To jalur.Count - 2 Dim titikAwal As Integer = jalur(i) Dim titikTujuan As Integer = jalur(i + 1) biaya += daftarBiaya(titikAwal, titikTujuan) Next
Hasil akhir adalah: (klik untuk perbesar gambar)
Berikut adalah perhitungan jalur dengan menggunakan limit sebanyak jumlah titik, yaitu sebanyak 5 tingkat
Jika diilustrasikan dalam gambar, maka model hasil akhirnya adalah sebagai berikut
Berikut adalah perhitungan jalur dengan menggunakan limit hanya sebanyak 3 tingkat
Karena hanya menggunakan 3 tingkat saja, sedangkan solusi yang dicari harus berjumlah 5 titik, maka solusi tidak dapat ditemukan
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.