Exemplo n.º 1
0
        /// <summary>
        ///     Display an expression as LISP (the programming language)
        /// </summary>
        /// <param name="node">The root node.</param>
        /// <returns>The LISP for the expression.</returns>
        public String DisplayExpressionLISP(TreeGenomeNode node)
        {
            var result = new StringBuilder();

            if (DetermineChildCount(node.Opcode) == 0)
            {
                result.Append(GetOpcodeText(node.Opcode));
            }
            else
            {
                result.Append("(");
                result.Append(GetOpcodeText(node.Opcode));
                foreach (TreeGenomeNode child in node.Children)
                {
                    result.Append(" ");
                    result.Append(DisplayExpressionLISP(child));
                }
                result.Append(")");
            }

            return(result.ToString());
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public override double Evaluate(TreeGenomeNode node, double[] varValues)
        {
            switch (node.Opcode)
            {
            case OPCODE_NEG:
                return(-(Evaluate(node.Children[0], varValues)));

            case OPCODE_ADD:
                return(Evaluate(node.Children[0], varValues) + Evaluate(node.Children[1], varValues));

            case OPCODE_SUB:
                return(Evaluate(node.Children[0], varValues) - Evaluate(node.Children[1], varValues));

            case OPCODE_DIV:
                return(Evaluate(node.Children[0], varValues) / Evaluate(node.Children[1], varValues));

            case OPCODE_MUL:
                return(Evaluate(node.Children[0], varValues) * Evaluate(node.Children[1], varValues));

            case OPCODE_POWER:
                return(Math.Pow(Evaluate(node.Children[0], varValues), Evaluate(node.Children[1], varValues)));

            case OPCODE_SQRT:
                return(Math.Sqrt(Evaluate(node.Children[0], varValues)));

            default:
                int index = node.Opcode - OPCODE_VAR_CONST;
                if (index >= (constValues.Length + varCount))
                {
                    throw new AIFHError("Invalid opcode: " + node.Opcode);
                }
                if (index < varCount)
                {
                    return(varValues[index]);
                }
                return(constValues[index - varCount]);
            }
        }