// No recoge contenedores que esten en < de minBasura al momento de visitarlos, usar 0 para // recoger siempre. // min basura esta entre 0 y 1 public static ZeroPermutation ejecutarGreedy(Datos datos, double minBasura) { if (datos.puntosOrdenados == null) { datos.puntosOrdenados = datos.cargarPuntosOrdenados(datos.distancias); } boolean[] visitados = new boolean[datos.puntos.length]; for (int i = 0; i < visitados.length; i++) visitados[i] = false; visitados[0] = true; // origen visitado para no tomarlo en cuenta. int cantPorCamion = datos.datosBasicos.capacidadCamiones + datos.datosBasicos.capacidadCamiones / 2; int[] resultado = new int[datos.datosBasicos.cantidadCamiones * cantPorCamion]; int libres = visitados.length - 1; int index = 0; for (int i = 0; i < datos.datosBasicos.cantidadCamiones; i++) { int actual = 0; // indice del punto actual double recogido = 0; int cant = 0; // cantidad de contenedores que ha visitado un camion int tiempo = 0; while (cant < cantPorCamion && libres > 0) { int elegido = -1; double sumaBasura = -1; int sumaTiempo = -1; boolean encontrado = false; // de los mas cercanos, voy al mas cercano que no supere la capacidad del camion. for (int j = 1; j < datos.puntosOrdenados.length; j++) { elegido = datos.puntosOrdenados[actual][j]; if (!visitados[elegido]) { sumaTiempo = tiempo + datos.tiempos[actual][elegido]; sumaBasura = (datos.llenados[elegido].v + datos.velocidades[elegido].v * sumaTiempo) / 100; if (sumaBasura > minBasura && recogido + sumaBasura <= datos.datosBasicos.capacidadCamiones) { encontrado = true; break; } } } if (encontrado) { visitados[elegido] = true; tiempo = sumaTiempo + datos.datosBasicos.tiempoRecoleccionContenedor; recogido += sumaBasura; libres--; resultado[index] = elegido; actual = elegido; cant++; index++; } else { break; // si llegue aca quiere decir que se lleno el camion. } } if (cant < cantPorCamion) { while (cant < cantPorCamion) { resultado[index] = 0; index++; cant++; } } } // Construyo resultado de permutacion para poder utilizar con AE ZeroPermutation res = new ZeroPermutation(); res.vector_ = resultado; res.size_ = resultado.length; return res; }