完整程序下载http://download.csdn.net/source/2428504 #include <iostream> #include <fstream> #include <math.h> #include <time.h> using namespace std; // Search domain: ?5.12 ≤ xi ≤ 5.12, i = 1, 2, . . . , n. // Number of local minima: no local minimum except the global one. // The global minima: x* = (0, …, 0), f(x*) = 0 double sphere(double* x,int n) { double result=0; for(int i=0;i<n;i++){ result+=x[i]*x[i]; } return result; } //fitness function pointer typedef double (*HFitFunc)(double*,int ); int main() { fstream fout("result.txt",ios::out); //parameters double c1=1.496;//learning factor 1 double c2=1.496;//learning factor 2 double w=0.7298;//inertia weight int iterationMax=500;//number of biggest iteration int D=10;//number of unknown number int sizeSwarm=40;//size of swarm double eps=pow(double(10),double(-6)); double** x=new double*[sizeSwarm];//position of individuals double** v=new double*[sizeSwarm];//speed of individuals double* priority=new double[sizeSwarm];//fitness of individuals double** x_p=new double*[sizeSwarm];//best partial individuals double* x_g=new double[D];//global best position double priority_g=2<<10;//best global for (int i=0;i<sizeSwarm;i++){ x[i]=new double[D]; v[i]=new double[D]; x_p[i]=new double[D]; } srand((unsigned )time(NULL)); //fitness function HFitFunc pFitFunct=sphere; //initialize speed and position [0,1] for (int i=0;i<sizeSwarm;i++){ priority[i]=2<<10; for (int j=0;j<D;j++){ x[i][j]=rand()/RAND_MAX*2-1; v[i][j]=rand()/RAND_MAX*2-1; x_p[i][j]=x[i][j]; } } //main loop while(iterationMax-->0){ //calculate fitness double best_p=2<<10; double* prior=new double[sizeSwarm]; int index=0; for (int i=0;i<sizeSwarm;i++){ prior[i]=(*pFitFunct)(x[i],D); //update partial priority if (prior[i]<priority[i]){ memcpy(x_p[i],x[i],sizeof(double)*D); priority[i]=prior[i]; } if (best_p>prior[i]){ best_p=prior[i]; index=i; } } //update global best if (priority_g>prior[index]){ memcpy(x_g,x_p[index],sizeof(double)*D); priority_g=prior[index]; } //display result of this generation fout<<"global best value :"<<priority_g<<endl <<"partial best value :"<<priority[index]<<endl; //update for (int i=0;i<sizeSwarm;i++){ for (int j=0;j<D;j++){ v[i][j]=w*v[i][j]+c1*rand()/RAND_MAX*(x_p[i][j]-x[i][j])+c2*rand()/RAND_MAX*(x_g[j]-x[i][j]); x[i][j]+=v[i][j]; } } //free memory delete[] prior; } //free memory fout.close(); for (int i=0;i<sizeSwarm;i++){ delete[] x[i]; delete[] v[i]; delete[] x_p[i]; } delete[] x; delete[] v; delete[] x_p; delete[] priority; delete[] x_g; return 0; }