23 #ifndef O2SCL_DIFF_EVO_H 24 #define O2SCL_DIFF_EVO_H 33 #include <o2scl/rng_gsl.h> 34 #include <o2scl/mmin.h> 35 #include <o2scl/mm_funct.h> 37 #ifndef DOXYGEN_NO_O2NS 151 virtual int mmin(
size_t nvar, vec_t &x0,
double &fmin, func_t &func) {
154 size_t nconverged = 0;
163 fmins.resize(pop_size);
166 for (
size_t x = 0; x <
pop_size; ++x) {
168 agent_x.resize(nvar);
169 for (
size_t i = 0; i < nvar; ++i) {
173 fmin_x=func(nvar,agent_x);
177 for (
size_t i = 0; i<nvar; ++i)
180 }
else if (fmin_x<fmin) {
182 for (
size_t i = 0; i<nvar; ++i)
189 while (gen < this->
ntrial && nconverged <= nconv) {
195 for (
size_t x = 0; x <
pop_size; ++x) {
197 std::vector<int> others;
201 vec_t agent_x, agent_y;
202 agent_x.resize(nvar);
203 agent_y.resize(nvar);
204 for (
size_t i = 0; i < nvar; ++i) {
219 for (
size_t i = 0; i < nvar; ++i) {
224 if (i == r || ri < cr) {
235 fmin_y=func(nvar,agent_y);
236 if (fmin_y<
fmins[x]) {
237 for (
size_t i = 0; i < nvar; ++i) {
243 for (
size_t i = 0; i<nvar; ++i) {
256 std::string str=
"Exceeded maximum number of iterations ("+
276 int iter, vec_t &best_fit ) {
277 std::cout <<
"Generation " << iter << std::endl;
278 std::cout <<
"Fmin: " << fmin << std::endl;
279 std::cout <<
"Parameters: ";
280 for (
size_t i=0; i<nvar; ++i) {
281 std::cout << best_fit[i] <<
" ";
283 std::cout << std::endl;
284 std::cout <<
"Population: " << std::endl;
285 for (
size_t i=0; i<
pop_size; ++i ) {
286 std::cout << i <<
": ";
287 for (
size_t j = 0; j<nvar; ++j ) {
290 std::cout <<
"fmin: " <<
fmins[i] << std::endl;
294 #ifndef DOXYGEN_INTERNAL 319 if (rand_init_funct==0) {
320 O2SCL_ERR(
"No initialization function provided.",
324 population.resize(nvar*pop_size );
325 for (
size_t i = 0; i <
pop_size; ++i) {
327 (*rand_init_funct)( nvar, x0, y );
328 for (
size_t j = 0; j < nvar; ++j) {
329 population[ i*nvar+j ] = y[j];
344 std::vector<int> ids;
345 std::vector<int> agents;
347 for (
size_t i=0; i<pop_size-1; ++i){
351 ids.push_back( i+1 );
355 for (
size_t i=ids.size()-1; i>ids.size()-nr-1; --i) {
356 int j = round(gr.
random()*i);
357 std::swap( ids[i], ids[j] );
359 for (
size_t i=ids.size()-1; i>ids.size()-nr-1; --i) {
360 agents.push_back( ids[i] );
367 #ifndef DOXYGEN_INTERNAL 374 (
const diff_evo<func_t,vec_t,init_funct_t>&);
380 #ifndef DOXYGEN_NO_O2NS size_t nconv
The number of generations without a better fit before we assume that the algorithm has converged (def...
The main O<span style='position: relative; top: 0.3em; font-size: 0.8em'>2</span>scl O$_2$scl names...
#define O2SCL_CONV_RET(d, n, b)
Set a "convergence" error and return the error value.
Multidimensional minimization by the differential evolution method.
std::function< int(size_t, const boost::numeric::ublas::vector< double > &, boost::numeric::ublas::vector< double > &) > mm_funct11
Array of multi-dimensional functions typedef.
exceeded max number of iterations
virtual int initialize_population(size_t nvar, vec_t &x0)
Initialize a population of random agents.
double random()
Return a random number in .
int verbose
Output control.
size_t pop_size
Population size (default 0)
bool err_nonconv
If true, call the error handler if the routine does not "converge".
Multidimensional minimization [abstract base].
virtual void set_init_function(init_funct_t &function)
Set the function that is used to produce random init variables.
double cr
Crossover probability (default 0.8)
#define O2SCL_ERR(d, n)
Set an error with message d and code n.
ubvector fmins
Vector that keeps track of fmins values.
init_funct_t * rand_init_funct
Function that is used to produce random init variables.
virtual int mmin(size_t nvar, vec_t &x0, double &fmin, func_t &func)
Calculate the minimum fmin of func w.r.t the array x of size nvar.
double f
Differential weight (default 0.75)
virtual void print_iter(size_t nvar, double fmin, int iter, vec_t &best_fit)
Print out iteration information.
virtual std::vector< int > pick_unique_agents(int nr, size_t x)
Pick number of unique agent id's.
Random number generator (GSL)
problem with user-supplied function
vec_t population
Vector containing the population.
std::function< double(size_t, const boost::numeric::ublas::vector< double > &)> multi_funct11
Multi-dimensional function typedef.
rng_gsl gr
Random number generator.
std::string itos(int x)
Convert an integer to a string.
int ntrial
Maximum number of iterations.