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