public static decimal CalcularCosto(MatrizAdy celdas, List <int> camino) { decimal costoActual = 0; for (var i = 0; i < camino.Count - 1; i++) { costoActual += celdas.Get(camino[i], camino[i + 1]).distancia; } costoActual += celdas.Get(camino[camino.Count - 1], camino[0]).distancia; // Sumo la cola con el comienzo return(costoActual); }
public static decimal CalcularCosto(MatrizAdy celdas, List <Camino> caminos) { decimal costoActual = 0; for (var i = 0; i < caminos.Count; i++) { for (var j = 0; j < caminos[i].Nodos.Count - 1; j++) { costoActual += celdas.Get(caminos[i].Nodos[j], caminos[i].Nodos[j + 1]).distancia; } costoActual += celdas.Get(caminos[i].Nodos[caminos[i].Nodos.Count - 1], caminos[i].Nodos[0]).distancia; // Sumo la cola con el comienzo } return(costoActual); }
void CerrarUltimoCamino(SolucionFVRP solucion) { // Sumar al costo la vuelta al último nodo var ultimo_camino = solucion.Caminos.Count - 1; solucion.Caminos[ultimo_camino].Costo += celdas.Get(solucion.Caminos[ultimo_camino].Nodos[0], solucion.Caminos[ultimo_camino].Nodos[solucion.Caminos[ultimo_camino].Nodos.Count - 1]).distancia; }
public GRASP(FVRP problema) { InstanciaProblema = problema; celdas = new MatrizAdy(InstanciaProblema.Distancias.Count); for (int i = 0; i < InstanciaProblema.Distancias.Count(); i++) { for (int j = 0; j < InstanciaProblema.Distancias.Count(); j++) { celdas.Get(i, j).distancia = InstanciaProblema.Distancias[i][j]; } } var totalVisitas = InstanciaProblema.Familias.Select(x => x.cantidad_visitas).Sum(); // La búsqueda local tiene que depender de la longitud del camino a evaluar y no del total de nodos busquedasLocales = new BusquedasLocales(totalVisitas, celdas, InstanciaProblema.Familias, InstanciaProblema.Demanda, InstanciaProblema.simetrico, totalVisitas * 2); // Inicializacion GRASP Reactivo. for (int i = 0; i < 10; i++) { probabilidad[i] = (decimal)1 / (decimal)10; } }