private void Mutate(MathExpressionTree expression) { MathExpressionNode randomNode = expression.GetRandomNode(); randomNode.SubstiteValue(randomNode.IsLeaf ? stohasticGenerator.GetRandomOperand() : stohasticGenerator.GetRandomOperator(randomNode.LeftChild, randomNode.RightChild)); }
public MathExpressionTree GenerateIndividual() { MathExpressionTree validExpression; do { int operandsCount = stohasticGenerator.OperandsCount(); List <MathExpressionNode> operatorsAndOperands = Enumerable.Range(0, 2 * operandsCount - 1) .Select(x => x % 2 == 0 ? stohasticGenerator.GetRandomOperand() : stohasticGenerator.GetRandomOperator()) .ToList(); MathExpressionNode root = operatorsAndOperands.Where(x => !x.IsLeaf) .OrderBy(x => Guid.NewGuid()) .First(); MathExpressionNode getGenome(List <MathExpressionNode> elements, MathExpressionNode parent, MathExpressionNode rootNode = null) { if (elements.Count == 0) { return(null); } MathExpressionNode currentNode = (rootNode ?? elements.FirstOrDefault(x => !x.IsLeaf)) ?? elements.First(); currentNode.Parent = parent; if (!currentNode.IsLeaf) { int currentNodeIndex = elements.IndexOf(currentNode); currentNode.LeftChild = getGenome(elements.Take(currentNodeIndex).ToList(), currentNode); currentNode.RightChild = getGenome(elements.Skip(currentNodeIndex + 1).ToList(), currentNode); } return(currentNode); } validExpression = new MathExpressionTree(getGenome(operatorsAndOperands, null, root)); } while (!validExpression.IsValidExpression()); return(validExpression); }