C++ Evolutionary Strategy (ES) Implementation: Optimizing a Function
#include <iostream>
#include <cmath>
#include <ctime>
#include <string>
using namespace std;
class Point
{
int *x;
static double xmax;
static double xmin;
static int size;
public:
Point()
{
x = new int[size];
init();
}
static void set(int isize, double max, double min)
{
size = isize;
xmax = max;
xmin = min;
}
void init()
{
for(int i = 0; i < size; i++)
{
if((double)rand() / RAND_MAX > 0.5)
x[i] = 1;
else
x[i] = 0;
}
}
double decode()
{
double va = 0.0;
for(int i = 0; i < size; i++)
va = va + x[i] * pow(2, size - i - 1);
va = xmin + (xmax - xmin) * va / (pow(2, size) - 1.0);
return va;
}
double getFitness()
{
double va = decode();
double y = va * sin(va * 10 * M_PI) + 2.0;
return y;
}
string toString()
{
string str = "";
str = str + to_string(this->decode()) + "," + to_string(this->getFitness());
return str;
}
~Point()
{
delete[] x;
}
};
double Point::xmax;
double Point::xmin;
int Point::size;
class ES
{
Point **obj; //父代
int size; //种群规模
public:
ES(int isize)
{
size = isize;
obj = new Point*[size];
init();
}
void init()
{
for(int i = 0; i < size; i++)
{
obj[i] = new Point();
}
}
void mut(Point *a)
{
int pos = 0;
pos = rand() % Point::size;
a->x[pos] = (a->x[pos] + 1) % 2;
}
void copy(Point *a, Point *b)
{
for(int i = 0; i < Point::size; i++)
{
b->x[i] = a->x[i];
}
}
int getBestPos()
{
int pos = 0;
Point *temp = new Point();
copy(obj[0], temp);
for(int i = 1; i < size; i++)
{
if(temp->getFitness() < obj[i]->getFitness())
{
copy(obj[i], temp);
pos = i;
}
}
delete temp;
return pos;
}
void doAll()
{
Point *temp = new Point();
for(int i = 0; i < size; i++)
{
copy(obj[i], temp);
mut(temp);
if(temp->getFitness() > obj[i]->getFitness())
copy(temp, obj[i]);
}
delete temp;
}
~ES()
{
for(int i = 0; i < size; i++)
{
delete obj[i];
}
delete[] obj;
}
};
int main()
{
srand((unsigned)time(NULL));
Point::set(22, 2.0, -1.0);
ES s(40);
int n = 0;
int bestPOS;
while(n < 500)
{
s.doAll();
n++;
}
bestPOS = s.getBestPos();
for(int i = 0; i < s.size; i++)
cout << s.obj[i]->toString() << endl;
cout << "Best: No." << bestPOS << endl;
cout << s.obj[bestPOS]->toString() << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/fY6b 著作权归作者所有。请勿转载和采集!