예제 #1
0
        public Solucion GRASPFijo()
        {
            SolucionFVRP    mejorSolucion          = null;
            TimeSpan        mejorTiempo            = new TimeSpan();
            Stopwatch       sw                     = new Stopwatch();
            TipoTerminacion terminacion            = TipoTerminacion.Completa;
            int             iteracionesSinMejora   = 0;
            int             solucionesMenorEpsilon = 0;

            sw.Start();

            for (var i = 0; i < cantidadCorridas && iteracionesSinMejora < cantidadDeIteracionesSinMejora; i++)
            {
                SolucionFVRP solucion = GolosoAleatorio(alfaFijo);
                RealizarBusquedaLocal(solucion);

                ValidarSolucion(solucion);

                if (mejorSolucion == null || mejorSolucion.Costo > solucion.Costo)
                {
                    sw.Stop();
                    decimal porcentajeDeMejora = (decimal)100;
                    if (mejorSolucion != null)
                    {
                        porcentajeDeMejora = 100 - ((solucion.Costo * 100) / mejorSolucion.Costo);
                    }
                    mejorSolucion = solucion;
                    mejorTiempo   = sw.Elapsed;
                    sw.Start();
                    iteracionesSinMejora = 0;
                    if (porcentajeDeMejora < epsilon)
                    {
                        if (solucionesMenorEpsilon > cantidadSolucionesMenorEpsilon)
                        {
                            terminacion = TipoTerminacion.Epsilon;
                            break;
                        }
                        solucionesMenorEpsilon++;
                    }
                }
                else
                {
                    iteracionesSinMejora++;
                }
            }

            if (iteracionesSinMejora >= cantidadDeIteracionesSinMejora)
            {
                terminacion = TipoTerminacion.IteracionesSinMejora;
            }

            return(new Solucion()
            {
                SolucionFVRP = mejorSolucion,
                MejorAlfa = alfaFijo,
                MejorTiempo = mejorTiempo,
                TipoTerminacion = terminacion.ToString()
            });
        }
예제 #2
0
        public Solucion GRASPReactivo()
        {
            SolucionFVRP    mejorSolucion           = null;
            TimeSpan        mejorTiempo             = new TimeSpan();
            Stopwatch       sw                      = new Stopwatch();
            TipoTerminacion terminacion             = TipoTerminacion.Completa;
            int             iteracionesSinMejora    = 0;
            int             iteracionesHastaReincio = 0;
            int             solucionesMenorEpsilon  = 0;
            int             iteracionesActualizar   = 0;

            sw.Start();

            decimal mejorAlfa = 0;

            for (var i = 0; i < cantidadCorridas && iteracionesSinMejora < cantidadDeIteracionesSinMejora; i++)
            {
                SolucionFVRP solucion = null;

                // Reactive GRASP
                decimal alfa = (decimal)0.0;
                if (!promedioSolCompleto)
                {
                    // Se hace una primera corrida con cada alfa para empezar a completar la tabla promedioSoluciones.
                    for (int j = 0; j < 10; j++)
                    {
                        alfa = (decimal)alfas[j];
                        SolucionFVRP solParcial = GolosoAleatorio(alfa);
                        RealizarBusquedaLocal(solParcial);
                        solucionesPorAlfa[j] = new List <decimal>();
                        solucionesPorAlfa[j].Add(solParcial.Costo);
                        if (solucion == null || solucion.Costo > solParcial.Costo)
                        {
                            solucion  = solParcial;
                            mejorAlfa = alfa;
                        }
                    }
                }
                else
                {
                    // A partir de que se cargan para todo alfa, arrancamos el algoritmo posta.
                    if (iteracionesActualizar >= cantidadIteracionesActualizarPromedio && mejorSolucion != null)
                    {
                        decimal   sum         = 0;
                        decimal[] normalizado = new decimal[10];
                        for (int j = 0; j < 10; j++)
                        {
                            decimal promedioSolucionAlfa = solucionesPorAlfa[j].Sum() / solucionesPorAlfa[j].Count;
                            normalizado[j] = (decimal)Math.Pow((double)(mejorSolucion.Costo / promedioSolucionAlfa), delta);
                            sum           += normalizado[j];
                        }
                        for (int j = 0; j < 10; j++)
                        {
                            probabilidad[j] = normalizado[j] / sum;
                        }
                        iteracionesActualizar = 0;
                    }
                    else
                    {
                        iteracionesActualizar++;
                    }

                    var random = ((decimal)(new Random().Next(0, 100)) / 100);
                    var acum   = (decimal)0.0;
                    var actual = -1;
                    while (acum < random)
                    {
                        actual++;
                        acum += probabilidad[actual];
                    }

                    if (actual == -1)
                    {
                        actual = 0;
                    }

                    alfa = (decimal)alfas[actual];

                    SolucionFVRP solParcial = GolosoAleatorio(alfa);
                    RealizarBusquedaLocal(solParcial);
                    if (solucion == null || solucion.Costo > solParcial.Costo)
                    {
                        solucion  = solParcial;
                        mejorAlfa = alfa;
                    }

                    solucionesPorAlfa[actual].Add(solParcial.Costo);
                }

                // En la primer iteracion se completa... es horrible como me esta quedando, lo se.
                if (!promedioSolCompleto)
                {
                    promedioSolCompleto = true;
                }

                ValidarSolucion(solucion);

                if (mejorSolucion == null || mejorSolucion.Costo > solucion.Costo)
                {
                    sw.Stop();
                    decimal porcentajeDeMejora = (decimal)100;
                    if (mejorSolucion != null)
                    {
                        porcentajeDeMejora = 100 - ((solucion.Costo * 100) / mejorSolucion.Costo);
                    }
                    mejorSolucion = solucion;
                    mejorTiempo   = sw.Elapsed;
                    sw.Start();
                    iteracionesSinMejora = 0;
                    if (porcentajeDeMejora < epsilon)
                    {
                        if (solucionesMenorEpsilon > cantidadSolucionesMenorEpsilon)
                        {
                            terminacion = TipoTerminacion.Epsilon;
                            break;
                        }
                        solucionesMenorEpsilon++;
                    }
                }
                else
                {
                    iteracionesSinMejora++;
                }

                iteracionesHastaReincio++;
            }

            if (iteracionesSinMejora >= cantidadDeIteracionesSinMejora)
            {
                terminacion = TipoTerminacion.IteracionesSinMejora;
            }

            return(new Solucion()
            {
                SolucionFVRP = mejorSolucion,
                MejorAlfa = mejorAlfa,
                MejorTiempo = mejorTiempo,
                TipoTerminacion = terminacion.ToString()
            });
        }