Pull to refresh

Comments 5

Метод роя частиц на C++
Particle Swarm Optimisation C++
#include <cstdlib>
#include <iostream>
#include <math.h>
#define randomer(a,b) (1.*rand())/(RAND_MAX+0.)*(b-a)+a

using namespace std;
/*
double fun(double *x)
{
    return x[0]*x[0] + x[1]*x[1]; //pow( pow(x,3) -125, 2 );
}
*/
double fun(double *x) // Растригина
{
    double ans = 10*2;
    for(int i=0; i<2; i++)
        ans += ( x[i]*x[i] - 10*cos(2*M_PI*x[i]) );
    
    return ans;
}

/*
double fun(double *x) // Швефеля
{
    double ans = 0;
    for(int i=0; i<2; i++)
        ans += -x[i]*sin( sqrt( fabs( x[i] ) ) );
    
    return ans;
}
 */

int main() {

    const int nparts = 50;
    const int ndims = 2, ages = 50; // количество эпох
    double lover[ndims] = {-10, -10};
    double upper[ndims] = {10, 10};
    double C1[ndims] = {1.9, 1.9};
    double C2[ndims] = {1.8, 1.8};
    double Ac[ndims] = {0.1, 0.1}; // определяет длину шага
    
    unsigned short i, j, k, minind = 0;
    double V[nparts][ndims];
    double X[nparts][ndims];
    double R1, R2, funmin = -9999, Fmin = 9999;
    double Fbest[nparts], funx[nparts];
    double xmem[nparts][ndims], xbest[ndims]; // лучшая координата
// частицы разбрасываются по исследуемой области
    for(i=0; i<nparts; i++)
        for(j=0; j<ndims; j++)
        {
            X[i][j] = randomer( lover[j], upper[j] );
            V[i][j] = 0;
            xmem[i][j] = 0;
        }

    for(i=0; i<nparts; i++)
    {
        Fbest[i] = Fmin;
        funx[i] = 0;
    }

    for(i=0; i<ndims; i++)
        xbest[i] = 0;
///////////////////////////////
    for(i=0; i<ages; i++)
    {
        for(j=0; j<nparts; j++)
        {
            funx[j] = fun( X[j] );
            if (funx[j] < Fbest[j])
            {
                Fbest[j] = funx[j];
                for(k=0; k<ndims; k++)
                    xmem[j][k] = X[j][k];
            }
        }

        funmin = funx[0];
        for(j=0; j<nparts; j++)
            if(funx[j] < funmin)
            {
                minind = j;
                funmin = funx[j];
            }

        if(funmin < Fmin)
        {
            Fmin = funmin;
            for(j=0; j<ndims; j++)
                xbest[j] = X[minind][j];
        }

        for(j=0; j<nparts; j++)
            for(k=0; k<ndims; k++)
            {
                R1 = randomer(0, 1);
                R2 = randomer(0, 1);
                V[j][k] = Ac[k]*V[j][k]+C1[k]*R1*( xmem[j][k] - X[j][k] ) +
                        C2[k]*R2*( xbest[k] - X[j][k]);
                X[j][k] += V[j][k];
            }

    cout << "xbest:" << endl;
    cout << " " << xbest[0] << " " << xbest[1] << endl;
    cout << "Fmin: " << Fmin << endl;
    cout << endl;
    }
    return 0;
}




Это matplotlib? А чтобы интерактивно варщать настоящие 3D графики есть вариант?

У Юлии есть много всяких графических пакетов например Makie использующий средства OpenGL — он самый интерактивный. Я использую Plots docs.juliaplots.org/latest/backends у него много окружений, матплотлиб в том числе. Интерактивны Plotly и PlotlyJS, причем последний сохраняет свои особенности при создании .html. Очень кстати понтово смотрелась моя презентация на курсовой, в которой графики можно было вращать и увеличивать мышкой
Спасибо за статью! Интересно было бы посмотреть на зависимость оценки вероятности попадания в окрестность глобального минимума от каких либо параметров алгоритма, например, от количества измерений на 1 итерации. Так как, когда речь идет о глобальной оптимизации оценка вероятности попадания в область глобального экстремума является одной из основных характеристик алгоритма. Также желательно определить критерий останова не по количеству эпох, а более «умный», например, дисперсия относительно лучшей точки, или что-то другое.
Если Вы занимаетесь глобальной оптимизацией рекомендую ознакомиться с методом конструирования тестовых функций. Потому как использование алгоритмов глобальной оптимизации на одноэкстремальных функциях расточительно, для этого есть локальные алгоритмы.
Sign up to leave a comment.

Articles