Pallas Solver  0.1
C++ Global Optimization Algorithms
differential_evolution.h
Go to the documentation of this file.
1 
14 // Pallas Solver
15 // Copyright 2015. All rights reserved.
16 //
17 // Redistribution and use in source and binary forms, with or without
18 // modification, are permitted provided that the following conditions are met:
19 //
20 // * Redistributions of source code must retain the above copyright notice,
21 // this list of conditions and the following disclaimer.
22 // * Redistributions in binary form must reproduce the above copyright notice,
23 // this list of conditions and the following disclaimer in the documentation
24 // and/or other materials provided with the distribution.
25 //
26 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 // POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Author: ryan.latture@gmail.com (Ryan Latture)
39 
40 #ifndef PALLAS_DIFFERENTIAL_EVOLUTION_H
41 #define PALLAS_DIFFERENTIAL_EVOLUTION_H
42 
43 #include <cfloat>
44 
45 #include "pallas/history_concept.h"
46 #include "pallas/types.h"
47 #include "pallas/internal/crossover_strategy.h"
48 #include "pallas/internal/mutation_strategy.h"
49 #include "pallas/internal/shuffler.h"
50 #include "pallas/internal/state.h"
51 
52 namespace pallas {
53 
132  public:
136  struct Options {
143  local_minimizer_options = GradientLocalMinimizer::Options();
144  mutation_strategy = BEST_1;
145  crossover_strategy = BINOMIAL;
146  population_initialization = LATIN_HYPERCUBE;
147  max_iterations = 1000;
148  population_size = 15;
149  tolerance = 0.01;
150  minimum_cost = -DBL_MAX;
151  dither << 0.5, 1.0;
152  crossover_probability = 0.7;
153  is_silent = true;
154  polish_output = false;
156  };
157 
162  GradientLocalMinimizer::Options local_minimizer_options;
163 
167  MutationStrategyType mutation_strategy;
168 
172  CrossoverStrategyType crossover_strategy;
173 
181  PopulationInitializationType population_initialization;
182 
186  unsigned int max_iterations;
187 
188 
192  unsigned int population_size;
193 
197  double minimum_cost;
198 
205  Vector2d dither;
206 
210  Vector upper_bounds;
211 
215  Vector lower_bounds;
216 
223 
229  double tolerance;
230 
235 
239  bool is_silent;
240 
248  };
249 
254  struct Summary{
258  Summary();
259 
260  std::string BriefReport() const;
262  std::string FullReport() const;
264  TerminationType termination_type;
269  MutationStrategyType mutation_strategy;
270 
274  CrossoverStrategyType crossover_strategy;
275 
276  std::string message;
278  double final_cost;
280  GradientLocalMinimizer::Summary local_minimization_summary;
282  unsigned int num_parameters;
284  unsigned int num_iterations;
294  HistorySeries history;
295  };
296 
300  struct HistoryOutput {
301 
310  HistoryOutput(unsigned int iteration_number,
311  const std::vector<Vector> &population,
312  double best_cost,
313  const Vector &best_solution)
314  : iteration_number(iteration_number),
315  population(population),
316  best_cost(best_cost),
317  best_solution(best_solution) {}
318  unsigned int iteration_number;
319  std::vector<Vector> population;
320  double best_cost;
322  };
323 
328 
340  void Solve(const DifferentialEvolution::Options& options,
341  const GradientProblem& problem,
342  double* parameters,
343  DifferentialEvolution::Summary* global_summary);
344  private:
348  void init_member_variables_(const DifferentialEvolution::Options& options);
349 
353  void init_mutation_strategy_(MutationStrategyType type);
354 
358  void init_crossover_strategy_(CrossoverStrategyType type,
359  double crossover_probability);
360 
364  void init_random_dither_(const Vector2d& dither);
365 
369  void init_population_(PopulationInitializationType type);
370 
380  void scale_parameters_(const Vector& trial_in, Vector& trial_out);
381 
391  void unscale_parameters_(const Vector& trial_in, Vector& trial_out);
392 
399  void ensure_constraint_(Vector& trial);
400 
407  void update_std_dev_();
408 
415  void mutate_(Vector& candidate, unsigned int idx);
416 
425  bool check_for_termination_(const DifferentialEvolution::Options& options,
426  std::string *message,
427  TerminationType * termination_type);
428 
432  void prepare_final_summary_(DifferentialEvolution::Summary *global_summary,
433  const GradientLocalMinimizer::Summary &local_summary);
434 
435  scoped_ptr<internal::MutationStrategy> mutation_strategy_;
436  scoped_ptr<internal::CrossoverStrategy> crossover_strategy_;
437  Vector upper_bounds_;
438  Vector lower_bounds_;
442  double scale_;
443  double fractional_std_dev_;
444  Vector scale_arg1_;
445  Vector scale_arg2_;
446  Vector population_energies_;
447  std::vector<Vector> population_;
448  Eigen::VectorXi population_idx_;
449  internal::State global_minimum_state_;
450  unsigned int num_parameters_;
451  unsigned int population_size_;
452  unsigned int num_iterations_;
453  };
454 
466  void Solve(const DifferentialEvolution::Options& options,
467  const GradientProblem& problem,
468  double* parameters,
470 
477  void dump(const DifferentialEvolution::HistoryOutput &h, HistoryWriter& writer);
478 
479 } // namespace pallas
480 
481 #endif // PALLAS_DIFFERENTIAL_EVOLUTION_H
Vector2d dither
Definition: differential_evolution.h:205
Vector lower_bounds
Definition: differential_evolution.h:215
double local_minimization_time_in_seconds
Definition: differential_evolution.h:288
unsigned int num_parameters
Definition: differential_evolution.h:282
PopulationInitializationType population_initialization
Definition: differential_evolution.h:181
double cost_evaluation_time_in_seconds
Definition: differential_evolution.h:290
std::string message
Definition: differential_evolution.h:276
Contains a summary of the optimization.
Definition: differential_evolution.h:254
bool was_polished
Definition: differential_evolution.h:292
Definition: basinhopping.h:51
unsigned int num_iterations
Definition: differential_evolution.h:284
unsigned int population_size
Definition: differential_evolution.h:192
Stores information about the state of the system for at a given iteration number. ...
Definition: differential_evolution.h:300
double minimum_cost
Definition: differential_evolution.h:197
bool polish_output
Definition: differential_evolution.h:234
unsigned int iteration_number
Definition: differential_evolution.h:318
CrossoverStrategyType crossover_strategy
Definition: differential_evolution.h:274
HistoryOutput(unsigned int iteration_number, const std::vector< Vector > &population, double best_cost, const Vector &best_solution)
Constructor.
Definition: differential_evolution.h:310
Minimizes an objective function by continuously evolving a population of candidate solutions...
Definition: differential_evolution.h:131
Definition: state.h:34
GradientLocalMinimizer::Options local_minimizer_options
Definition: differential_evolution.h:156
Definition: differential_evolution.h:136
GradientLocalMinimizer::Summary local_minimization_summary
Definition: differential_evolution.h:280
TerminationType termination_type
Definition: differential_evolution.h:264
HistorySeries history
Definition: differential_evolution.h:294
double tolerance
Definition: differential_evolution.h:229
Vector upper_bounds
Definition: differential_evolution.h:210
unsigned int history_save_frequency
Definition: differential_evolution.h:247
std::vector< Vector > population
Definition: differential_evolution.h:319
DifferentialEvolution()
Default constructor.
Definition: differential_evolution.h:327
double total_time_in_seconds
Definition: differential_evolution.h:286
double crossover_probability
Definition: differential_evolution.h:222
Vector best_solution
Definition: differential_evolution.h:321
MutationStrategyType mutation_strategy
Definition: differential_evolution.h:269
MutationStrategyType mutation_strategy
Definition: differential_evolution.h:167
Options()
Default constructor.
Definition: differential_evolution.h:142
double best_cost
Definition: differential_evolution.h:320
bool is_silent
Definition: differential_evolution.h:239
void Solve(const DifferentialEvolution::Options &options, const GradientProblem &problem, double *parameters, DifferentialEvolution::Summary *global_summary)
Minimizes the specified gradient problem.
Definition: differential_evolution.cc:122
void dump(const Basinhopping::HistoryOutput &h, HistoryWriter &writer)
Dumps the system state contained in the history output into the stream contained by the writer...
Definition: basinhopping.cc:323
unsigned int max_iterations
Definition: differential_evolution.h:186
double final_cost
Definition: differential_evolution.h:278
CrossoverStrategyType crossover_strategy
Definition: differential_evolution.h:172