public void DeserializePSOStateTest() { ParticleSwarmState expected = new ParticleSwarmState(); ParticleSwarmState actual; actual = UnmanagedPSOExports.DeserializePSOState(); Assert.AreEqual(expected, actual); }
public void SerializePSOStateTest() { int dim = 3; double[] lowerBound = new double[]{-1,-1,-1}; double[] upperBound = new double[]{1,1,1}; ParticleSwarmState swarmState = new ParticleSwarmState(dim,3,lowerBound,upperBound,lowerBound,upperBound); UnmanagedPSOExports.SerializePSOState(swarmState); }
public void ParticleSwarmStateGetParticleCyclesThroughAllParticles() { ParticleSwarmState pState = new ParticleSwarmState(); pState.Parameters = SwarmParameters.Initialize(5,5,3); for (int i = 0; i < 10; i++) { int val = pState.GetParticle(); Assert.IsTrue(val == i%5); } }
public static void ReportFitness(int particle, double fitness, ParticleSwarmState swarmState) { int S = swarmState.Parameters.S; var rand = new Random(); //Set the particles fitness swarmState.ParticleFitness[particle] = fitness; // ... update the best previous position if (swarmState.ParticleFitness[particle] < swarmState.BestParticleFitness[particle]) // Improvement { swarmState.Particles[particle].CopyTo(swarmState.BestParticle[particle], 0); swarmState.BestParticleFitness[particle] = swarmState.ParticleFitness[particle]; if(swarmState.BestParticleFitness[particle] < swarmState.BestParticleFitness[swarmState.G]) { swarmState.G = particle; } } //Check if epoch values should be updated if(particle == (S-1) || swarmState.EvaluationCount == 0) { swarmState.UpdateEpochValues(); } int s = particle; // ... find the first informant int s1 = 0; while (swarmState.Links[Tools.GetIndex(s1, s, swarmState.Parameters.S)] == 0) s1++; if (s1 >= S) s1 = s; // Find the best informant int g = s1; for (int m = s1; m < S; m++) { if (swarmState.Links[Tools.GetIndex(m, s, swarmState.Parameters.S)] == 1 && swarmState.BestParticleFitness[m] < swarmState.BestParticleFitness[g]) g = m; } //.. compute the new velocity, and move // Exploration tendency for (int d = 0; d < swarmState.Parameters.D; d++) { swarmState.Velocities[s][d] = swarmState.Parameters.W * swarmState.Velocities[s][d]; //If Quantization is in effect set vmin magnitude to Quantization value if (swarmState.Quantization != null && Math.Abs(swarmState.Velocities[s][d]) < swarmState.Quantization[d]) { swarmState.Velocities[s][d] = swarmState.Quantization[d]* Math.Sign(swarmState.Velocities[s][d]); } double px = swarmState.BestParticle[s][d] - swarmState.Particles[s][d]; swarmState.Velocities[s][d] += rand.NextDouble(0.0, swarmState.Parameters.C) * px; if (g != s) { double gx = swarmState.BestParticle[g][d] - swarmState.Particles[s][d]; swarmState.Velocities[s][d] += rand.NextDouble(0.0, swarmState.Parameters.C) * gx; } swarmState.Particles[s][d] = swarmState.Particles[s][d] + swarmState.Velocities[s][d]; //Bound Velocity if (swarmState.Particles[s][d] < swarmState.LowerBound[d]) { swarmState.Particles[s][d] = swarmState.LowerBound[d]; swarmState.Velocities[s][d] = 0; } if (swarmState.Particles[s][d] > swarmState.UpperBound[d]) { swarmState.Particles[s][d] = swarmState.UpperBound[d]; swarmState.Velocities[s][d] = 0; } } //Respect Quantization Tools.Quantize(swarmState.Particles[s],swarmState.Quantization); swarmState.EvaluationCount++; }
public static double[] GetValues(int particle, ParticleSwarmState swarmState) { return swarmState.Particles[particle]; }