#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;
}
C++ Evolutionary Strategy (ES) Implementation: Optimizing a Function

原文地址: https://www.cveoy.top/t/topic/fY6b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录