public static List <int> GetCandidates(UniqueModelCase model, float targetFunEvaluation) { //Lista de los casos candidatos a remover (un índice del caso). List <int> candidates = new List <int>(); var percentajes = model.GetPercentajes(); var obtained3 = percentajes.Item1; var obtained4 = percentajes.Item2; // Recorro la lista total de casos de prueba. foreach (var caseToRemove in model.Results.Keys) { // Verifio si mejora la evaluación de la función objetivo. percentajes = model.GetPercentajeIfRemove(caseToRemove); float ifRemove3 = percentajes.Item1; float ifRemove4 = percentajes.Item2; //Console.WriteLine($"Diference if remove case {k} in 3: {ifRemove3}"); //Console.WriteLine($"Diference if remove case {k} in 4: {ifRemove4}"); //var newObtained3 = obtained3 + ifRemove3; //var newObtained4 = obtained4 + ifRemove4; float newTargetFunEvaluation = Sett.TargetFunc(ifRemove3, ifRemove4); //Console.WriteLine($"New total diference = {newTargetFunEvaluation}"); //Console.WriteLine(); // Si la mejora entonces es candidato if (newTargetFunEvaluation < targetFunEvaluation) { candidates.Add(caseToRemove); } } return(candidates); }
private static IEnumerable <UniqueModelCase> SplitModel(UniqueModelCase model) { int n = 5; UniqueModelCase[] modelArray = new UniqueModelCase[n]; for (int i = 0; i < n; i++) { modelArray[i] = new UniqueModelCase(SolutionComparer.EqPol); } foreach (var k in model.Results.Keys) { modelArray[k % n].AddCase(k, model.Results[k]); } return(modelArray); }
public override UniqueModelCase Run(UniqueModelCase model) { var result = new UniqueModelCase(model.Results, model._eq); Helper.CheckCases(result.Results.Values); // Obtengo la lista de canditados a eliminar de los casos de prueba. // Un caso de prueba es candidato si mejora la evaluacíón de la función objetivo. var percentajes = result.GetPercentajes(); float funcEval = Sett.TargetFunc(percentajes.Item1, percentajes.Item2); List <int> candidates = GetCandidates(result, funcEval); // Mientras pueda mejorar la evalución de la función (> 0) y tenga candidatos a eliminar. int n = 500; while (candidates.Count > 0 && n-- > 0) { // Selecciono un candidato random a eliminar. var caseToDelete = candidates[Sett.Rnd.Next(candidates.Count)]; result.RemoveCase(caseToDelete); // Elimino el caso y actualizo la evaluación de la función objetivo. percentajes = result.GetPercentajes(); funcEval = Sett.TargetFunc(percentajes.Item1, percentajes.Item2); // Obtengo la nueva lista de candidatos. candidates = GetCandidates(result, funcEval); //Console.WriteLine($"Count candidates: {candidates.Count}"); } percentajes = result.GetPercentajes(); funcEval = Sett.TargetFunc(percentajes.Item1, percentajes.Item2); Console.WriteLine($"Final diference: {funcEval}"); Helper.CheckCases(result.Results.Values); return(result); }
public override UniqueModelCase Run(UniqueModelCase model) { var modelSplited = SplitModel(model); // Solo para poderle aplicar lambda. var solutionsList = new List <UniqueModelCase>(modelSplited); var percentajes = solutionsList.Select(p => p.GetPercentajes()); var evals = percentajes.Select(p => Sett.TargetFunc(p)).ToArray(); string fo = Directory.GetCurrentDirectory() + @"\" + "fo " + Sett.i + ".txt"; string calls = Directory.GetCurrentDirectory() + @"\" + "calls " + Sett.i + ".txt"; using (StreamWriter file = new StreamWriter(fo, true)) { file.Write(evals.Min() + ", "); } using (StreamWriter file = new StreamWriter(calls, true)) { file.Write(Sett.calls - Sett.callsAux + ", "); Sett.callsAux = Sett.calls; } int n = 500; while (n-- > 0) { percentajes = solutionsList.Select(k => k.GetPercentajes()); evals = percentajes.Select(k => Sett.TargetFunc(k)).ToArray(); // Selección de los individuos. var couple1Indexs = MergeAndFind.Find2Bests(evals); var couple2Indexs = MergeAndFind.Find2Random(evals); var c1x = solutionsList[couple1Indexs.Item1]; var c1y = solutionsList[couple1Indexs.Item2]; var c2x = solutionsList[couple2Indexs.Item1]; var c2y = solutionsList[couple2Indexs.Item2]; // Aplicación de operadores. var resultc1A = MergeAndFind.Merge1(c1x.Results, c1y.Results); var resultc1B = MergeAndFind.Merge2(c1x.Results, c1y.Results); var resultc1C = MergeAndFind.Merge3(c1x.Results, c1y.Results); var resultc1D = MergeAndFind.Merge4(c1x.Results, c1y.Results, (int)((float)c1x.Results.Count * 80 / 100), (int)((float)c2y.Results.Count * 20 / 100)); var resultc2A = MergeAndFind.Merge1(c2x.Results, c2y.Results); var resultc2B = MergeAndFind.Merge2(c2x.Results, c2y.Results); var resultc2C = MergeAndFind.Merge3(c2x.Results, c2y.Results); var resultc2D = MergeAndFind.Merge4(c2x.Results, c2y.Results, (int)((float)c2x.Results.Count * 80 / 100), (int)((float)c2y.Results.Count * 20 / 100)); var currentComparer = model._eq; var c1 = new UniqueModelCase(resultc1A, currentComparer); var c2 = new UniqueModelCase(resultc1B, currentComparer); var c3 = new UniqueModelCase(resultc1C, currentComparer); var c4 = new UniqueModelCase(resultc1D, currentComparer); var c5 = new UniqueModelCase(resultc2A, currentComparer); var c6 = new UniqueModelCase(resultc2B, currentComparer); var c7 = new UniqueModelCase(resultc2C, currentComparer); var c8 = new UniqueModelCase(resultc2D, currentComparer); var newSolutions = new UniqueModelCase[] { c1, c2, c3, c4, c5, c6, c7, c8 }; solutionsList.AddRange(newSolutions); var newPercentajes = solutionsList.Select(k => k.GetPercentajes()); var newEvals = newPercentajes.Select(k => Sett.TargetFunc(k)).ToList(); for (int i = 0; i < 4; i++) { int index = Filter(newEvals); solutionsList.RemoveAt(index); newEvals.RemoveAt(index); } using (StreamWriter file = new StreamWriter(fo, true)) { file.Write(evals.Min() + ", "); } using (StreamWriter file = new StreamWriter(calls, true)) { file.Write(Sett.calls - Sett.callsAux + ", "); Sett.callsAux = Sett.calls; } } var min = evals.Min(); Console.WriteLine($"Menor evaluación {min}"); return(model = solutionsList.First(p => Sett.TargetFunc(p.GetPercentajes()) == min)); }
public abstract UniqueModelCase Run(UniqueModelCase model);
static void Main(string[] args) { //Helper.WriteFormatedCases(); //// Generador de casos de prueba aleatorios. //var generator = new CaseGenerator(); ////Método que me genera n casos de prueba. ////if (generate) ////{ ////var cases = generator.GenerateCases(Sett.CasesToGenerate); ////SaveData(cases, "Cases.txt"); /// while (Sett.i++ < 100) { Sett.calls = 0; Sett.callsAux = 0; var cases = ReadPolData(); //var cases = ReadAnaData(); ////} List <object> sols3 = new List <object>(); List <object> sols4 = new List <object>(); List <object> sols5 = new List <object>(); List <object>[] sols = new List <object>[] { sols3, sols4, sols5 }; RunPolCases(cases, sols, Sett.MethodPolNames); //RunAnaCases(cases, sols, Sett.MethodAnaNames); //Console.WriteLine("---"); //UniqueModelCase model = new UniqueModelCase(SolutionComparer.EqAna); UniqueModelCase model = new UniqueModelCase(SolutionComparer.EqPol); // Separo en casos de acierto y en casos de error para cada implementación. model.SplitCases(sols3, sols5, 1); model.SplitCases(sols4, sols5, 2); // Calculo el % de acierto. var obtained = model.GetPercentajes(); var obtained3 = obtained.Item1; var obtained4 = obtained.Item2; Console.WriteLine($"Model 3: {obtained3}%"); Console.WriteLine($"Model 4: {obtained4}%"); //Console.WriteLine($"Model 5: 100%"); // Evaluación de la función objetivo a minimizar. float targetFunEvaluation = Sett.TargetFunc(obtained3, obtained4); Console.WriteLine($"Total diference: {targetFunEvaluation}"); Console.WriteLine(model.Results.Count); //Sett.calls = 0; //var grasp = new GRASP(); //model = grasp.Run(model); var ga = new GeneticAlgorithm(); model = ga.Run(model); } //obtained = model.GetPercentajes(); //obtained3 = obtained.Item1; //obtained4 = obtained.Item2; //Console.WriteLine($"Model 3: {obtained3}%"); //Console.WriteLine($"Model 4: {obtained4}%"); //targetFunEvaluation = Sett.TargetFunc(obtained3, obtained4); //Console.WriteLine(model.Results.Count); //Helper.CheckCases(model.Results.Values); //var finalCases = Helper.GetFinalCases(cases, model.Results.Keys); //Helper.WriteFinalCases(finalCases); //Console.WriteLine(string.Join("\n", finalCases)); //int i = 0; //string p = Directory.GetCurrentDirectory() + @"\" + "3.txt"; //using (StreamWriter file = new StreamWriter(p, false)) //{ // foreach (var k in model.Results.Keys) // { // var s = ""; // if (k < 10) // s = "00"; // else if (k < 100) // s = "0"; // file.Write(s + k + " "); // i++; // if(i == 20) // { // i = 0; // file.WriteLine(); // } // } //} }