//This function assumes the new fitnessvalues have just been updated void SwarmOptimizer::tick(float sigma) { //First update the personalBest and friendBest for(ParticleVector::iterator j = swarm.begin(); j!=swarm.end(); ++j) { //if there is an improvement... if(j->fitness>=j->personalOptimum) { //update the personal best j->personalOptimum=j->fitness; j->personalBest=j->position; //perhaps also update the friends best if(j->fitness>j->friendOptimum) { j->friendOptimum=j->fitness; j->friendBest=j->position; } //Broadcast this result to friends for(int k=0;k<(int)j->friends.size();k++) { int f=j->friends[k]; if(j->fitness>swarm[f].friendOptimum) { swarm[f].friendOptimum=j->fitness; swarm[f].friendBest=j->position; } } } } //Then adjust the position and velocity vectors for(ParticleVector::iterator j = swarm.begin(); j != swarm.end(); ++j) { /* //screw it up if(tickcount%100==0) for(int i=0;i<ndims;i++) j->velocity[i]=((rand()%1000)-500)/1000.0; if(tickcount%500==0) for(int i=0;i<ndims;i++) j->position[i]+=(rand()%20)-10; */ //update velocity for(int i=0;i<ndims;i++) { j->velocity[i]*=config.omega*sigma; j->velocity[i]+=UnitRandom() * config.phi1*sigma*(j->personalBest[i]-j->position[i]); j->velocity[i]+=UnitRandom() * config.phi2*sigma*(j->friendBest[i]-j->position[i]); j->velocity[i]+=(UnitRandom()-0.5f) * sigma * .01f; } //update position for(int i=0;i<ndims;i++) j->position[i] += j->velocity[i]; } tickcount++; }
float Random(float min, float max) { return min + UnitRandom() * (max-min); }
//----------------------------------------------------------------------- Real Math::SymmetricRandom () { return 2.0f * UnitRandom() - 1.0f; }
//----------------------------------------------------------------------- Real Math::RangeRandom (Real fLow, Real fHigh) { return (fHigh-fLow)*UnitRandom() + fLow; }