public Tuple <SolutionParameters, Searchspace, double> CreateRandom() { for (int i = 0; i < 32; i++) { var guess = SolutionParameters.FromFactory(_random.Next(10, 28), _random.Next(10, 28), Factory); try { var solution = GenerateSolution(guess); var cost = Grader.CostForSolution(solution); return(new Tuple <SolutionParameters, Searchspace, double>(guess, solution, cost)); } catch (InvalidOperationException) { } catch (IndexOutOfRangeException) { } } return(null); }
public double Step() { var mutations = _pool.Select((parent) => { try { var child = parent.Item1.Modify(Temperature); var solution = GenerateSolution(child); var cost = Grader.CostForSolution(solution); return(new Tuple <SolutionParameters, Searchspace, double>(child, solution, cost)); } catch (InvalidOperationException) { } catch (IndexOutOfRangeException) { } return(new Tuple <SolutionParameters, Searchspace, double>(null, new Searchspace(), -1)); }).Where((g) => g.Item1 != null); var additions = Enumerable.Range(0, 2).Select((i) => CreateRandom()); var newPool = _pool.Concat(mutations).Concat(additions).OrderBy((g) => g.Item3); _pool = newPool.Take(10).ToList(); var best = _pool.OrderBy((g) => g.Item3).First(); BestParameters = best.Item1; BestState = best.Item2; LowestCost = best.Item3; var iterBest = additions.Concat(mutations).OrderBy((g) => g.Item3).First(); Temperature *= 0.5; if (Temperature < 0.02) { Temperature = 1; } return(iterBest.Item3); }