Exemplo n.º 1
0
  // 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;
  }