public void AddNeighborhood(SingleTrajectoryContinuousSolver local_search, SingleTrajectoryContinuousSolver.TerminationEvaluationMethod termination_condition)
 {
     local_search.Stepped += (solution, iteration) =>
     {
         OnStepped(solution, iteration);
     };
     local_search.SolutionUpdated += (solution, iteration) =>
     {
         OnSolutionUpdated(solution, iteration);
     };
     mNeighborhoods.Add(local_search, termination_condition);
 }
        public override ContinuousSolution Minimize(double[] x_0, CostEvaluationMethod evaluate, GradientEvaluationMethod calc_grad, TerminationEvaluationMethod should_terminate, object constraints = null)
        {
            double?improvement = null;
            int    iteration   = 0;

            if (mNeighborhoods.Count == 0)
            {
                throw new ArgumentNullException();
            }

            mNeighborhoods.LowerBounds = mLowerBounds;
            mNeighborhoods.UpperBounds = mUpperBounds;

            double[] x  = (double[])x_0.Clone();
            double   fx = evaluate(x, mLowerBounds, mUpperBounds, constraints);

            ContinuousSolution best_solution = new ContinuousSolution(x, fx);

            int neighborhood_count = mNeighborhoods.Count;

            ContinuousSolution current_best = null;

            while (!should_terminate(improvement, iteration))
            {
                for (int l = 0; l < neighborhood_count; ++l)
                {
                    SingleTrajectoryContinuousSolver local_search = mNeighborhoods.GetLocalSearchAt(l);
                    SingleTrajectoryContinuousSolver.TerminationEvaluationMethod termination_condition = mNeighborhoods.GetTerminationConditionAt(l);

                    current_best = local_search.Minimize(x, evaluate, calc_grad, termination_condition, constraints);

                    x  = current_best.Values;
                    fx = current_best.Cost;

                    if (best_solution.TryUpdateSolution(x, fx, out improvement))
                    {
                        OnSolutionUpdated(best_solution, iteration);
                    }

                    OnStepped(best_solution, iteration);
                    iteration++;
                }
            }

            return(best_solution);
        }
Beispiel #3
0
 public void Add(SingleTrajectoryContinuousSolver local_search, SingleTrajectoryContinuousSolver.TerminationEvaluationMethod termination_condition)
 {
     mLocalSearches.Add(local_search);
     mTerminationConditions.Add(termination_condition);
 }