public static Result GreedMutate(Result item) { Result result = new Result() { SequenceIndexes = item.SequenceIndexes.ToArray() }; if (StaticRandom.Rand() % 2 == 0) { return(MutationLogic.Mutate(item)); } var nucleotidIndexes = EvaluationLogic.GetWeakConnectedNucleotidIndexes(item).OrderByDescending(n => n.Item2).ToArray(); if (nucleotidIndexes.Length >= 10) { int firstIndex = StaticRandom.Rand(10); int secondIndex = StaticRandom.Rand(Global.Nucleotids.Count); int tmp = result.SequenceIndexes[firstIndex]; result.SequenceIndexes[firstIndex] = result.SequenceIndexes[secondIndex]; result.SequenceIndexes[secondIndex] = tmp; } else { return(MutationLogic.Mutate(item)); } return(result); }
public static void Execute(ref Result[] input, int tournamentSize, int singleTournamentSize = 4) { var slicedInput = input.Take(tournamentSize).ToArray(); Result[] randomOrder = slicedInput.OrderBy(s => StaticRandom.Rand()).ToArray(); Result[] results = new Result[slicedInput.Length / singleTournamentSize]; for (int i = 0; i < slicedInput.Length - 1; i += singleTournamentSize) { var bestResult = randomOrder[i]; for (int j = 1; j < singleTournamentSize; j++) { if (randomOrder[i + j].EvaluationPoints > bestResult.EvaluationPoints || (randomOrder[i + j].EvaluationPoints == bestResult.EvaluationPoints && randomOrder[i + j].TotalLength < bestResult.TotalLength) || (randomOrder[i + j].EvaluationPoints == bestResult.EvaluationPoints && EvaluationLogic.GetWeakConnectedNucleotidIndexes(bestResult).Count > EvaluationLogic.GetWeakConnectedNucleotidIndexes(randomOrder[i + j]).Count)) { bestResult = randomOrder[i + j]; } } results[i / singleTournamentSize] = bestResult; } for (int i = 0; i < slicedInput.Length / singleTournamentSize; i++) { input[i] = results[i]; } }