コード例 #1
0
        protected override void OnIndividualEvaluationFinished(Individual individual, FitnessResult fitness, object[] results)
        {
            MDLFitnessResult fitnessResult = fitness as MDLFitnessResult;

            if (SubTreePool != null)
            {
                int usedAttributes      = fitnessResult.UsedAttributes;
                int classificationError = fitnessResult.ClassificationError;
                if (usedAttributes > 0)
                {
                    double utilityMeasure = CalculateUtilityMeasure(usedAttributes, classificationError);
                    foreach (var id in fitnessResult.Dataset.Features)
                    {
                        // utility measure is maximized between 0 and 1 -> fitness is minimized
                        SubTreePool.Add(individual.SyntaxTree.FindNodeById(id), 1 - utilityMeasure);
                    }
                    SubTreePool.TrimToMaxSize();
                }
            }
        }
コード例 #2
0
        public FitnessResult CalculateFitness(Individual individual, TestSuite testSuite, object[] results)
        {
            double    fitness = StandardFitnessCalculator.CalculateFitness(individual, testSuite, results).Fitness;          // standard fitness f0
            MLDataset dataset = MLDataset.FromExecutionTraces(individual, Singleton <ExecutionRecord> .Instance.Traces);

            LogDatasetFeatures(dataset);

            var fitnessResult = new MDLFitnessResult(fitness, dataset);

            if (dataset.Features.Count() > 0)
            {
                // Variant 1 (results of all nodes):
                //var input = dataset.ToRawInputDataset();

                // Variant 2 (results and operation types of first n and last n operations in chronological order):
                //var input = dataset.ToRawFirstNLastNInputDataset(5, 5);

                // Veriant 3 (results only consider values of bool and int expressions and operations)
                int startContinuousFeatures;
                var input = MLDataset.ConvertTracesToTypedSteps(individual, Singleton <ExecutionRecord> .Instance.Traces,
                                                                Steps, true, out startContinuousFeatures);

                if (input.Length > 0 && input[0].Length > 0)
                {
                    var expected = GetExpectedOutputDataset(testSuite);
                    LogDataset(input, expected);

                    var decisionTree = CreateDecisionTree(input, expected, startContinuousFeatures);
                    if (decisionTree != null)
                    {
                        int    error      = GetClassificationError(decisionTree, input, expected);
                        int    treeSize   = GetTreeSize(decisionTree);
                        double mdlFitness = CalculateMDLFitness(error, treeSize, results.Length);
                        double stdFitness = fitness;
                        fitness *= mdlFitness;

                        var rules = decisionTree.ToRules();
                        LogResult(fitness, error, treeSize, mdlFitness, rules);
                        int usedAttributes = GetUsedAttributes(decisionTree).Count;

                        fitnessResult.Fitness             = fitness;
                        fitnessResult.ClassificationError = error;
                        fitnessResult.TreeSize            = treeSize;
                        fitnessResult.StandardFitness     = stdFitness;
                        fitnessResult.UsedAttributes      = usedAttributes;

                        // log MDL result details
                        if (fitness == 0)
                        {
                            Logger.WriteLine(1, "Std fitness: " + stdFitness);

                            var predicted = decisionTree.Decide(input);
                            var loss      = Math.Round(new ZeroOneLoss(expected).Loss(predicted) * expected.Length);
                            var classificationErrorFactor = (((double)error + 1) / (results.Length + 1));
                            Logger.WriteLine(1, "Program error: " + error + "; loss: " + loss + "; factor: " + classificationErrorFactor);

                            var treeSizeFactor = Math.Log(treeSize + 1, 2);
                            Logger.WriteLine(1, "Tree size: " + treeSize + "; factor: " + treeSizeFactor);

                            Logger.WriteLine(1, "MDL fitness: " + mdlFitness);
                        }
                    }
                }
            }
            else if (fitness == 0)
            {
                Logger.WriteLine(1, "Standard fitness: 0");
            }
            return(fitnessResult);
        }