0

I got the error message:

Index was outside the bounds of the array.

It was fine when integer count was 5, now I'm adding 1 more dot and which makes the logic errors.

 Module Module1
        Sub Main()
            Console.WriteLine("Algoritma BFS (Breadth First Search)")
            Console.WriteLine("Contoh: Pencarian jalur yang melalui semua titik")
        Console.WriteLine("Diasumsikan ada 7 titik yang harus dilalui semuanya, yaitu A,B,C,D,E,F,G")
        Console.WriteLine("semua titik tidak terhubung secara langsung, melainkan hanya melalui jalur tertentu saja")
        Console.WriteLine("setiap jalur juga memiliki biaya yang berbeda")
        Console.WriteLine("maka tentukan jalur yang harus diambil untuk mengelilingi semua titik yang ada")
        Console.WriteLine("Diasumsikan data jalur yang tersedia adalah sebagai berikut")
        Console.WriteLine("Titik awal, Titik Tujuan, Biaya")
        Console.WriteLine("Titik A , Titik B , 10")
        Console.WriteLine("Titik A , Titik C , 5")
        Console.WriteLine("Titik A , Titik D , 9")
        Console.WriteLine("Titik A , Titik E , 7")
        Console.WriteLine("Titik A , Titik F , 8")
        Console.WriteLine("Titik A , Titik G , 12")
        Console.WriteLine("Titik B , Titik C , 6")
        Console.WriteLine("Titik B , Titik D , 7")
        Console.WriteLine("Titik B , Titik E , 5")
        Console.WriteLine("Titik B , Titik F , 6")
        Console.WriteLine("Titik B , Titik G , 9")
        Console.WriteLine("Titik C , Titik D , 4")
        Console.WriteLine("Titik C , Titik E , 5")
        Console.WriteLine("Titik C , Titik F , 8")
        Console.WriteLine("Titik C , Titik G , 7")
        Console.WriteLine("Titik D , Titik E , 6")
        Console.WriteLine("Titik D , Titik F , 8")
        Console.WriteLine("Titik D , Titik G , 7")
        Console.WriteLine("Titik E , Titik F , 7")
        Console.WriteLine("Titik E , Titik G , 7")
        Console.WriteLine("Titik F , Titik G , 9")
        Console.WriteLine("")
        'Tentukan jumlah titik yang harus dihubungkan 'Diasumsikan dalam kasus ini, jumlah titik ada 6 buah 
        Const jumlahTitik As Integer = 6
        Console.WriteLine("jumlah titik             = " & jumlahTitik)
        Console.WriteLine("")
        '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, 5}
        '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) { _
        {10, 5, 9, 7, 8, 12}, _
        {0, 6, 7, 5, 6, 9}, _
        {0, 0, 4, 5, 8, 7}, _
        {0, 0, 0, 6, 8, 7}, _
        {0, 0, 0, 0, 7, 7}, _
        {0, 0, 0, 0, 0, 9} _
    }
        '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
        Console.WriteLine("")
        '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 = BFS(daftarTitik, daftarBiaya, idxTitikAwal)
        '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
        Console.WriteLine("Total biaya = " & biaya)
        Console.ReadLine()
    End Sub

    Public Function BFS(ByVal daftartitik() As Integer, ByVal daftarBiaya(,) As Double, ByVal idxTitikAwal As Integer) As ArrayList
        '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 pertama ke titik terakhir 
        For i As Integer = 0 To daftartitik.Length - 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
        Console.WriteLine("Titik Awal = " & Chr(jalur(0) + 65))
        '4e. Lakukan perhitungan selama masih ada titik yang belum dihitung (poin 4e1 - 4e4) 
        While daftarInduk.Count > 0
            Dim titikSebelumnya As Integer = jalur(jalur.Count - 1)
            Dim titikBerikutnya As Integer = daftarInduk(0)
            '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
            Console.WriteLine("Memasukkan Titik " & Chr(titikBerikutnya + 65))
            '4e3. Jika terdapat jalur antara titik sebelumnya dan titik berikutnya, 'Lakukan pengecekan apakah semua titik sudah dihitung semua 'Jika kondisi tersebut benar, maka hentikan perhitungan 
            If daftarBiaya(titikSebelumnya, titikBerikutnya) <> 0 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 tidak terdapat jalur antara titik sebelumnya dan titik berikutnya, 
                'maka lakukan perhitungan berikut (poin 4e4a - 4e4f) 
            Else
                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("")
                '4e4a. Tampilkan pesan kesalahan karena tidak terdapat jalur antara titik sebelumnya dan titik berikutnya 
                Console.WriteLine("Jalur tidak valid karena Titik " & Chr(titikSebelumnya + 65) & " dan Titik " & Chr(titikBerikutnya + 65) & " tidak memiliki jarak")
                Console.WriteLine("")
                '4e4b. 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
                '4e4c. 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
                '4e4d. 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))
                    depth(jalur.Count - 1) -= 2
                End While
                Dim titikTujuan As Integer = daftarInduk(daftarInduk.Count - 1)
                Dim titikTerdekat As Integer = -1
                Dim idxtitikTerdekat As Integer = -1
                '4e4e. Tentukan titik berikutnya dengan urutan terdekat setelah titik yang terakhir dihitung 
                'Yaitu titik dengan selisih indeks positif terendah 
                Dim minSelisihPositif As Integer = Integer.MaxValue
                For i As Integer = 0 To daftarInduk.Count - 2
                    If daftarInduk(i) - titikTujuan > 0 AndAlso minSelisihPositif > daftarInduk(i) - titikTujuan Then
                        minSelisihPositif = daftarInduk(i) - titikTujuan
                        titikTerdekat = daftarInduk(i)
                        idxtitikTerdekat = i
                    End If
                Next
                '4e4f. Setelah menemukan titik terdekat, 'Urutkan semua titik yang belum dihitung selain titik terdekat 'Kemudian masukkan titik terdekat ini pada urutan pertama sebelum urutan tersebut 
                daftarInduk.RemoveAt(idxtitikTerdekat)
                daftarInduk.Sort()
                daftarInduk.Insert(0, titikTerdekat)
                Console.WriteLine("")
            End If
        End While
        Return jalur
    End Function

    Private Function daftarBiaya() As Double(,)
        Throw New NotImplementedException
    End Function

End Module
Jason Aller
  • 3,541
  • 28
  • 38
  • 38

0 Answers0