goloso.cpp 1.77 KB
Newer Older
1 2 3 4
#include "goloso.h"


PathList Goloso::operator()(const Instance& instance) const { 
5
	PathList rutas;
6
	size_t n = instance.size();
7 8 9
	vector<Node> nodos = instance.getNodes();
	MatrizDist dist = instance.getDistances();
	vector<bool> visitados(n, false); 
10
	size_t cant_nodos = 1;
11
	int costo = 0;
12 13 14
	unsigned int carga;
	size_t indice_min, i;
    float min;
15
	unsigned int C = static_cast<unsigned int> (instance.getCapacity());
16 17


18 19 20 21 22 23 24 25 26 27 28 29 30 31
    while(cant_nodos < n){
        vector<size_t> camino;
        carga = 0;
        indice_min = 0;
        min = 0;
        while(((carga + nodos[indice_min].demand) <= C) && (cant_nodos < n)){
            carga += nodos[indice_min].demand;
            camino.push_back(indice_min);
            visitados[indice_min] = true;
            costo += min;

            if(indice_min != 0) cant_nodos++;   //Para no sumar el cero cada vez
            min = INT_MAX;
            i = indice_min;
32

33 34
            for(size_t j=0; j<n; j++){
                if(nodos[j].demand > C && !visitados[j]){		//si era infactible lo pongo como vistado para no volverlo a visitar otra vez.
35 36 37 38 39 40 41 42
                    visitados[j] = true;
                    cant_nodos++;
                }
                if(i != j && !visitados[j] && dist[i][j] < min){
                    min = dist[i][j];
                    indice_min = j;
                }
            }
43 44 45 46 47 48 49 50 51 52 53
        }

        costo += dist[camino.back()][0];
        camino.push_back(0);
        if(camino.size() > 2){		//Evito agregar caminos de tipo (0,0) cuando en el medio hubo infactibles por ejemplo.
            rutas.first.push_back(camino);
        }
    }

    rutas.second = costo;
    return rutas;
54 55 56 57 58 59 60 61 62 63 64


}

//printear: 	cantidad de camiones rutas.size() 
//		caminos separados por una linea    for para cada camino de rutas
//		costo_total : costo