BFS logi c подключение 6 точек - PullRequest
0 голосов
/ 08 мая 2020

Помогите мне, я получил Индекс был за пределами массива. это было нормально, когда количество целых чисел было 5, теперь я добавляю еще 1 точку, и это вызывает ошибки logi c, мне нужна помощь, вот мои коды

         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</p>

<code>        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
</code>

...