-
Notifications
You must be signed in to change notification settings - Fork 1
/
Solver.scala
62 lines (46 loc) · 1.47 KB
/
Solver.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import Params._
trait Solver {
val inst: Instance
val source = inst.source
def solve: List[List[Customer]] = {
//println("=============================================")
val source = inst.source
var disponibles = inst.customers - source
var nn = List[List[Customer]]()
while (!disponibles.isEmpty && nn.length < inst.vehiculos) {
// mando un camion
val visitas = camion(disponibles)
nn = nn ::: List(visitas)
// saco los visitados por ese camion
disponibles = disponibles -- visitas
}
//inst.globalEvaporate()
//println(nn.map(_.map(_.num)))
nn
}
private def camion(nodos: List[Customer]): List[Customer] = {
var hora:Double = 0
var vecinos = nodos
var actual = inst.source
var capacidad = inst.capacidad
var nn = actual :: Nil
var prox:Customer = proximo(actual, vecinos, hora, capacidad)
while (prox != null && !vecinos.isEmpty) {
nn = nn ::: List(prox)
// si llego antes que abra, a esperar
hora += prox.service + inst.tiempo(actual, prox, hora)
capacidad -= prox.demand
vecinos = vecinos - prox
actual = prox
prox = proximo(actual, vecinos, hora, capacidad)
}
// actualizar tau local
inst.localTau(nn)
nn
}
def insertable(nodo: Customer, vecino: Customer, hora: Double, capacidad: Int): Boolean = {
val d = inst.distancia(nodo, vecino)
hora + d < vecino.due && vecino.demand <= capacidad
}
def proximo(nodo: Customer, vecinos:List[Customer], hora: Double, capacidad: Int): Customer
}