连接6个点的BFS逻辑

问题描述 投票:0回答:1

帮助我,我得到的是Index在数组的边界之外,当整数为5时,它是好的,现在,我增加了1个点,这使得逻辑错误,我需要帮助,这是我的代码

         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("Titik awal, Titik Tujuan, Biaya") Console.WriteLine("Titik Aval, 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 B , 10") Console.WriteLine("Titik A , Titik C , 5") Console. 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 C,6") Console.WriteLine("Titik B,Titik C,6") Console.WriteLine("Titik B,Titik C,7") 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 D , 7") Console.WriteLine("Titik B , Titik E , 5") Console.WriteLine("Titik B , Titik F , 6") Console. 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 F , 8") 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 F , 5") Console.WriteLine("Titik C , Titik F , 5") 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 E,Titik F,7")。 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. 在数据的基础上,我们还将对dftar jalur的数据进行分析,"如果你的数据是[jumlah titik x jumlah titik],那么你就会发现,你的数据是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. 在这个过程中,我们需要对这些数据进行分析,并将其转化为Penjelasan tentang fungsi ini和Pada perhitungan dibawah ini(4a - 4e) Dim jalur As ArrayList = BFS(daftarTitik, daftarBiaya, idxTitikAwal) '5. 在jalur的基础上,将biaya打到jalur上,但Dim biaya As Double = 0 For i As Integer = 0 To jalur.Count - 2 Dim titikAwal. 计数 - 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

vb.net algorithm logic breadth-first-search
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.