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);
        }
Beispiel #2
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);
        }
        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();
            //        }
            //    }
            //}
        }