You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
2.8 KiB

import model.Coord
import model.Customer
import model.HHCEdge
import scala.collection.mutable._
object Main {
def main(args: Array[String]): Unit = {
val coord1 = Coord(3, 4)
println(s"Distance from origin = ${coord1.distance}")
val cust1 = Customer(coord1, 5)
val cust2 = Customer(Coord(2, 5), 7)
println(s"Customer 1 = ${cust1}")
println(s"Customer 2 = ${cust2}")
val cust3 = Customer(Coord(3, 5), 6)
val cust4 = Customer(Coord(6, 8), 9)
val cust5 = Customer(Coord(5, 4), 6)
val edge1 = HHCEdge(cust1, cust2)
val edge2 = HHCEdge(cust3, cust4)
println(s"Edge 1 = ${edge1}")
println(s"Edge 1 weight = ${edge1.weight}")
val V = Array(cust1, cust2, cust3, cust4, cust5)
val E = Array(edge1, edge2)
V.foreach(println(_))
// prints
// Customer(Coord(3, 4), 5)
// Customer(Coord(2, 5), 7)
// Customer(Coord(3, 5), 6)
// Customer(Coord(6, 8), 9)
// Customer(Coord(5, 4), 6)
E.foreach(println(_))
//prints
// HHCEdge(Customer(Coord(3, 4), 5), Customer(Coord(2, 5), 7))
// HHCEdge(Customer(Coord(3, 5), 6), Customer(Coord(6, 8), 9))
// sample adjacency
// format: off
val edges = Array(
Array(0 , 9 , 75, 0 , 0),
Array(9 , 0 , 95, 19, 42),
Array(75, 95, 0 , 51, 66),
Array(0 , 19, 51, 0 , 31),
Array(0 , 42, 66, 31, 0)
);
// format: on
// Prim's algorithm
val selected: ArrayBuffer[Boolean] =
ArrayBuffer.fill(5)(false)
selected(0) = true
for (_ <- 0 until 4) {
var min = 999999
var x = 0
var y = 0
for (i <- 0 until 5) {
if (selected(i) == true) {
for (j <- 0 until 5) {
if (selected(j) == false && edges(i)(j) != 0) {
if (min > edges(i)(j)) {
min = edges(i)(j)
x = i
y = j
}
}
}
}
}
println(s"Edge selected $x - $y : ${edges(x)(y)}")
selected(y) = true
}
// Prim's algorithm result
// Edge selected 0 - 1: 9
// Edge selected 1 - 3: 19
// Edge selected 3 - 4: 31
// Edge selected 3 - 2: 51
// Verify the result with the one at https://www.programiz.com/dsa/prim-algorithm
val edges2: ArrayBuffer[ArrayBuffer[Double]] = ArrayBuffer.empty
// create adjacency matrix from given customers
for (i <- 0 to 4) {
edges2.append(ArrayBuffer.empty)
for (j <- 0 to 4) {
edges2(i).append(HHCEdge(V(i), V(j)).weight)
}
}
edges2.foreach { e =>
e.foreach { d =>
print(f"$d%.2f, ")
}
println()
}
// prints
// 0.00 , 159.64, 112.79, 563.55, 225.88
// 159.64, 0.00 , 112.94, 564.16, 357.08
// 112.79, 112.94, 0.00 , 478.40, 252.42
// 563.55, 564.16, 478.40, 0.00 , 463.64
// 225.88, 357.08, 252.42, 463.64, 0.00
}
}