📄 pso.c
字号:
/* This program optimizes benchmark functions using particle swarm algorithm Asynchronous version Yuhui Shi, May 15, 1998 @ See OLD_README file for more details /----------------------------------------------------------------------------------- Dissipative PSO V1.1 Xiao-Feng Xie, Dec 15, 2001 (last modified) URL: http://www.adaptivebox.net/research/ @ See README.txt file for more details Difference: add two chaos parameters: Cv, Cl @ Ref: X. F. Xie, W. J. Zhang, Z. L. Yang. A dissipative particle swarm optimization. Congress on Evolutionary Computation (CEC), Hawaii, USA, 2002: 1456-1461 /-----------------------------------------------------------------------------------*///normal file#include "headfile.h"#include "global.h"#include "mem_loc.h"#include "myfun.h"#include "methods.h"float calcFunc(int fun_type, FMATRIX outxx, int a, int DIMENSION);float getRandom();/* ******************** main() ******************** */int main (int argc, char *argv[]){ /*------Algorithm setting parameters: Total evaluation time = m*(T+1)------------*/ int NUMBER_OF_AGENTS = 20; //m: the number of particles int MAXITER = 2000; //T: the maximum iteration cycles float weight_up=0.9, weight_low=0.4; //inertia weight, for linear decreasing PSO (LPSO) float c1=2, c2=2; //learing factors float Cv = 0.0, Cl = 0.001; //chaos factors: by Xiao-Feng Xie float MAXV = 0.5; //For controllong the maximum velocity as MAXV*(dimension length) /*------Output setting parameters------------*/ int run_no; //number of runs int OutputStep = 1; //For output interval char resfilePrefix[120]; //The prefix of output file /*------problem setting parameters------------*/ int fun_type = 3; // 0:Schaffer f6 1:sphere 2:Rosenbrock 3:generalized Rastrigrin 4:generalized Griewank int DIMENSION = 30; // the dimension of problem float MAXX = 600; // problem range: [-MAXX, MAXX] for all dimensions /*------temp values ------------*/ FILE *fp, *frun; char runfile[120], resfile[120]; //run file and log file char temp[120]; int a,b; int i,j; float minval=0.0; float realWeight; int iter; int gbest; int firsttime; int finish; time_t tt; struct tm *newtime; int curSec = 0; /* ********************************************************* Open problem file ********************************************************* */ if (argc<2) { printf("Need to specify runfile. For Example: dpso *.run"); exit(1); } strcpy(runfile,argv[1]); if ((frun=fopen(runfile,"r"))==NULL) { printf("Cant read file"); exit(1); } /*Get parameters from file */ fscanf(frun, "%d %d %f %f %f %f %f %d %d %s %d %d %f", &NUMBER_OF_AGENTS, &MAXITER, &weight_up, &weight_low, &Cv, &Cl, &MAXV, &run_no, &OutputStep, resfilePrefix, &fun_type, &DIMENSION, &MAXX); fclose(frun); /*allocate memory*/ FVectorAllocate(&trail, DIMENSION); FVectorAllocate(&pbest, NUMBER_OF_AGENTS); FMatrixAllocate(&maxx, DIMENSION, 2); FMatrixAllocate(&xx, DIMENSION,NUMBER_OF_AGENTS); FMatrixAllocate(&vx, DIMENSION,NUMBER_OF_AGENTS); FMatrixAllocate(&tx, DIMENSION,NUMBER_OF_AGENTS); FMatrixAllocate(&pbestx, DIMENSION,NUMBER_OF_AGENTS); /****************************initial parameter range********************************/ for (a=0;a<DIMENSION;a++) { maxx[a][0]=-MAXX; /* range of xx[] */ maxx[a][1]= MAXX; /* range of xx[] */ } time(&tt); printf("begin time: %s\n",ctime(&tt)); /*** .log file for output best agent index vs iteration ***/ sprintf(temp, "(N%d, V%.2f, W%.2f-%.2f, G%d, Cv%.4f, Cl%.4f, D%d)", NUMBER_OF_AGENTS, MAXV, weight_up, weight_low, MAXITER, Cv, Cl, DIMENSION); strcpy(resfile,resfilePrefix); strcat(resfile,temp); strcat(resfile,".log"); printf("Out: %s\n", resfile); if ((fp=fopen(resfile,"w"))==NULL) { printf("Cant write file"); exit(1); } /* ----- loop for runs -----*/ for (i=0;i<run_no;i++) { firsttime=1; //first iteration of this run iter=0; gbest=0; //initialy assume the first particle as the gbest time(&tt); newtime = localtime( &tt ); /* Convert to local time. */ curSec = newtime->tm_sec; for (j=0; j< curSec; j++) { rand(); } /* ********************************************** This loop initializes the individual agents for each run ********************************************** */ for (a=0;a<NUMBER_OF_AGENTS;a++) { for (b=0;b<DIMENSION;b++) { xx[b][a] = (float) ((maxx[b][1] - maxx[b][0])*getRandom() + maxx[b][0]); pbestx[b][a]=xx[b][a]; vx[b][a] = (float) (MAXV*(maxx[b][1]-maxx[b][0])*getRandom()); if (getRandom()> 0.5) vx[b][a]=-vx[b][a]; } } /* ******************************************************* Main Work Loop for each run here ******************************************************** */ finish=0; do { /*------ more randomize by Xiao-feng Xie start ------*/ time(&tt); newtime = localtime( &tt ); /* Convert to local time. */ curSec = newtime->tm_sec; for (j=0; j< curSec%7; j++) { rand(); } /*------ more randomize by Xiao-feng Xie end ------*/ iter++; //update inertia weight realWeight = (weight_up-weight_low) * (MAXITER - iter) /MAXITER +weight_low; for (a=0;a<NUMBER_OF_AGENTS;a++) { /* ********************************************* eval(a) error is returned by function routines ********************************************* */ minval = calcFunc(fun_type, xx, a, DIMENSION); if (firsttime==1) pbest[a]=minval; if (minval < pbest[a]) { pbest[a]=minval; for (b=0;b<DIMENSION;b++) pbestx[b][a]=xx[b][a]; if (pbest[a] < pbest[gbest]) { gbest=a; } } } for (a=0;a<NUMBER_OF_AGENTS;a++) { /* asynchronous version */ for (b=0;b<DIMENSION;b++) { vx[b][a] = (float) (realWeight*vx[b][a] + c1*getRandom()*(pbestx[b][a]-xx[b][a]) + c2*getRandom()*(pbestx[b][gbest]-xx[b][a])); if (vx[b][a]>MAXV*maxx[b][1]) { vx[b][a]=MAXV*maxx[b][1]; } else if (vx[b][a]<MAXV*maxx[b][0]) { vx[b][a]=MAXV*maxx[b][0]; } tx[b][a]=xx[b][a]+vx[b][a]; } } for (a=0;a<NUMBER_OF_AGENTS;a++) { for (b=0;b<DIMENSION;b++) { xx[b][a] = tx[b][a]; /*------ chaos factors Cv, Cl for absentminded birds: by Xiao-Feng Xie start ------*/ if (getRandom()< Cv) { vx[b][a] = (float) (MAXV*(maxx[b][1]-maxx[b][0])*getRandom()); if (getRandom() > 0.5) vx[b][a]=-vx[b][a]; } if (getRandom()< Cl) { xx[b][a] = (float) ((maxx[b][1]-maxx[b][0])*getRandom()+maxx[b][0]); } /*------ chaos factors Cv, Cl for absentminded birds: by Xiao-Feng Xie end ------*/ } } /* ****************************************************** Terminate on criterion ********************************************************* */ //output best index vs iteration if (iter%OutputStep==0) { if (fun_type==0) { fprintf(fp,"%e\t",1.0-pbest[gbest]); } else { fprintf(fp,"%e\t",pbest[gbest]); } } if (iter >= MAXITER) { fprintf(fp,"\n"); printf("%d run: gbest=%.4f\n",(i+1), pbest[gbest]); finish=1; } firsttime=0; } /* **************** End of do-loop *************** */ while (! finish); } time(&tt); fclose(fp); printf("end time: %s\n",ctime(&tt)); return 0;}float getRandom() { return rand()/(float)RAND_MAX;}float calcFunc(int fun_type, FMATRIX outxx, int a, int DIMENSION) { float minval; switch (fun_type) { case 0: minval=f6(outxx, a); break; case 1: minval=sphere(outxx, a,DIMENSION); break; case 2: minval=rosenbrock(outxx, a,DIMENSION); break; case 3: minval=rastrigrin(outxx, a,DIMENSION); break; case 4: minval=griewank(outxx, a,DIMENSION); break; default: printf("\n Not a valid function type\n"); exit(1); } return minval;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -