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];
 }