Newer
Older

Michal Kravcenko
committed
/**
* DESCRIPTION OF THE FILE
*
* @author Michal Kravčenko
* @date 2.7.18 -
*/
#ifndef INC_4NEURO_PARTICLESWARM_H
#define INC_4NEURO_PARTICLESWARM_H
kra568
committed
#include "../settings.h"
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <set>
#include <stdexcept>
#include <random>
#include <iterator>
#include <algorithm>

Michal Kravcenko
committed
#include "../src/Network/NeuralNetwork.h"
#include "../src/DataSet/DataSet.h"
#include "../src/ErrorFunction/ErrorFunctions.h"

Michal Kravcenko
committed
class Particle{
private:
std::vector<double> *coordinate = nullptr;
std::vector<double> *velocity = nullptr;

Michal Kravcenko
committed
std::vector<double> *optimal_coordinate = nullptr;

Michal Kravcenko
committed
double optimal_value;
double r1;
double r2;
double r3;
double current_val;

Michal Kravcenko
committed

Michal Kravcenko
committed
double *domain_bounds;

Michal Kravcenko
committed
void randomize_coordinates();
void randomize_velocity();
void randomize_parameters();

Michal Kravcenko
committed
public:
kra568
committed
LIB4NEURO_API void print_coordinate();

Michal Kravcenko
committed
/**
*
* @param f_dim
*/
kra568
committed
LIB4NEURO_API Particle(ErrorFunction* ef, double *domain_bounds);
LIB4NEURO_API ~Particle( );

Michal Kravcenko
committed
Martin Beseda
committed
/**
*
* @return
*/
kra568
committed
LIB4NEURO_API std::vector<double>* get_coordinate();
Martin Beseda
committed
/**
*
* @return
*/
kra568
committed
LIB4NEURO_API double get_current_value();

Michal Kravcenko
committed
/**
*
* @return
*/
kra568
committed
LIB4NEURO_API double get_optimal_value();

Michal Kravcenko
committed
/**
*
* @param ref_coordinate
*/
kra568
committed
LIB4NEURO_API void get_optimal_coordinate(std::vector<double> &ref_coordinate);

Michal Kravcenko
committed
/**
*
* @param w
* @param c1
* @param c2
* @param glob_min_coord
Martin Beseda
committed
* @param penalty_coef

Michal Kravcenko
committed
*/
kra568
committed
LIB4NEURO_API double change_coordinate(double w, double c1, double c2, std::vector<double> &glob_min_coord, std::vector<std::vector<double>> &global_min_vec, double penalty_coef=0.25);

Michal Kravcenko
committed
};
class ParticleSwarm {
private:
/**
*
*/
Particle** particle_swarm = nullptr;
/**
*
*/

Michal Kravcenko
committed

Michal Kravcenko
committed

Michal Kravcenko
committed

Michal Kravcenko
committed
double c1;
double c2;
double c3;

Michal Kravcenko
committed
double w;
double global_optimal_value;
double *domain_bounds;
Martin Beseda
committed
protected:

Michal Kravcenko
committed
/**
*
* @param coord
* @param val
Martin Beseda
committed
* @return
*/
kra568
committed
LIB4NEURO_API Particle* determine_optimal_coordinate_and_value(std::vector<double> &coord, double &val);
Martin Beseda
committed
/**
*
* @return
*/
kra568
committed
LIB4NEURO_API std::vector<double>* get_centroid_coordinates();
Martin Beseda
committed
/**
*
* @param a
* @param b
* @param n
* @return

Michal Kravcenko
committed
*/
kra568
committed
LIB4NEURO_API double get_euclidean_distance(std::vector<double>* a, std::vector<double>* b);

Michal Kravcenko
committed
public:
/**
*

Michal Kravcenko
committed
* @param f_dim
* @param domain_bounds
* @param c1
* @param c2
* @param w
* @param n_particles
* @param iter_max
*/

Michal Kravcenko
committed
//TODO make domain_bounds constant
kra568
committed
LIB4NEURO_API ParticleSwarm( ErrorFunction* ef, std::vector<double> *domain_bounds, double c1 = 1.711897, double c2 = 1.711897, double w = 0.711897, size_t n_particles = 50, size_t iter_max = 1000 );
kra568
committed
LIB4NEURO_API ~ParticleSwarm( );

Michal Kravcenko
committed
/**
*
Martin Beseda
committed
* @param gamma

Michal Kravcenko
committed
* @param epsilon
Martin Beseda
committed
* @param delta

Michal Kravcenko
committed
*/
kra568
committed
LIB4NEURO_API void optimize( double gamma, double epsilon, double delta=0.7 );

Michal Kravcenko
committed
kra568
committed
LIB4NEURO_API std::vector<double>* get_solution();

Michal Kravcenko
committed
};
#endif //INC_4NEURO_PARTICLESWARM_H