private void MutateSingle(TermExpression expression, int factorSimpleMutation) { var lengthTokensTable = tokensTable.Count(); var rnd = new Random(); var tablePosition = rnd.Next(lengthTokensTable - 1); var lengthEpression = expression.ExpressionTokens.Length; var position = rnd.Next(lengthEpression - 1); var typeMutation = rnd.Next(factorSimpleMutation); if (typeMutation != 0) { //mutate element expression.ExpressionTokens[position] = tokensTable.ElementAt(tablePosition); } else { //add element to end var token = tokensTable.ElementAt(tablePosition); var expr = expression.ExpressionTokens.ToList(); expr.Add(token); if (!token.IsTerminal) { var terminals = tokensTable.Where(x => x.IsTerminal); var countTerminals = terminals.Count(); for (var i = 0; i < token.Arity; i++) { expr.Add(terminals.ElementAt(rnd.Next(countTerminals - 1))); } } } }
private ICollection <TermExpression> Recombine(TermExpression item, TermExpression secondItem) { var firstLength = item.ExpressionTokens.Length; var seconfLength = secondItem.ExpressionTokens.Length; var tokenLength = (firstLength > seconfLength) ? seconfLength : firstLength; var takePositions = new Random().Next(tokenLength - 1); var firstParticleOfFirst = item.ExpressionTokens.Take(takePositions).AsEnumerable(); var SecondParticleOfFirst = item.ExpressionTokens.Skip(takePositions).AsEnumerable(); var firstParticleOfSecond = secondItem.ExpressionTokens.Take(takePositions).AsEnumerable(); var SecondParticleOfSecond = secondItem.ExpressionTokens.Skip(takePositions).AsEnumerable(); var result = new List <TermExpression> { new TermExpression { ExpressionTokens = Enumerable.Concat(firstParticleOfFirst, SecondParticleOfSecond).ToArray(), }, new TermExpression { ExpressionTokens = Enumerable.Concat(firstParticleOfSecond, SecondParticleOfFirst).ToArray(), } }; return(result); }