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); }
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); }