Exemple #1
0
        public override bool Mutate(Individual individual)
        {
            SyntaxTree tree         = (SyntaxTree)individual.SyntaxTree.DeepClone();
            TreeNode   exchangeNode = tree.GetRandomNode();
            Type       nodeType     = exchangeNode.Type;

            TreeNode newNode = SyntaxTreeProvider.GetSyntaxTree(MaxMutationTreeDepth, nodeType);

            if (newNode != null)
            {
                bool replaced = tree.ReplaceTreeNode(exchangeNode, newNode);
                if (replaced && tree.Height <= MaxTreeDepth)
                {
                    individual.SyntaxTree = tree;
                    return(true);
                }
            }
            return(false);
        }
Exemple #2
0
        public override bool Mutate(Individual individual)
        {
            SyntaxTree tree         = (SyntaxTree)individual.SyntaxTree.DeepClone();
            TreeNode   exchangeNode = tree.GetRandomNode();
            Type       nodeType     = exchangeNode.Type;

            TreeNode newNode = SyntaxTreeProvider.GetSyntaxTree(MaxMutationTreeDepth, nodeType);

            if (newNode != null)
            {
                bool replaced = tree.ReplaceTreeNode(exchangeNode, (TreeNode)newNode.DeepClone());
                if (replaced && tree.Height <= MaxTreeDepth)
                {
                    individual.SyntaxTree = tree;
                    if (individual.FitnessEvaluated)                            // only meaningful if fitness of individual is already evaluated
                    // update the node's record
                    {
                        var    recordSubTreePool = SyntaxTreeProvider as RecordBasedSubTreePool;
                        double improvement       = 0;
                        if (FitnessEvaluator != null)
                        {
                            var fitness = FitnessEvaluator.Evaluate(individual, Problem).Fitness;

                            improvement = fitness - individual.Fitness;
                            Statistics.Instance.AddRecordReplaceAttempt(improvement);
                        }
                        if (recordSubTreePool != null)
                        {
                            recordSubTreePool.UpdateRecord(newNode, improvement);
                        }
                    }
                    return(true);
                }
            }
            return(false);
        }