Комментарии 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;
}
0
Это matplotlib? А чтобы интерактивно варщать настоящие 3D графики есть вариант?
0
У Юлии есть много всяких графических пакетов например Makie использующий средства OpenGL — он самый интерактивный. Я использую Plots docs.juliaplots.org/latest/backends у него много окружений, матплотлиб в том числе. Интерактивны Plotly и PlotlyJS, причем последний сохраняет свои особенности при создании .html. Очень кстати понтово смотрелась моя презентация на курсовой, в которой графики можно было вращать и увеличивать мышкой
0
Спасибо за статью! Интересно было бы посмотреть на зависимость оценки вероятности попадания в окрестность глобального минимума от каких либо параметров алгоритма, например, от количества измерений на 1 итерации. Так как, когда речь идет о глобальной оптимизации оценка вероятности попадания в область глобального экстремума является одной из основных характеристик алгоритма. Также желательно определить критерий останова не по количеству эпох, а более «умный», например, дисперсия относительно лучшей точки, или что-то другое.
Если Вы занимаетесь глобальной оптимизацией рекомендую ознакомиться с методом конструирования тестовых функций. Потому как использование алгоритмов глобальной оптимизации на одноэкстремальных функциях расточительно, для этого есть локальные алгоритмы.
Если Вы занимаетесь глобальной оптимизацией рекомендую ознакомиться с методом конструирования тестовых функций. Потому как использование алгоритмов глобальной оптимизации на одноэкстремальных функциях расточительно, для этого есть локальные алгоритмы.
+1
Я набрал себе ru.wikipedia.org/wiki/Тестовые_функции_для_оптимизации с википедии, все сюда не выкладывал, чтоб не нагружать страницу, а за ссылку спасибо, будет здорово заделать чего с оврагами, пологостями и изломами
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Julia и рой частиц