public PsoOptimizer(double bestGlobalError, double[] bestGlobalPosition, Particle[] swarm, PsoArguments psoArguments) { Arguments = psoArguments; BestGlobalError = bestGlobalError; Swarm = swarm; BestGlobalPosition = bestGlobalPosition; }
/// <summary> /// Init PSO /// </summary> /// <returns></returns> public static PsoOptimizer Build(int dimensions, Func <double[], double> errorFunc, PsoArguments psoArguments) { var swarm = Enumerable.Range(0, psoArguments.SwarmSize) .Select(i => new Particle(dimensions, errorFunc, psoArguments)) .ToArray(); var bestGlobalError = swarm[0].Objective; var bestGlobalPosition = new double[dimensions]; swarm[0].Position.CopyTo(bestGlobalPosition, 0); var particleIndex = Enumerable.Range(0, swarm.Length).ToArray(); // Update Ring Inline (Define which particle Learning from) for (var i = 0; i < particleIndex.Length; i++) { var informers = new List <Particle>(); var numberOfinformers = psoArguments.MaxInformers / 2; for (var n = 1; n <= numberOfinformers; n++) { var p = i - n; while (p < 0) { p = swarm.Length + p; } informers.Add(swarm[particleIndex[p]]); } numberOfinformers += psoArguments.MaxInformers % 2; for (var n = 1; n <= numberOfinformers; n++) { var p = i + n; while (p >= swarm.Length) { p = p - swarm.Length; } informers.Add(swarm[particleIndex[p]]); } swarm[particleIndex[i]].InformersList = informers; } return(new PsoOptimizer(bestGlobalError, bestGlobalPosition, swarm, psoArguments)); }
/// <summary> /// /// </summary> /// <param name="dimensions"></param> /// <param name="errorFunc"></param> public Particle(int dimensions, Func <double[], double> errorFunc, PsoArguments arguments) { Random = new Random(); Dimensions = dimensions; Arguments = arguments; ErrorFunc = errorFunc; InformersList = new List <Particle>(); Velocity = Enumerable.Range(0, Dimensions) .Select(i => Random.NextDouble(Arguments.RangeMin, Arguments.RangeMax)).ToArray(); Position = Enumerable.Range(0, Dimensions) .Select(i => Random.NextDouble(Arguments.RangeMin, Arguments.RangeMax)).ToArray(); BestPosition = new double[Dimensions]; Position.CopyTo(BestPosition, 0); Objective = ErrorFunc(Position); BestError = Objective; }