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.

114 lines
3.2 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. import model.Coord
  2. import model.Customer
  3. import model.HHCEdge
  4. import scala.collection.mutable._
  5. object Main {
  6. def main(args: Array[String]): Unit = {
  7. val coord1 = Coord(3, 4)
  8. println(s"Distance from origin = ${coord1.distance}")
  9. val cust1 = Customer(coord1, 5)
  10. val cust2 = Customer(Coord(2, 5), 7)
  11. println(s"Customer 1 = ${cust1}")
  12. println(s"Customer 2 = ${cust2}")
  13. val cust3 = Customer(Coord(3, 5), 6)
  14. val cust4 = Customer(Coord(6, 8), 9)
  15. val cust5 = Customer(Coord(5, 4), 6)
  16. val edge1 = HHCEdge(cust1, cust2)
  17. val edge2 = HHCEdge(cust3, cust4)
  18. println(s"Edge 1 = ${edge1}")
  19. println(s"Edge 1 weight = ${edge1.weight}")
  20. val V = Array(cust1, cust2, cust3, cust4, cust5)
  21. val E = Array(edge1, edge2)
  22. V.foreach(println(_))
  23. // prints
  24. // Customer(Coord(3, 4), 5)
  25. // Customer(Coord(2, 5), 7)
  26. // Customer(Coord(3, 5), 6)
  27. // Customer(Coord(6, 8), 9)
  28. // Customer(Coord(5, 4), 6)
  29. E.foreach(println(_))
  30. //prints
  31. // HHCEdge(Customer(Coord(3, 4), 5), Customer(Coord(2, 5), 7))
  32. // HHCEdge(Customer(Coord(3, 5), 6), Customer(Coord(6, 8), 9))
  33. // sample adjacency
  34. // format: off
  35. val edges = Array(
  36. Array(0 , 9 , 75, 0 , 0),
  37. Array(9 , 0 , 95, 19, 42),
  38. Array(75, 95, 0 , 51, 66),
  39. Array(0 , 19, 51, 0 , 31),
  40. Array(0 , 42, 66, 31, 0)
  41. );
  42. //format: on
  43. // Prim's algorithm
  44. val selected: ArrayBuffer[Boolean] =
  45. ArrayBuffer.from(Array.ofDim[Boolean](5).toIndexedSeq)
  46. selected(0) = true
  47. var numberOfEdges = 0
  48. for (_ <- numberOfEdges to 3) {
  49. var min = 999999
  50. var x = 0
  51. var y = 0
  52. for (i <- 0 to 4) {
  53. if (selected(i) == true) {
  54. for (j <- 0 to 4) {
  55. if (selected(j) == false && edges(i)(j) != 0) {
  56. if (min > edges(i)(j)) {
  57. min = edges(i)(j)
  58. x = i
  59. y = j
  60. }
  61. }
  62. }
  63. }
  64. }
  65. println(s"Edge selected $x - $y : ${edges(x)(y)}")
  66. selected(y) = true
  67. }
  68. // Prim's algorithm result
  69. // Edge selected 0 - 1: 9
  70. // Edge selected 1 - 3: 19
  71. // Edge selected 3 - 4: 31
  72. // Edge selected 3 - 2: 51
  73. // Verify the result with the one at https://www.programiz.com/dsa/prim-algorithm
  74. val edges2: ArrayBuffer[ArrayBuffer[Double]] = ArrayBuffer.empty
  75. // create adjacency matrix from given customers
  76. for (i <- 0 to 4) {
  77. edges2.append(ArrayBuffer.empty)
  78. for (j <- 0 to 4) {
  79. edges2(i).append(HHCEdge(V(i), V(j)).weight)
  80. }
  81. }
  82. println(edges2) // prints adjacency matrix
  83. // ArrayBuffer(
  84. // ArrayBuffer(0.0 , 1.4142135623730951, 1.0 , 5.0 , 2.0),
  85. // ArrayBuffer(1.4142135623730951, 0.0 , 1.0 , 5.0 , 3.1622776601683795),
  86. // ArrayBuffer(1.0 , 1.0 , 0.0 , 4.242640687119285, 2.23606797749979),
  87. // ArrayBuffer(5.0 , 5.0 , 4.242640687119285, 0.0 , 4.123105625617661),
  88. // ArrayBuffer(2.0 , 3.1622776601683795, 2.23606797749979 , 4.123105625617661, 0.0),
  89. // )
  90. }
  91. }