package main
import (
"fmt"
"math"
)
// Matriks jarak antar kota
var distanceMatrix = [][]int{
{0, 20, 28, 7},
{24, 0, 25, 8},
{19, 22, 0, 19},
{27, 25, 21, 0},
}
var n = len(distanceMatrix)
var bound = math.MaxInt64
var bestRoute []int
// Fungsi untuk menghitung estimasi biaya minimum untuk rute tersisa
func minimumPossibleCost(remainingCities []int, currentCity int) int {
minCost := 0
for _, city := range remainingCities {
min := math.MaxInt64
for _, nextCity := range remainingCities {
if distanceMatrix[city][nextCity] < min {
min = distanceMatrix[city][nextCity]
}
}
minCost += min
}
return minCost
}
// Fungsi rekursif untuk mengimplementasikan algoritma Branch and Bound
func tspBranchAndBound(currentCity int, visitedCities []int, currentCost int) {
// Jika semua kota telah dikunjungi
if len(visitedCities) == n {
// Tambahkan biaya untuk kembali ke kota awal
totalCost := currentCost + distanceMatrix[currentCity][visitedCities[0]]
if totalCost < bound {
bound = totalCost
bestRoute = append([]int(nil), visitedCities...)
bestRoute = append(bestRoute, visitedCities[0])
}
return
}
// Iterasi untuk setiap kota yang belum dikunjungi
for city := 0; city < n; city++ {
alreadyVisited := false
for _, v := range visitedCities {
if v == city {
alreadyVisited = true
break
}
}
if !alreadyVisited {
newCost := currentCost + distanceMatrix[currentCity][city]
remainingCities := []int{}
for i := 0; i < n; i++ {
if !contains(visitedCities, i) && i != city {
remainingCities = append(remainingCities, i)
}
}
if newCost+minimumPossibleCost(remainingCities, city) < bound {
tspBranchAndBound(city, append(visitedCities, city), newCost)
}
}
}
}
// Fungsi helper untuk memeriksa apakah suatu elemen ada dalam slice
func contains(slice []int, elem int) bool {
for _, v := range slice {
if v == elem {
return true
}
}
return false
}
func main() {
// Memulai algoritma Branch and Bound dari kota pertama (index 0)
tspBranchAndBound(0, []int{0}, 0)
// Cetak rute terbaik dan biaya terendah
fmt.Println("Rute Terbaik:", bestRoute)
fmt.Println("Biaya Terendah:", bound)
}