예제 #1
0
        private void Mutate(MathExpressionTree expression)
        {
            MathExpressionNode randomNode = expression.GetRandomNode();

            randomNode.SubstiteValue(randomNode.IsLeaf ?
                                     stohasticGenerator.GetRandomOperand()
                                           : stohasticGenerator.GetRandomOperator(randomNode.LeftChild, randomNode.RightChild));
        }
예제 #2
0
        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);
        }