コード例 #1
0
        protected override void PerformMutate(IChromosome chromosome, float probability)
        {
            if (RandomizationProvider.Current.GetDouble() <= probability)
            {
                int            index = RandomizationProvider.Current.GetInt(0, chromosome.Length);
                ExpressionGene gene  = chromosome.GetGene(index).Value as ExpressionGene;

                if (gene.Type == GeneType.Operator)
                {
                    Operator op = (Operator)RandomizationProvider.Current.GetInt(0, Enum.GetNames(typeof(Operator)).Length);
                    chromosome.ReplaceGene(index, new Gene(new ExpressionGene(GeneType.Operator, op)));
                }
                else
                {
                    // Number or Variable
                    GeneType type = (GeneType)RandomizationProvider.Current.GetInt(1, 3);
                    if (type == GeneType.Number)
                    {
                        double num = RandomizationProvider.Current.GetDouble(-10, 10); // Get from outside
                        chromosome.ReplaceGene(index, new Gene(new ExpressionGene(type, null, num)));
                    }
                    else if (type == GeneType.Variable)
                    {
                        int variable = RandomizationProvider.Current.GetInt(0, variableCount);
                        chromosome.ReplaceGene(index, new Gene(new ExpressionGene(type, null, 0, variable)));
                    }
                }
            }
        }
コード例 #2
0
ファイル: PrefixHelper.cs プロジェクト: AlexJVig/FinalProject
        public static double EvaluatePrefix(Gene[] genes, params double[] variables)
        {
            ExpressionGene[] prefix = genes.Select(x => x.Value).Cast <ExpressionGene>().ToArray();

            Stack <double> stack = new Stack <double>();

            for (int i = prefix.Length - 1; i >= 0; i--)
            {
                ExpressionGene gene = prefix[i];

                if (gene.Type == GeneType.Number)
                {
                    stack.Push(gene.Number);
                }
                else if (gene.Type == GeneType.Variable)
                {
                    stack.Push(variables[gene.Variable]);
                }
                else
                {
                    double a = stack.Pop();
                    double b = stack.Pop();
                    stack.Push(Compute(a, b, gene.Operator));
                }
            }

            return(stack.Pop());
        }
コード例 #3
0
        //private Gene[] GetSubtree(Gene[] genes, int index)
        //{
        //    Gene gene = genes[index];

        //    Stack<Gene> operators = new Stack<Gene>();
        //    Stack<Gene> values = new Stack<Gene>();

        //    int valCount = 0;
        //    int i = index + 1;

        //    if ((gene.Value as ExpressionGene).Type == GeneType.Operator)
        //        operators.Push(gene);
        //    else
        //        values.Push(gene);

        //    while (operators.Count > 0 && i < genes.Length)
        //    {
        //        gene = genes[i];

        //        if ((gene.Value as ExpressionGene).Type != GeneType.Operator && valCount > 0)
        //        {
        //            double value = PrefixHelper.Compute(GetGeneValue(values.Pop()), GetGeneValue(gene), (operators.Pop().Value as ExpressionGene).Operator);
        //            values.Push(new Gene(new ExpressionGene(GeneType.Number,null ,value)));

        //            while (values.Count > 2 && operators.Count > 0)
        //            {
        //                value = PrefixHelper.Compute(GetGeneValue(values.Pop()), GetGeneValue(values.Pop()), (operators.Pop().Value as ExpressionGene).Operator);
        //                values.Push(new Gene(new ExpressionGene(GeneType.Number, null, value)));
        //            }

        //            if (operators.Count == 0 && values.Count == 1)
        //            {
        //                i++;
        //                break;
        //            }

        //            if (values.Count == 0)
        //                valCount = 0;
        //        }
        //        else if ((gene.Value as ExpressionGene).Type == GeneType.Operator)
        //        {
        //            operators.Push(gene);
        //            valCount = 0;
        //        }
        //        else
        //        {
        //            double value = GetGeneValue(gene);
        //            values.Push(new Gene(new ExpressionGene(GeneType.Number, null, value)));
        //            valCount++;
        //        }

        //        i++;
        //    }

        //    if (Math.Abs(index - i) % 2 == 0)
        //    {
        //        i--;
        //    }

        //    return genes.Slice(index, i);
        //}

        private Gene[] GetSubtree(Gene[] genes, int index)
        {
            int ops  = 0;
            int nums = 0;
            int i    = index;

            for (; i < genes.Length; i++)
            {
                ExpressionGene eg = genes[i].Value as ExpressionGene;
                if (eg.Type == GeneType.Operator)
                {
                    ops++;
                }
                else
                {
                    nums++;
                }

                if (nums == ops + 1)
                {
                    break;
                }
            }

            return(genes.Slice(index, i + 1));
        }
コード例 #4
0
        public double Evaluate(params double[] variables)
        {
            Stack <double> stack = new Stack <double>();

            for (int i = Length - 1; i >= 0; i--)
            {
                ExpressionGene gene = m_genes[i].Value as ExpressionGene;

                switch (gene.Type)
                {
                case GeneType.Number:
                    stack.Push(gene.Number);
                    break;

                case GeneType.Variable:
                    stack.Push(variables[gene.Variable]);
                    break;

                case GeneType.Operator:
                    double a = stack.Pop();
                    double b = stack.Pop();
                    stack.Push(PrefixHelper.Compute(a, b, gene.Operator));
                    break;

                default:
                    break;
                }
            }

            return(stack.Pop());
        }
コード例 #5
0
        public override Gene GenerateGene(int geneIndex)
        {
            ExpressionGene expression = new ExpressionGene();

            //int value = RandomizationProvider.Current.GetInt(minValue, maxValue);
            return(new Gene(expression));
        }
コード例 #6
0
        private double GetGeneValue(Gene gene)
        {
            ExpressionGene eg = gene.Value as ExpressionGene;

            switch (eg.Type)
            {
            case GeneType.Number:
                return(eg.Number);

            case GeneType.Variable:
                return(1);

            case GeneType.Operator:
            default:
                throw new ArgumentException();
            }
        }
コード例 #7
0
        public int CompareTo(ExpressionGene other)
        {
            if (other == null)
            {
                return(-1);
            }

            if (other.Type != Type)
            {
                return(-1);
            }

            switch (Type)
            {
            case GeneType.Operator:
                if (other.Operator != Operator)
                {
                    return(-1);
                }
                break;

            case GeneType.Number:
                if (other.Number != Number)
                {
                    return(-1);
                }
                break;

            case GeneType.Variable:
                if (other.Variable != Variable)
                {
                    return(-1);
                }
                break;
            }

            return(0);
        }