private void UpdatePositionAndVelocity(Particle particle)
 {
     UpdateVelocity(particle);
     UpdatePosition(particle);
 }
        private void UpdateVelocity(Particle particle)
        {
            var newVelocity = new double[_vectorSize];

            Parallel.For(0, newVelocity.Length, i =>
            {
                CognitiveRandomizer1 = _random.NextDouble();
                CognitiveRandomizer2 = _random.NextDouble();

                newVelocity[i] = (InertiaWeight * particle.Properties.Velocity[i]) +
                                 (CognitiveWeight * CognitiveRandomizer1 *
                                  (particle.Properties.BestPosition[i] - particle.Properties.Position[i])) +
                                 (SocialWeight * CognitiveRandomizer2 * (BestGlobalPosition[i] - particle.Properties.Position[i]));
            });

            Array.Copy(newVelocity, particle.Properties.Velocity, newVelocity.Length);
        }
        private void UpdatePosition(Particle particle)
        {
            var newPosition = new double[_vectorSize];

            Parallel.For(0, newPosition.Length, i =>
            {
                newPosition[i] = particle.Properties.Position[i] + particle.Properties.Velocity[i];

                if (newPosition[i] < _configuration.DimensionMinimum)
                {
                    newPosition[i] = _configuration.DimensionMinimum;
                }

                if (newPosition[i] > _configuration.DimensionMaximum)
                {
                    newPosition[i] = _configuration.DimensionMaximum;
                }
            });

            Array.Copy(newPosition, particle.Properties.Position, newPosition.Length);
        }
        private void UpdateParticleError(NeuralNetworkConfiguration configuration, double[][] dataVectors, Particle particle)
        {
            var newError = Error(configuration, dataVectors, particle.Properties.Position);
            particle.ParticleError.Error = newError;

            if (newError < particle.ParticleError.BestError)
            {
                var bestPosition = particle.Properties.BestPosition;
                Array.Copy(particle.Properties.Position, particle.Properties.BestPosition, bestPosition.Length);

                particle.ParticleError.BestError = newError;
            }

            if (!(newError < BestGlobalError))
                return;

            var position = particle.Properties.Position;

            Array.Copy(particle.Properties.Position, BestGlobalPosition, position.Length);
            BestGlobalError = newError;
        }
        private void LiveOrDie(Particle particle, NeuralNetworkConfiguration configuration, double[][] dataVectors)
        {
            var currentLifeProbability = _random.NextDouble();

            if (!(currentLifeProbability < ParticleDeathProbability))
                return;

            var position = particle.Properties.Position;
            for (var i = 0; i < position.Length; i++)
                particle.Properties.Position[i] = (_configuration.DimensionMaximum - _configuration.DimensionMinimum) * _random.NextDouble() + _configuration.DimensionMinimum;

            particle.ParticleError.Error = Error(configuration, dataVectors, particle.Properties.Position);
            particle.ParticleError.BestError = particle.ParticleError.Error;

            Array.Copy(particle.Properties.Position, particle.Properties.BestPosition,position.Length);

            if (!(particle.ParticleError.Error < BestGlobalError))
                return;

            BestGlobalError = particle.ParticleError.Error;
            var particlePosition = particle.Properties.Position;
            Array.Copy(particle.Properties.Position, BestGlobalPosition, particlePosition.Length);
        }
        private void CreateParticleForSwarm(NeuralNetworkConfiguration configuration, double[][] dataVectors, int i)
        {
            var properties = new ParticleProperties(_vectorSize);
            var randomPosition = InitializeRandomPosition();

            var error = Error(configuration, dataVectors, randomPosition);

            var particleError = new ParticleError
            {
                Error = error,
                BestError = error
            };

            var randomVelocity = InitializeRandomVelocity();

            Array.Copy(randomPosition, properties.Position, randomPosition.Length);
            Array.Copy(randomPosition, properties.BestPosition, randomPosition.Length);
            Array.Copy(randomVelocity, properties.Velocity, randomVelocity.Length);

            _swarm[i] = new Particle(particleError, properties);
        }
Exemple #7
0
        Particle[] CreateParticles(int swarmSize)
        {
            Particle[] swarm = new Particle[swarmSize];
            for (int i = 0; i < swarmSize; i++)
            {
                swarm[i] = new Particle (this);
            }

            return swarm;
        }