The collected and modified PSO algorithms can be used for reference implementations:
#include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <ctime > #define RAND_01 ((float) rand ()/(float) rand_max) const int numofdims = 30;const int numofparticles = 50;using Namespac e 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;memse T (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 initial Pop[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); Set speed limit for (int i = 0; i < numofdims; i++) {Vmax[i] = 0.2 * (Xmax[i]-xmin[i]); Vmin[i] =-vmax[i]; } for (int t = 0; t < t++) {w = 0.9-0.7 * t/numofiterations;//calculates individual history minimum for (int i = 0; i < Numofparticles; i++) {if (Fitnesses[i] < pbestfits[i]) {pbestfits[i] = fitnesses[i]; Pbestfits initialization has not been assigned a value 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 <; i++) {xmax[i] = 100; Xmin[i] =-100; } for (int i = 0; i <, i++) for (int j = 0; J <; J + +) {Initpop[i][j] = rand ()% (10 0 + 100 + 1)-100; } PSO (2, 2, xmin, Xmax, Initpop, worsts, Meanfits, bests, &gbestfit, gbest); cout<< "Fitness:" << gbestfit << Endl; for (int i = 0; i < i++) cout << gbest[i] << ","; cout << Endl; return 0;}