Beispiel #1
0
        public string DecodeExpression(GPNode treeExpression, int langOption)
        {
            //Prepare chromoseme for evaluation
            var tokens = treeExpression.ToList();
            int countT = tokens.Count;

            //Stack fr evaluation
            Stack <string> expression = new Stack <string>();

            for (int i = countT - 1; i >= 0; i--)
            {
                if (tokens[i] >= 1000 && tokens[i] < 2000)
                {
                    string varaiable = terminals[tokens[i] - 1000].Name;
                    expression.Push(varaiable);
                }
                else
                {
                    //prepare function arguments for evaluation
                    int    count    = functions[tokens[i] - 2000].Aritry;
                    string function = "";

                    if (langOption == 1)
                    {
                        function = functions[tokens[i] - 2000].MathematicaDefinition;
                    }
                    else if (langOption == 2)
                    {
                        function = functions[tokens[i] - 2000].ExcelDefinition;
                    }
                    else
                    {
                        function = functions[tokens[i] - 2000].Definition;
                    }

                    for (int j = 1; j <= count; j++)
                    {
                        string oldStr = "x" + (j).ToString();
                        string newStr = expression.Pop();
                        function = function.Replace(oldStr, newStr);
                    }

                    //Izracunavanje rezultata
                    expression.Push("(" + function + ")");
                }
            }
            // return the only value from stack
            Debug.Assert(expression.Count == 1);
            // return arguments.Pop();
            return(expression.Pop());
        }
Beispiel #2
0
        /// <summary>
        /// Converts GPNode in to expression
        /// </summary>
        /// <param name="treeExpression">chromosome in S-expression</param>
        /// <param name="rowIndex"> current row to evaluate choromosme</param>
        /// <param name="btrainingData">whether is training or testing data</param>
        /// <returns></returns>
        public double Evaluate(GPNode treeExpression, int rowIndex, bool btrainingData = true)
        {
            //get the array from tree nodes
            treeExpression.ToList(_tokens.Value);
            var tokens = _tokens.Value;
            //count all tokens
            int countT = tokens.Count();

            //get terminal for specific position
            double[] terminalRow = Globals.GetTerminalRow(rowIndex, btrainingData);

            //Stack for evaluation
            Stack <double> arguments = _arguments.Value;//new Stack<double>();

            //the maximum aritry is 4
            // double[] val = new double[5];

            for (int i = countT - 1; i >= 0; i--)
            {
                //skip invalid tokens
                if (tokens[i] < 1000)
                {
                    continue;
                }

                // Put terminal in to Stack for leter function evaluation
                if (tokens[i] >= 1000 && tokens[i] < 2000)
                {
                    arguments.Push(terminalRow[tokens[i] - 1000]);
                    //reset node
                    tokens[i] = 0;
                }
                else
                {
                    //create real index value
                    int ind = tokens[i] - 2000;

                    //make current token invalid
                    //or reset token position
                    tokens[i] = 0;

                    //prepare function arguments for evaluation
                    int count = functions[ind].Aritry;

                    //Extract variables
                    for (int j = 0; j < count; j++)
                    {
                        var num = arguments.Pop();
                        if (double.IsNaN(num) || double.IsInfinity(num))
                        {
                            ResetTokensList(tokens, arguments, i);
                            return(double.NaN);
                        }
                        _args.Value[j] = num;
                    }

                    double result = Evaluate(functions[ind], _args.Value);
                    _args.Value[0] = 0;
                    _args.Value[1] = 0;
                    _args.Value[2] = 0;
                    _args.Value[3] = 0;
                    _args.Value[4] = 0;

                    //check if number is valid
                    if (double.IsNaN(result) || double.IsInfinity(result))
                    {
                        //reset the rest of elements in the list
                        ResetTokensList(tokens, arguments, i);
                        return(double.NaN);
                    }

                    //inser subresult in to stack
                    arguments.Push(result);
                }
            }
            // return the only value from stack
            Debug.Assert(arguments.Count == 1);
            return(arguments.Pop());
        }