Beispiel #1
0
        private double CalculateGCVelocityUpdate(PSO.Particle particle, PSO.Particle gbest, int i)
        {
            PSO.Settings settings = (PSO.Settings)Job.Optimizer.Configuration;
            double       ret;

            // The idea here is to set the new particle position in an area around
            // the best solution, while holding the constraint

            // Cancel momentum update
            ret = -particle.Velocity[i] * settings.Constriction;

            // Reset position
            ret -= particle.Parameters[i].Value;

            // Move to particle best position
            ret += gbest.Parameters[i].Value;

            // Add random perturbation
            string name = particle.Parameters[i].Name;

            ConstraintMatrix     cons = d_constraintsFor[name];
            List <Linear.Vector> eqs  = cons.NullspaceEquations;

            int idx = cons.ParameterIndex(name);

            // Generate random value on the null space of the constraints
            for (int j = 0; j < eqs[idx].Count; ++j)
            {
                ret += cons.RN[j] * eqs[idx][j];
            }

            return(ret * Configuration.GuaranteedConvergence);
        }
Beispiel #2
0
        public double CalculateVelocityUpdate(PSO.Particle particle, PSO.Particle gbest, int i)
        {
            // If there are no constraints, then just use the default
            double r1;
            double r2;

            Parameter parameter = particle.Parameters[i];
            string    name      = parameter.Name;

            if (d_constraintsFor.ContainsKey(name))
            {
                if (particle.Id == gbest.Id && Configuration.GuaranteedConvergence > 0)
                {
                    return(CalculateGCVelocityUpdate(particle, gbest, i));
                }

                ConstraintMatrix cons = d_constraintsFor[name];

                r1 = cons.R1[particle.Id];
                r2 = cons.R2[particle.Id];
            }
            else
            {
                r1 = particle.State.Random.NextDouble();
                r2 = particle.State.Random.NextDouble();
            }

            PSO.Settings settings = (PSO.Settings)Job.Optimizer.Configuration;

            double pg = 0;
            double pl = 0;

            // Global best difference
            if (gbest != null)
            {
                pg = gbest.Parameters[i].Value - parameter.Value;
            }

            // Local best difference
            if (particle.PersonalBest != null)
            {
                pl = particle.PersonalBest.Parameters[i].Value - parameter.Value;
            }

            // PSO velocity update rule
            return(settings.Constriction * (r1 * settings.CognitiveFactor * pl +
                                            r2 * settings.SocialFactor * pg));
        }
Beispiel #3
0
        private void Initialize(PSO.Particle particle, ConstraintMatrix constraint)
        {
            List <Linear.Vector> eqs     = constraint.Equations;
            List <Linear.Vector> nulleqs = constraint.NullspaceEquations;

            double[] rr  = new double[eqs[0].Count];
            double[] rrn = new double[nulleqs[0].Count];
            double   s   = 0;
            double   sn  = 0;

            PSO.Settings settings = (PSO.Settings)Job.Optimizer.Configuration;

            // Generate random variables
            for (int i = 0; i < rr.Length; ++i)
            {
                rr[i] = particle.State.Random.NextDouble();

                s += rr[i];
            }

            for (int i = 0; i < rrn.Length; ++i)
            {
                rrn[i] = particle.State.Random.NextDouble();
                sn    += rrn[i];
            }

            // Normalize such that sum == 1
            for (int i = 0; i < rr.Length; ++i)
            {
                rr[i] /= s;
            }

            for (int i = 0; i < rrn.Length; ++i)
            {
                rrn[i] /= sn;
            }

            // Initialize parameters of particle according to linear equations
            for (int i = 0; i < constraint.Parameters.Count; ++i)
            {
                string name = constraint.Parameters[i];

                Parameter param = particle.Parameter(name);
                double    v     = 0;

                for (int j = 0; j < rr.Length; ++j)
                {
                    v += rr[j] * constraint.Equations[i][j];
                }

                param.Value = v;

                v = 0;

                if (Configuration.HasInitialVelocity)
                {
                    for (int j = 0; j < rrn.Length; ++j)
                    {
                        v += rrn[j] * constraint.NullspaceEquations[i][j];
                    }

                    if (settings.MaxVelocity > 0)
                    {
                        v *= settings.MaxVelocity;
                    }
                }

                int idx = particle.Parameters.IndexOf(param);

                // Also set velocity to v
                particle.SetVelocity(idx, v);
            }
        }