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() }); }
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() }); }