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); }
public static void PermutarTodo(MatrizAdy celdas, Camino solucion) { var permutaciones = GetPermutaciones(solucion.Nodos.Select(x => x).ToList(), 0, solucion.Nodos.Count - 1); var mejor_camino_local = solucion.Nodos; var mejor_costo_local = solucion.Costo; foreach (var modificacion in permutaciones) { var costoModificacion = CalcularCosto(celdas, modificacion); if (costoModificacion < mejor_costo_local) { mejor_camino_local = modificacion.Select(x => x).ToList(); mejor_costo_local = costoModificacion; } } }
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; } }