Beispiel #1
0
        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);
        }
Beispiel #3
0
        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));
        }
Beispiel #5
0
 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();
            //        }
            //    }
            //}
        }