Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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;
                }
            }
        }
Example #4
0
        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;
            }
        }