Example #1
0
//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++;
}
Example #2
0
	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;
 }