日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

pso算法c++语言代码,一C++PSO(PSO)算法

發(fā)布時間:2023/12/9 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pso算法c++语言代码,一C++PSO(PSO)算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

收集和變化PSO算法,它可用于參考實施:

#include

#include

#include

#include

#include

#define rand_01 ((float)rand() / (float)RAND_MAX)

const int numofdims = 30;

const int numofparticles = 50;

using namespace std;

//typedef void (*FitnessFunc)(float X[numofparticles][numofdims], float fitnesses[numofparticles]);

void fitnessfunc(float X[numofparticles][numofdims], float fitnesses[numofparticles])

{

memset(fitnesses, 0, sizeof (float) * numofparticles);

for(int i = 0; i < numofparticles; i++)

{

for(int j = 0; j < numofdims; j++)

{

fitnesses[i] += X[i][j] * X[i][j]; //(pow(X[i][j], 2));

}

}

}

void rosenBroekFunc(float X[numofparticles][numofdims], float fitnesses[numofparticles])

{

float x1, x2, t1, t2;

memset(fitnesses, 0, sizeof (float) * numofparticles);

for(int i = 0; i < numofparticles; i++)

for(int j = 0; j < numofdims - 1; j++)

{

x1 = X[i][j];

x2 = X[i][j+1];

t1 = (x2 - x1 * x1);

t1 *= t1;

t1 *= 100;

t2 = x1 - 1;

t2 *= t2;

fitnesses[i] = t1 + t2;

}

}

float mean(float inputval[], int vallength)

{

float addvalue = 0;

for(int i = 0; i < vallength; i++)

{

addvalue += inputval[i];

}

return addvalue / vallength;

}

void PSO(int numofiterations, float c1, float c2,

float Xmin[numofdims], float Xmax[numofdims], float initialpop[numofparticles][numofdims],

float worsts[], float meanfits[], float bests[], float *gbestfit, float gbest[numofdims])

{

float V[numofparticles][numofdims] = {0};

float X[numofparticles][numofdims];

float Vmax[numofdims];

float Vmin[numofdims];

float pbests[numofparticles][numofdims];

float pbestfits[numofparticles];

float fitnesses[numofparticles];

float w;

float minfit;

int minfitidx;

memcpy(X, initialpop, sizeof(float) * numofparticles * numofdims);

fitnessfunc(X, fitnesses);

//rosenBroekFunc(X, fitnesses);

// fp(X, fitnesses);

minfit = *min_element(fitnesses, fitnesses + numofparticles);

minfitidx = min_element(fitnesses, fitnesses + numofparticles) - fitnesses;

*gbestfit = minfit;

memcpy(gbest, X[minfitidx], sizeof(float) * numofdims);

//設(shè)置速度極限

for(int i = 0; i < numofdims; i++)

{

Vmax[i] = 0.2 * (Xmax[i] - Xmin[i]);

Vmin[i] = -Vmax[i];

}

for(int t = 0; t < 1000; t++)

{

w = 0.9 - 0.7 * t / numofiterations;

//計算個體歷史極小值

for(int i = 0; i < numofparticles; i++)

{

if(fitnesses[i] < pbestfits[i])

{

pbestfits[i] = fitnesses[i]; //pbestfits初始化尚未賦值

memcpy(pbests[i], X[i], sizeof(float) * numofdims);

}

}

for(int i = 0; i < numofparticles; i++)

{

for(int j = 0; j < numofdims; j++)

{

V[i][j] = min(max((w * V[i][j] + rand_01 * c1 * (pbests[i][j] - X[i][j])

+ rand_01 * c2 * (gbest[j] - X[i][j])), Vmin[j]), Vmax[j]);

X[i][j] = min(max((X[i][j] + V[i][j]), Xmin[j]), Xmax[j]);

}

}

fitnessfunc(X, fitnesses);

//rosenBroekFunc(X, fitnesses);

minfit = *min_element(fitnesses, fitnesses + numofparticles);

minfitidx = min_element(fitnesses, fitnesses + numofparticles) - fitnesses;

if(minfit < *gbestfit)

{

*gbestfit = minfit;

//cout << "It=" << t << "->" << minfit << endl;

memcpy(gbest, X[minfitidx], sizeof(float) * numofdims);

}

worsts[t] = *max_element(fitnesses, fitnesses + numofparticles);

bests[t] = *gbestfit;

meanfits[t] = mean(fitnesses, numofparticles);

}

}

int main()

{

time_t t;

srand((unsigned) time(&t));

float xmin[30], xmax[30];

float initpop[50][30];

float worsts[1000], bests[1000];

float meanfits[1000];

float gbestfit;

float gbest[30];

for(int i = 0; i < 30; i++)

{

xmax[i] = 100;

xmin[i] = -100;

}

for(int i = 0; i < 50; i++)

for(int j = 0; j < 30; j++)

{

initpop[i][j] = rand() % (100 + 100 + 1) - 100;

}

PSO(1000, 2, 2, xmin, xmax, initpop, worsts, meanfits, bests, &gbestfit, gbest);

cout<

for(int i = 0; i < 30; i++)

cout << gbest[i] << ", ";

cout << endl;

return 0;

}

版權(quán)聲明:本文博主原創(chuàng)文章。博客,未經(jīng)同意不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的pso算法c++语言代码,一C++PSO(PSO)算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。