Haversine distance and some changes

Change workload to float and coordinated to Double
This commit is contained in:
Rohan Sircar 2020-04-03 17:04:20 +05:30
parent 192cda5257
commit a6a366b62c
5 changed files with 71 additions and 21 deletions

View File

@ -50,24 +50,23 @@ object Main {
Array(0 , 42, 66, 31, 0) Array(0 , 42, 66, 31, 0)
); );
//format: on // format: on
// Prim's algorithm // Prim's algorithm
val selected: ArrayBuffer[Boolean] = val selected: ArrayBuffer[Boolean] =
ArrayBuffer.from(Array.ofDim[Boolean](5).toIndexedSeq) ArrayBuffer.fill(5)(false)
selected(0) = true selected(0) = true
var numberOfEdges = 0
for (_ <- numberOfEdges to 3) { for (_ <- 0 until 4) {
var min = 999999 var min = 999999
var x = 0 var x = 0
var y = 0 var y = 0
for (i <- 0 to 4) { for (i <- 0 until 5) {
if (selected(i) == true) { if (selected(i) == true) {
for (j <- 0 to 4) { for (j <- 0 until 5) {
if (selected(j) == false && edges(i)(j) != 0) { if (selected(j) == false && edges(i)(j) != 0) {
if (min > edges(i)(j)) { if (min > edges(i)(j)) {
min = edges(i)(j) min = edges(i)(j)
@ -100,15 +99,19 @@ object Main {
} }
} }
println(edges2) // prints adjacency matrix edges2.foreach { e =>
e.foreach { d =>
print(f"$d%.2f, ")
}
println()
}
// ArrayBuffer( // prints
// ArrayBuffer(0.0 , 1.4142135623730951, 1.0 , 5.0 , 2.0), // 0.00 , 159.64, 112.79, 563.55, 225.88
// ArrayBuffer(1.4142135623730951, 0.0 , 1.0 , 5.0 , 3.1622776601683795), // 159.64, 0.00 , 112.94, 564.16, 357.08
// ArrayBuffer(1.0 , 1.0 , 0.0 , 4.242640687119285, 2.23606797749979), // 112.79, 112.94, 0.00 , 478.40, 252.42
// ArrayBuffer(5.0 , 5.0 , 4.242640687119285, 0.0 , 4.123105625617661), // 563.55, 564.16, 478.40, 0.00 , 463.64
// ArrayBuffer(2.0 , 3.1622776601683795, 2.23606797749979 , 4.123105625617661, 0.0), // 225.88, 357.08, 252.42, 463.64, 0.00
// )
} }
} }

View File

@ -1,5 +1,7 @@
package model package model
case class Coord(latitude: Long, longitude: Long) { import util.Util
lazy val distance = math.sqrt(math.pow(latitude, 2) + math.pow(longitude, 2)) // distance is automatically calculated
case class Coord(latitude: Double, longitude: Double) {
lazy val distance = Util.getHaversineDistance(latitude, longitude) // distance is automatically calculated
} }

View File

@ -1,3 +1,3 @@
package model package model
case class Customer(location: Coord, workload: Int) case class Customer(location: Coord, workload: Float)

View File

@ -1,10 +1,8 @@
package model package model
import scala.math.{sqrt, pow} import scala.math.{sqrt, pow}
import util.Util
case class HHCEdge(v1: Customer, v2: Customer) { case class HHCEdge(v1: Customer, v2: Customer) {
val weight = sqrt( //automatically compute the distance between customers val weight = Util.getHaversineDistance(v1.location, v2.location)
pow(v1.location.latitude - v2.location.latitude, 2) +
pow(v1.location.longitude - v2.location.longitude, 2)
)
} }

View File

@ -0,0 +1,47 @@
package util
import model.Coord
import scala.math._
object Util {
private val r = 6471.00 // km
def toRad(num: Double): Double = {
val a = num * Pi / 180
a
}
def getHaversineDistance(c1: Coord, c2: Coord): Double = {
val x1 = c1.latitude - c2.latitude
val x2 = c1.longitude - c2.longitude
val dlat = toRad(x1)
val dlon = toRad(x2)
val a = pow(sin(dlat / 2), 2) +
cos(toRad(c1.latitude)) *
cos(toRad((c2.latitude))) *
pow(sin(dlon / 2), 2)
val c = 2 * atan2(sqrt(a), sqrt(1 - a))
val d = r * c
d
}
def getHaversineDistance(lat: Double, lon: Double): Double = {
val x1 = lat
val x2 = lon
val dlat = toRad(x1)
val dlon = toRad(x2)
val a = pow(sin(dlat / 2), 2) +
cos(toRad(x1)) *
cos(toRad((0))) *
pow(sin(dlon / 2), 2)
val c = 2 * atan2(sqrt(a), sqrt(1 - a))
val d = r * c
d
}
}