コード例 #1
0
 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);
 }
コード例 #2
0
        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);
        }