⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arpso.c

📁 一个遗传粒子群算法原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <limits.h>#include <time.h>#include <functions.c>#define pi 3.14159265358979#define e  2.71828182845904#define TICKSIZE 5#define bool int#define true 1#define false 0#define MAX(x,y) ((x) > (y) ? (x) : (y))#define MIN(x,y) ((x) < (y) ? (x) : (y))#define DBL_MAX pow(2,1023)int outputDeltaEvals = 20;int t;                              // timestepint tMax;                           // max timestepint swarmsize;                      // number of particlesint nParticles;						// actual number of particles (this number can vary because of fusion and fission)int dim;                            // dimensionality of the functionint topo;                           // neighbourhood topologyint runs;                           // Runsint runno;							// Run numberint procent;						//......long evaluations=0;int notImproved=0;int particleLowerBound = 4;int modeFusion = 1;int tLastFission = -1;int evalImproved;int remGbest = -1;double dir;double dLow, dHigh;double diversity;double diagonal;double w,wstart,wend;               // inertia weightdouble theta, theta_start, theta_end, ignorance;// theta & ignorancedouble phi1,phi2;                   // ...double vmax;                        // ...double minlimit,maxlimit;           // limits of the problemdouble mininitlimit,maxinitlimit;   // limits of initialization for particlesint probID;                         //double bfactor;                     // bounce factordouble radius;                      // particle radiusint colllistlength = 25;int colllistPtr;int *partvelchanged;int nAllowed = 0;int maxAllowed;int windowSize=10;int windowPos;double fitnessThreshold = 0.1;double *fusionPoint;typedef struct statistics {	int nEvals;	double nParticles, avgbestfitness, avgavgfitness, stddev, posStddev;} statistics;statistics *logdata, *logdataRuns;FILE *positionfile;FILE *numberparticlesfile,*avgbestfitnessfile,*avgavgfitnessfile,*stddevfile,*posstddevfile,*besteverfile;typedef struct par {	double *pos;	double *vel;	double fitness;		// -- bruges til m錶 for improvement over fitwindowsize timestep	double *fitnesslist;	double fitnessImprove;	// ---	double *best;	double *bestvel;	double bestfit;	// ---	double *gbest;	double gbestfit;	int *nlist;					    // indexlist of neighbours	int changedvel;	// --- collision	int *colllist;					// list of number of collisions over the last colllistlength timesteps	int colllistsum;					// sum of the colllist		int oldVal;	// ---	int behavior;						// 0 is global; 1 is local ; ...	int tImproved;					// timesteps since last fitness improvement	int tChangedBehavior;				// timesteps since last behavior change	// ---	bool allowed;   // .. to be put to the gbest		//-- Nuklear Stuff	int parSize;	int fusedWith;} par;par *swarm;par *bestever;double randval(double low, double high);void allocspace();void initvalues();void updvel();//void collcontrol();void newpos();void assignfitn();void updneigh();void report();void updparams();void logging();void writestats();void logstats();void writepositions();int overlap(int i, int j);double dist(int i, int j);double dist2(double *i, double *j);double decreaseTheta(double a, double b, int time);void randomizevectordir(int i);void collectbestever();void updColllist();void fitImprovement();double distanceToMeanPoint(int index);int findFissionNumber();void meanPoint(double *avgpoint);void printpositions();void printbestfitness();int findFissionParticle(int ModelNr);double randval(double low, double high){	return (((double)(rand()%1000)/1000.0)*(high - low) + low);}int mainParticle(int i) {     return (swarm[i].fusedWith == i);}void allocspace() {	int i;		if (runs == 1 && dim == 2) {		if ((positionfile = fopen("positions.dat","w")) == NULL) {			printf("The file positions.dat couldn't be opened\n");			exit(-1);		}	}		if ((numberparticlesfile = fopen("numberofparticles.dat","w")) == NULL) {		printf("The file numberofparticles.dat couldn't be opened\n");		exit(-1);	}		if ((avgbestfitnessfile = fopen("avgbestfitness.dat","w")) == NULL) {		printf("The file avgbestfitness.dat couldn't be opened\n");		exit(-1);	}		if ((avgavgfitnessfile = fopen("avgavgfitness.dat","w")) == NULL) {		printf("The file avgavgfitness.dat couldn't be opened\n");		exit(-1);	}		if ((stddevfile = fopen("stddev.dat","w")) == NULL) {		printf("The file stddev.dat couldn't be opened\n");		exit(-1);	}		if ((posstddevfile = fopen("posstddev.dat","w")) == NULL) {		printf("The file posstddev.dat couldn't be opened\n");		exit(-1);	}		if ((besteverfile = fopen("bestever.dat","w")) == NULL) {		printf("The file bestever.dat couldn't be opened\n");		exit(-1);	}		logdata = malloc((tMax+1) * sizeof(statistics));	// max number of evaluations is at most tmax+swarmsize	// (if nEvals is tmax-1 before a "timestep" starts, then a whole new swarm can be evaluated)	// we will only output each outputDeltaEvals evaluation-value, hence the formula for the size of logdataRuns	logdataRuns = malloc(((tMax+swarmsize)/outputDeltaEvals+1) * sizeof(statistics));	partvelchanged = malloc(swarmsize * sizeof(int));		bestever = malloc((runs+1) * sizeof(par));		for(i=0;i<runs+1;i++)		bestever[i].pos = malloc(dim * sizeof(double));		swarm = malloc((swarmsize+1) * sizeof(par));	fusionPoint = malloc(dim * sizeof(double));		for(i=0;i<swarmsize+1;i++) {		swarm[i].pos = malloc(dim * sizeof(double));		swarm[i].vel = malloc(dim * sizeof(double));		// ---		swarm[i].best = malloc(dim * sizeof(double));		swarm[i].bestvel = malloc(dim * sizeof(double));		// ---		swarm[i].gbest = malloc(dim * sizeof(double));		// ---		swarm[i].colllist = malloc(colllistlength*sizeof(int));		swarm[i].fitnesslist = malloc(windowSize * sizeof(double));				switch(topo){					case 0:			// fully connected			swarm[i].nlist = malloc(swarmsize * sizeof(int));			break;			/*		case 1:			// circle k=2			swarm[i].nlist = malloc(3 * sizeof(int));			break;		case 2:			if (i==0) swarm[i].nlist = malloc(swarmsize * sizeof(int));			else swarm[i].nlist = malloc(2 * sizeof(int));			break;			*/		}	}}void initvalues() {	int i,j;	dir = 1;	//dLow = 0.01;	//dHigh = 0.1;	diversity = DBL_MAX;  diagonal = sqrt(dim) * (maxlimit - minlimit); // = sqrt(dim * pow(maxlimit - minlimit,2));	evalImproved = 0;	modeFusion = 1;	tLastFission = -1;	nParticles = swarmsize/1;// nParticles = swarmsize/initparticlessize	w= wstart;	if (runno==0) {		for(i=0;i<swarmsize;i++)			partvelchanged[i] = 0;	}	for(i=0;i<dim;i++)	  fusionPoint[i] = 0;		// stats	for(i=0;i<tMax;i++) {		logdata[i].nEvals = -1;	}	for(i=0;i<((tMax+swarmsize)/outputDeltaEvals+1);i++) {		logdataRuns[i].nEvals = -1;	}		// position and velocity	for(i=0;i<swarmsize+1;i++) {		for(j=0;j<dim;j++) {			swarm[i].pos[j] = randval(mininitlimit,maxinitlimit);			swarm[i].vel[j] = randval(-vmax,vmax); 		}		swarm[i].fitness = DBL_MAX;		swarm[i].bestfit = DBL_MAX;		swarm[i].gbestfit = DBL_MAX;		swarm[i].changedvel = 0;		swarm[i].tImproved = 0;		swarm[i].parSize = 1;    		swarm[i].fitnessImprove = 0;		// Should only be done in fusion model 1!!!		if (i!=(swarmsize))		  swarm[i].fusedWith = i ;//% (swarmsize/2);		else		  swarm[i].fusedWith = i; 	}				// initializing collisionlist	colllistPtr = 0;	for(i=0;i<swarmsize;i++) {		swarm[i].colllistsum = 0;		for(j=0;j<colllistlength;j++) {			swarm[i].colllist[j] = 0;		}	}		switch(topo){	case 0:		// fully connected		for(i=0;i<swarmsize;i++){			for(j=0;j<swarmsize;j++)				swarm[i].nlist[j]=j;		}		break;		/*	case 1:		// circle k=2		for(i=0;i<swarmsize;i++){			swarm[i].nlist[0] = (i-1) % swarmsize;			swarm[i].nlist[1] = i;			swarm[i].nlist[2] = (i+1) % swarmsize;			if (swarm[i].nlist[0]<0)				swarm[i].nlist[0] += swarmsize;			if (swarm[i].nlist[1]<0)				swarm[i].nlist[1] += swarmsize;		}		break;	case 2:		// particle 0 connected to all		for(i=0;i<swarmsize;i++)			swarm[0].nlist[i]=i;		// all connected to particle 0		for(i=1;i<swarmsize;i++){			swarm[i].nlist[0]=0;			swarm[i].nlist[1]=i;		}		break;		*/	}		// best position and fitness	windowPos = 0;	assignfitn();	windowPos = 0;		// initializing fitnesslist	for(i=0;i<swarmsize+1;i++) {		for(j=0;j<windowSize;j++) {			swarm[i].fitnesslist[j] = DBL_MAX;		} 	}		// global best position and fitness	for(i=0;i<swarmsize;i++) {		for(j=0;j<dim;j++)			swarm[i].gbest[j] = swarm[i].pos[j];		swarm[i].gbestfit = swarm[i].fitness;	}}void updvel() {	int i,j;	w = (wstart-wend) * (tMax - evaluations) /tMax +wend;    //time variant weight, linear from weight to 0.4	for(i=0;i<swarmsize;i++) {		if (mainParticle(i)) {			for(j=0;j<dim;j++) {				swarm[i].vel[j] = w * swarm[i].vel[j] + dir * randval(0,phi1) * (swarm[i].best[j] - swarm[i].pos[j]) + dir * randval(0,phi2) * (swarm[i].gbest[j] - swarm[i].pos[j]);				// checking for maxvelocity				if (swarm[i].vel[j] > vmax)					swarm[i].vel[j] = vmax;				if (swarm[i].vel[j] < -vmax)					swarm[i].vel[j] = -vmax;			}		}	}}double getDiversity() {  int i,j;  double posStddev;  double *avgpoint = malloc(dim * sizeof(double));  // spredning paa partiklernes positioner  for(i=0;i<dim;i++) {    for(j=0;j<swarmsize;j++) {      if (mainParticle(j))	avgpoint[i] += swarm[j].pos[i];    }  }  for(i=0;i<dim;i++)    avgpoint[i] /= nParticles;  for(i=0;i<swarmsize;i++) {    if (mainParticle(i))      posStddev += pow(dist2(avgpoint, swarm[i].pos),2);  }  posStddev /= MAX(nParticles - 1,1);  posStddev = sqrt(posStddev);  free(avgpoint);  return posStddev;}void setPosAndVel(int a, int method) {  int i;  double fac3 = getDiversity();  double fac2 = 1/(sqrt(t+1));  double fac = (double)1-(double)evaluations/(double)tMax;  for(i=0;i<dim;i++) {    switch (method) {    case 0:      {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -