diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 66df3e0..9ada7f5 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -3,11 +3,11 @@ - %msg%n + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - + \ No newline at end of file diff --git a/src/main/scala/sim/HHCSim2.scala b/src/main/scala/sim/HHCSim2.scala index 7846f09..88f8970 100644 --- a/src/main/scala/sim/HHCSim2.scala +++ b/src/main/scala/sim/HHCSim2.scala @@ -15,10 +15,10 @@ import cats.implicits import scala.util.chaining._ class HHCSim2( - private val epsilonMax: Int = 0, - private val iterations: Int = 0, - private val WLDMax: Float = 0, - private val customers: String Either ArraySeq[Customer] + epsilonMax: Int = 0, + iterations: Int = 0, + WLDMax: Float = 0, + customers: String Either ArraySeq[Customer] ) extends LazyLogging { import HHCSim2._ import Ordering.Double.IeeeOrdering @@ -39,7 +39,7 @@ class HHCSim2( case (mstUpdated, clusters, edgeMappings, removedEdges) => printClusters(clusters) val e = - groupClusters2(mstUpdated, clusters, edgeMappings, removedEdges) + groupClusters(mstUpdated, clusters, edgeMappings, removedEdges) printGroups(e._5) e } @@ -184,7 +184,7 @@ class HHCSim2( logger.debug(s"Nearest neighbour = $s") // val avg = averagePairwiseDistance(mst(s)) val avg = adjMatrix - .map(m => averagePairwiseDistance(m)(clusters(s))) + .map(m => averagePairwiseDistance(m)(mutClusters(s))) .getOrElse(9999d) // if (avg < epsilonMax) true else false @@ -204,28 +204,9 @@ class HHCSim2( }) } - // def averagePairwiseDistance[T]( - // lst: List[HHCEdge2[T]] - // )(implicit num: Numeric[T]) = { - // val it = lst.combinations(2) - // val sum = lst.foldLeft(0)((x, y) => x + num.toInt(y.weight)) - // val n = if (lst.length == 0) 1 else lst.length - // val avg = sum / n - - // // it.map() - // avg - // } - def averagePairwiseDistance(graph: GraphMatrix[Double])( cluster: List[Int] ) = { - // val iter = cluster.combinations(2) - // var sum = 0d - // for (pair <- iter) { - // val (i, j) = pair(0) -> pair(1) - // sum += graph(i)(j) - // } - // val n = if (iter.length == 0) 1 else iter.length val (sum, size) = cluster .combinations(2) .foldLeft((0d, 0))((acc, pair) => { @@ -266,10 +247,6 @@ object HHCSim2 extends HHCTypes { arr match { case Array(latitude, longitude, workLoad) => { val cust = - // Customer( - // Coord(latitude.toDouble, longitude.toDouble), - // workLoad.toFloat - // ) for { lat <- latitude.toDoubleOption lon <- longitude.toDoubleOption @@ -280,7 +257,6 @@ object HHCSim2 extends HHCTypes { case Some(c) => loop(lst += c, iter) case None => Left(s"Error reading customers at line - $line") } - // loop(lst += cust, iter) } case _ => { if (line.equals(" ") || line.contains("\n")) @@ -439,21 +415,8 @@ object HHCSim2 extends HHCTypes { val result = ArraySeq.tabulate(mstUpdated.length) { i => { val buf = ListBuffer[Int]() - // mstUpdated(i).isEmpty match { - // case true => { lst += i } - // case false => { - // if (!visited(i)) { - // lst ++= DFS(i)(mstUpdated) - // for (j <- lst) visited(j) = true - // } - // } - // } visited(i) match { - case true => { - // val (nds, rms) = assignEdges(List(i), removedEdges2) - // egdeMappings(i) = nds - // removedEdges2 = rms - } + case true => case false if (!mstUpdated(i).isEmpty) => { val nodes = DFS(i)(mstUpdated) buf ++= nodes @@ -475,8 +438,6 @@ object HHCSim2 extends HHCTypes { // println(s"Removed edges size: ${removedEdges2.size}") - // result - // (result, ArraySeq.unsafeWrapArray(egdeMappings), removedEdges) ( mstUpdated, result.filterNot(_.isEmpty), @@ -503,31 +464,11 @@ object HHCSim2 extends HHCTypes { val node = iter.next val (filt, rm) = removedEdges.partition(e => e.fromNode == node) - // removedEdges.partition(e => e.toNode == node || e.fromNode == node) loop(nodes, rm, iter, filt) } } - // val filtered = ListBuffer.empty[HHCEdge2[T]] - // val updated = ListBuffer.empty[HHCEdge2[T]] - // for (node <- nodes) { - // val (filt, rm) = - // removedEdges.partition(e => e.toNode == node || e.fromNode == node) - // if (!filtered.isEmpty) { - // // return (filt.toList, rm.toList) - // } else { - // filtered ++= filt - // updated ++= rm - // } - // } - - // print(filtered) - // (filtered.toList, updated.toList) val (edges, removedEdgesUpdated) = loop(nodes, removedEdges, it, List.empty[HHCEdge2[T]]) - // val edges2 = edges.sortWith { - // case (HHCEdge2(_, _, weight1), HHCEdge2(_, _, weight2)) => - // weight1 < weight2 - // } (edges, removedEdgesUpdated) } @@ -543,50 +484,6 @@ object HHCSim2 extends HHCTypes { } def groupClusters[N: Ordering]( - clusters: Clusters, - edgeMappings: ArraySeq[List[HHCEdge2[N]]], - removed: RemovedEdges[N] - ) = { - var k = -1 - val clustMap = collection.mutable.Map.empty[Int, Int] - val groups = ArraySeq.tabulate(edgeMappings.size)(i => { - val buf = ListBuffer.empty[(Int, N)] - val lst = edgeMappings(i) - val y = lst.foreach(e => { - if (edgeMappings(e.toNode).isEmpty) { - // var buf = ListBuffer.empty[(Int, N)] - for (j <- 0 until clusters.size) { - for (edge <- clusters(j)) { - if (edge == e.toNode) - buf += (j -> e.weight) - } - } - // Left(buf.toList) - } else { - buf += ((e.toNode, e.weight)) - } - // Right(lst.map { - // case HHCEdge2(fromNode, toNode, weight) => (toNode, weight) - // }) - }) - if (!clusters(i).isEmpty) { - k += 1 - clustMap += k -> i - } - // val lst2 = lst.map { - // case HHCEdge2(fromNode, toNode, weight) => (toNode, weight) - // } - // if (buf.isEmpty) lst2 else buf.toList ::: lst2 - // if (lt.isEmpty) rt else lt - (k, buf.sortWith { - case ((_, weight1), (_, weight2)) => - weight1 < weight2 - }.toList) - }) - (clusters, clustMap.toMap, removed, groups) - } - - def groupClusters2[N: Ordering]( mst: Graph[N], clusters: Clusters, edgeMappings: ArraySeq[List[HHCEdge2[N]]], @@ -607,147 +504,3 @@ object HHCSim2 extends HHCTypes { (mst, clusters, edgeMappings, removed, groups) } } -// def fun2[N: Numeric]( -// clusters: Clusters, -// clustMap: Map[Int, Int], -// removedEdges: RemovedEdges[N], -// groups: ArraySeq[(Int, List[(Int, N)])] -// ) = { -// customers.map(c => { -// val mutClusters = -// clusters.view.filterNot(_.isEmpty).zipWithIndex.toArray -// val k = mutClusters.size -// // val k = clustMap.size -// for (_ <- 0 until iterations) { -// val WL = mutClusters.view -// // .filter(!_._1.isEmpty) -// .map(e => { -// val (clust, _) = e -// val customers = clust.map(j => c(j)) -// val wl = customers.foldLeft(0f)(_ + _.workload) -// wl -// }) -// .to(ArraySeq) -// // logger.debug(s"$mutClusters") -// logger.debug(s"$WL") -// var counter = 0 -// mutClusters.sortInPlaceWith((x, y) => { -// val l = WL(counter) -// if (counter < mutClusters.length - 1) counter += 1 -// println(s"$counter") -// val r = WL(counter) -// l < r -// // WL(x._2) < WL(y._2) -// }) -// val (minWL, maxWL) = WL.foldLeft((99999f, 0f))((x, y) => { -// val (currMin, currMax) = x -// if (y < currMin) (y, currMax) -// else if (y > currMax) (currMin, y) -// else x -// }) -// // val mutSortedClust = mutClusters.sort -// val WLD = maxWL - minWL -// // logger.debug(s"Iterations = $iterations") - -// logger.debug(s"maxWL = $maxWL, minWL = $minWL") -// logger.debug(s"WLD = $WLD") -// if (WLD > WLDMax) { -// val clustNum = Random.between(((k / 2) + 1), k) -// // while (clusters(groupNum).isEmpty) { -// // print(s"num = $groupNum") -// // groupNum = Random.between(((k / 2) + 1), k) -// // } -// // val clustT = mutClusters(groupNum) -// logger.debug(s"Chosen Num=$clustNum") -// // val t = groups(groupNum)._1 -// val p = mutClusters(clustNum)._2 -// logger.debug(s"Clust num =$p") -// val t = clustMap(p) -// // val t = mutClusters(clustNum)._2 -// logger.debug(s"T=$t") -// val s = groups(t)._2(0) -// logger.debug(s"Nearest neighbour = ${s._1}") -// } -// } -// ArraySeq.unsafeWrapArray(mutClusters) -// }) -// } -// def workloadBalance[N: Numeric]( -// clusters: Clusters, -// edgeMappings: ArraySeq[List[HHCEdge2[N]]], -// removedEdges: RemovedEdges[N], -// groups: ArraySeq[(Int, List[(Int, N)])] -// ) = -// customers.map { c => -// val k = clusters.size -// val mutClusters = clusters.toArray -// for (_ <- 0 until iterations) { -// val worlkLoads = -// mutClusters.map( -// _.map(j => c(j)).foldLeft(0f)((x, y) => x + y.workload) -// ) -// val sortedClusters = -// mutClusters.map(_.sortWith((x, y) => c(x).workload < c(y).workload)) -// val minWL = -// c.foldLeft(c(0).workload)(_ min _.workload) -// val maxWL = -// c.foldLeft(0f)(_ max _.workload) -// val WLD = maxWL - minWL -// if (WLD > WLDMax) { -// var t = Random.between(((k / 2) + 1), k) -// while (!mutClusters(t).isEmpty) t = Random.between(((k / 2) + 1), k) -// val Ds = groups(t)._2(0) -// mutClusters.updated(Ds._1, t) -// } -// } -// } - -// def fun[N: Numeric]( -// clusters: Clusters, -// clustMap: Map[Int, Int], -// removedEdges: RemovedEdges[N], -// groups: ArraySeq[(Int, List[(Int, N)])] -// ) = { -// customers.map(c => { -// val mutClusters = clusters.toArray -// // val k = mutClusters.size -// val k = clustMap.size -// for (_ <- 0 until iterations) { -// val WL = mutClusters.view -// .filter(!_.isEmpty) -// .map(clust => { -// val customers = clust.map(j => c(j)) -// val wl = customers.foldLeft(0f)(_ + _.workload) -// wl -// }) -// .to(ArraySeq) -// val (minWL, maxWL) = WL.foldLeft((99999f, 0f))((x, y) => { -// val (currMin, currMax) = x -// if (y < currMin) (y, currMax) -// else if (y > currMax) (currMin, y) -// else x -// }) -// // val mutSortedClust = mutClusters.sort -// val WLD = maxWL - minWL -// // logger.debug(s"Iterations = $iterations") -// logger.debug(s"$WL") -// logger.debug(s"maxWL = $maxWL, minWL = $minWL") -// logger.debug(s"WLD = $WLD") -// if (WLD > WLDMax) { -// var clustNum = Random.between(((k / 2) + 1), k) -// // while (clusters(groupNum).isEmpty) { -// // print(s"num = $groupNum") -// // groupNum = Random.between(((k / 2) + 1), k) -// // } -// // val clustT = mutClusters(groupNum) -// logger.debug(s"Clust Num=$clustNum") -// // val t = groups(groupNum)._1 -// val t = clustMap(clustNum) -// logger.debug(s"T=$t") -// val s = groups(t)._2(0) -// logger.debug(s"Nearest neighbour = ${s._1}") -// } -// } -// ArraySeq.unsafeWrapArray(mutClusters) -// }) -// } diff --git a/test-output2.txt b/test-output2.txt index 429e5f9..86265eb 100644 --- a/test-output2.txt +++ b/test-output2.txt @@ -1,4 +1,3 @@ -Graph: 0.00, 1169.81, 464.59, 945.75, 1282.33, 1037.66, 640.89, 335.29, 111.67, 1142.56, 876.33, 845.31, 1211.84, 587.31, 735.31, 497.33, 994.87, 922.07, 767.10, 1206.08, 1169.81, 0.00, 722.99, 682.83, 191.14, 527.48, 777.24, 929.62, 1122.63, 195.17, 605.52, 512.54, 221.44, 833.01, 862.90, 703.24, 856.59, 540.04, 634.58, 278.41, 464.59, 722.99, 0.00, 724.38, 859.17, 599.15, 302.60, 218.49, 402.17, 732.89, 621.64, 398.11, 747.67, 294.91, 643.37, 234.41, 848.21, 485.90, 527.86, 813.31, @@ -93,208 +92,159 @@ ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 42.29, 55.81, 23. Current order [2, 1, 9, 7, 10, 8, 4, 6, 0, 5, 3] maxWL = 338.0, minWL = 2.66 WLD = 335.34 -Rand Num=10 -Chosen cluster = 3 -Nearest neighbour = 9 -Pairwise average = 0.0 -Average less than epsilonMax. Updating Clusters. -Clusters: -Cluster-0: 0 8 -Cluster-1: 1 -Cluster-2: 2 -Cluster-3: 3 10 18 16 -Cluster-4: 4 9 19 -Cluster-5: 5 17 11 -Cluster-6: 6 13 -Cluster-7: 7 -Cluster-8: 12 -Cluster-9: 3 14 -Cluster-10: 15 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 42.29, 55.81, 112.740005, 55.61) -Current order [2, 1, 7, 10, 8, 4, 6, 9, 0, 5, 3] +Rand Num=7 +Chosen cluster = 6 +Nearest neighbour = 5 +5 17 - +weight = 115.60102365831875 +5 11 - +weight = 202.1756669521256 +17 11 - +weight = 95.71999741615204 +Pairwise average = 137.83222934219881 +ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 42.29, 55.81, 23.83, 55.61) +Current order [2, 1, 9, 7, 10, 8, 4, 6, 0, 5, 3] maxWL = 338.0, minWL = 2.66 WLD = 335.34 -Rand Num=9 -Chosen cluster = 5 -Nearest neighbour = 8 +Rand Num=6 +Chosen cluster = 4 +Nearest neighbour = 1 Pairwise average = 0.0 Average less than epsilonMax. Updating Clusters. Clusters: Cluster-0: 0 8 -Cluster-1: 1 +Cluster-1: 4 1 Cluster-2: 2 Cluster-3: 3 10 18 16 Cluster-4: 4 9 19 Cluster-5: 5 17 11 Cluster-6: 6 13 Cluster-7: 7 -Cluster-8: 5 12 -Cluster-9: 3 14 +Cluster-8: 12 +Cluster-9: 14 Cluster-10: 15 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 42.29, 89.44, 112.740005, 55.61) -Current order [2, 1, 7, 10, 4, 6, 8, 9, 0, 5, 3] +ArraySeq(115.13, 70.24, 2.66, 338.0, 66.130005, 136.32, 79.13, 42.29, 55.81, 23.83, 55.61) +Current order [2, 9, 7, 10, 8, 4, 1, 6, 0, 5, 3] maxWL = 338.0, minWL = 2.66 WLD = 335.34 -Rand Num=8 -Chosen cluster = 0 -Nearest neighbour = 7 -Pairwise average = 0.0 -Average less than epsilonMax. Updating Clusters. -Clusters: -Cluster-0: 0 8 -Cluster-1: 1 -Cluster-2: 2 -Cluster-3: 3 10 18 16 -Cluster-4: 4 9 19 -Cluster-5: 5 17 11 -Cluster-6: 6 13 -Cluster-7: 0 7 -Cluster-8: 5 12 -Cluster-9: 3 14 -Cluster-10: 15 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 125.17, 89.44, 112.740005, 55.61) -Current order [2, 1, 10, 4, 6, 8, 9, 0, 7, 5, 3] +Rand Num=7 +Chosen cluster = 6 +Nearest neighbour = 5 +5 17 - +weight = 115.60102365831875 +5 11 - +weight = 202.1756669521256 +17 11 - +weight = 95.71999741615204 +Pairwise average = 137.83222934219881 +ArraySeq(115.13, 70.24, 2.66, 338.0, 66.130005, 136.32, 79.13, 42.29, 55.81, 23.83, 55.61) +Current order [2, 9, 7, 10, 8, 4, 1, 6, 0, 5, 3] maxWL = 338.0, minWL = 2.66 WLD = 335.34 Rand Num=6 -Chosen cluster = 9 -Nearest neighbour = 3 -3 10 - -weight = 110.32563662919385 -3 18 - -weight = 197.93532036986213 -3 16 - -weight = 176.6244692117106 -10 18 - -weight = 109.32984942622367 -10 16 - -weight = 277.38062276155625 -18 16 - -weight = 330.7167343396919 -Pairwise average = 200.3854387897064 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 125.17, 89.44, 112.740005, 55.61) -Current order [2, 1, 10, 4, 6, 8, 9, 0, 7, 5, 3] -maxWL = 338.0, minWL = 2.66 -WLD = 335.34 -Rand Num=10 -Chosen cluster = 3 -Nearest neighbour = 9 -Pairwise average = 0.0 -Average less than epsilonMax. Updating Clusters. -Clusters: -Cluster-0: 0 8 -Cluster-1: 1 -Cluster-2: 2 -Cluster-3: 3 10 18 16 -Cluster-4: 4 9 19 -Cluster-5: 5 17 11 -Cluster-6: 6 13 -Cluster-7: 0 7 -Cluster-8: 5 12 -Cluster-9: 3 14 -Cluster-10: 15 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 125.17, 89.44, 112.740005, 55.61) -Current order [2, 1, 10, 4, 6, 8, 9, 0, 7, 5, 3] +Chosen cluster = 1 +Nearest neighbour = 4 +4 9 - +weight = 148.32786590021598 +4 19 - +weight = 152.85018337083108 +9 19 - +weight = 99.82544752586941 +Pairwise average = 133.66783226563882 +ArraySeq(115.13, 70.24, 2.66, 338.0, 66.130005, 136.32, 79.13, 42.29, 55.81, 23.83, 55.61) +Current order [2, 9, 7, 10, 8, 4, 1, 6, 0, 5, 3] maxWL = 338.0, minWL = 2.66 WLD = 335.34 -Rand Num=10 -Chosen cluster = 3 -Nearest neighbour = 9 -Pairwise average = 0.0 -Average less than epsilonMax. Updating Clusters. -Clusters: -Cluster-0: 0 8 -Cluster-1: 1 -Cluster-2: 2 -Cluster-3: 3 10 18 16 -Cluster-4: 4 9 19 -Cluster-5: 5 17 11 -Cluster-6: 6 13 -Cluster-7: 0 7 -Cluster-8: 5 12 -Cluster-9: 3 14 -Cluster-10: 15 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 125.17, 89.44, 112.740005, 55.61) -Current order [2, 1, 10, 4, 6, 8, 9, 0, 7, 5, 3] +Rand Num=7 +Chosen cluster = 6 +Nearest neighbour = 5 +5 17 - +weight = 115.60102365831875 +5 11 - +weight = 202.1756669521256 +17 11 - +weight = 95.71999741615204 +Pairwise average = 137.83222934219881 +ArraySeq(115.13, 70.24, 2.66, 338.0, 66.130005, 136.32, 79.13, 42.29, 55.81, 23.83, 55.61) +Current order [2, 9, 7, 10, 8, 4, 1, 6, 0, 5, 3] maxWL = 338.0, minWL = 2.66 WLD = 335.34 -Rand Num=9 -Chosen cluster = 5 -Nearest neighbour = 8 +Rand Num=8 +Chosen cluster = 0 +Nearest neighbour = 7 Pairwise average = 0.0 Average less than epsilonMax. Updating Clusters. Clusters: Cluster-0: 0 8 -Cluster-1: 1 +Cluster-1: 4 1 Cluster-2: 2 Cluster-3: 3 10 18 16 Cluster-4: 4 9 19 Cluster-5: 5 17 11 Cluster-6: 6 13 Cluster-7: 0 7 -Cluster-8: 5 12 -Cluster-9: 3 14 +Cluster-8: 12 +Cluster-9: 14 Cluster-10: 15 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 125.17, 89.44, 112.740005, 55.61) -Current order [2, 1, 10, 4, 6, 8, 9, 0, 7, 5, 3] +ArraySeq(115.13, 70.24, 2.66, 338.0, 66.130005, 136.32, 79.13, 125.17, 55.81, 23.83, 55.61) +Current order [2, 9, 10, 8, 4, 1, 6, 0, 7, 5, 3] maxWL = 338.0, minWL = 2.66 WLD = 335.34 -Rand Num=9 -Chosen cluster = 5 -Nearest neighbour = 8 +Rand Num=8 +Chosen cluster = 7 +Nearest neighbour = 2 Pairwise average = 0.0 Average less than epsilonMax. Updating Clusters. Clusters: Cluster-0: 0 8 -Cluster-1: 1 -Cluster-2: 2 +Cluster-1: 4 1 +Cluster-2: 7 2 Cluster-3: 3 10 18 16 Cluster-4: 4 9 19 Cluster-5: 5 17 11 Cluster-6: 6 13 Cluster-7: 0 7 -Cluster-8: 5 12 -Cluster-9: 3 14 +Cluster-8: 12 +Cluster-9: 14 Cluster-10: 15 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 125.17, 89.44, 112.740005, 55.61) -Current order [2, 1, 10, 4, 6, 8, 9, 0, 7, 5, 3] -maxWL = 338.0, minWL = 2.66 -WLD = 335.34 -Rand Num=9 -Chosen cluster = 5 -Nearest neighbour = 8 +ArraySeq(115.13, 70.24, 44.95, 338.0, 66.130005, 136.32, 79.13, 125.17, 55.81, 23.83, 55.61) +Current order [9, 2, 10, 8, 4, 1, 6, 0, 7, 5, 3] +maxWL = 338.0, minWL = 23.83 +WLD = 314.17 +Rand Num=7 +Chosen cluster = 0 +Nearest neighbour = 7 +0 7 - +weight = 335.29122627935715 +Pairwise average = 335.29122627935715 +ArraySeq(115.13, 70.24, 44.95, 338.0, 66.130005, 136.32, 79.13, 125.17, 55.81, 23.83, 55.61) +Current order [9, 2, 10, 8, 4, 1, 6, 0, 7, 5, 3] +maxWL = 338.0, minWL = 23.83 +WLD = 314.17 +Rand Num=10 +Chosen cluster = 3 +Nearest neighbour = 9 Pairwise average = 0.0 Average less than epsilonMax. Updating Clusters. Clusters: Cluster-0: 0 8 -Cluster-1: 1 -Cluster-2: 2 +Cluster-1: 4 1 +Cluster-2: 7 2 Cluster-3: 3 10 18 16 Cluster-4: 4 9 19 Cluster-5: 5 17 11 Cluster-6: 6 13 Cluster-7: 0 7 -Cluster-8: 5 12 +Cluster-8: 12 Cluster-9: 3 14 Cluster-10: 15 -ArraySeq(115.13, 21.65, 2.66, 338.0, 66.130005, 136.32, 79.13, 125.17, 89.44, 112.740005, 55.61) -Current order [2, 1, 10, 4, 6, 8, 9, 0, 7, 5, 3] -maxWL = 338.0, minWL = 2.66 -WLD = 335.34 -Rand Num=9 -Chosen cluster = 5 -Nearest neighbour = 8 -Pairwise average = 0.0 -Average less than epsilonMax. Updating Clusters. -Clusters: -Cluster-0: 0 8 -Cluster-1: 1 -Cluster-2: 2 -Cluster-3: 3 10 18 16 -Cluster-4: 4 9 19 -Cluster-5: 5 17 11 -Cluster-6: 6 13 -Cluster-7: 0 7 -Cluster-8: 5 12 -Cluster-9: 3 14 -Cluster-10: 15 \ No newline at end of file +ArraySeq(115.13, 70.24, 44.95, 338.0, 66.130005, 136.32, 79.13, 125.17, 55.81, 112.740005, 55.61) +Current order [2, 10, 8, 4, 1, 6, 9, 0, 7, 5, 3] +maxWL = 338.0, minWL = 44.95 +WLD = 293.05 +Rand Num=8 +Chosen cluster = 7 +Nearest neighbour = 2 +7 2 - +weight = 218.49036137013215 +Pairwise average = 218.49036137013215 \ No newline at end of file