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))); } } } }
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()); }
//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)); }
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()); }
public override Gene GenerateGene(int geneIndex) { ExpressionGene expression = new ExpressionGene(); //int value = RandomizationProvider.Current.GetInt(minValue, maxValue); return(new Gene(expression)); }
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(); } }
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); }