private ParticleSwarmOptimization CreatePsoRastriginSample() { ParticleSwarmOptimization pso = new ParticleSwarmOptimization(); #region Problem Configuration var problem = new SingleObjectiveTestFunctionProblem(); var provider = new SOTFInstanceProvider(); problem.Load(provider.LoadData(provider.GetDataDescriptors().Single(x => x.Name == "Rastrigin Function"))); problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator(); #endregion #region Algorithm Configuration pso.Name = "Particle Swarm Optimization - Rastrigin"; pso.Description = "A particle swarm optimization algorithm which solves the 2-dimensional Rastrigin test function."; pso.Problem = problem; pso.Inertia.Value = 0.721; pso.MaxIterations.Value = 200; pso.NeighborBestAttraction.Value = 1.193; pso.PersonalBestAttraction.Value = 1.193; pso.SwarmSize.Value = 40; pso.TopologyInitializer = pso.TopologyInitializerParameter.ValidValues.OfType <SPSORandomTopologyInitializer>().First(); pso.TopologyUpdater = pso.TopologyUpdaterParameter.ValidValues.OfType <SPSOAdaptiveRandomTopologyUpdater>().First(); pso.Seed.Value = 0; pso.SetSeedRandomly.Value = true; #endregion pso.Engine = new ParallelEngine.ParallelEngine(); return(pso); }
public void ShouldRun() { var pso = new ParticleSwarmOptimization(2, 10, 10, -10, (double[] d) => { return(Math.Abs((d[0] + d[1]) - 5)); }, (double f) => { return(f == 0); }, FitnessMethod.Minimize); pso.RunUntilTargetReached(); Assert.True(pso.BestSwarmFitness == 0); }
private ParticleSwarmOptimization CreatePsoSchwefelSample() { ParticleSwarmOptimization pso = new ParticleSwarmOptimization(); #region Problem Configuration var problem = new SingleObjectiveTestFunctionProblem(); problem.BestKnownQuality.Value = 0.0; problem.BestKnownSolutionParameter.Value = new RealVector(new double[] { 420.968746, 420.968746 }); problem.Bounds = new DoubleMatrix(new double[, ] { { -500, 500 } }); problem.EvaluatorParameter.Value = new SchwefelEvaluator(); problem.Maximization.Value = false; problem.ProblemSize.Value = 2; problem.SolutionCreatorParameter.Value = new UniformRandomRealVectorCreator(); #endregion #region Algorithm Configuration pso.Name = "Particle Swarm Optimization - Schwefel"; pso.Description = "A particle swarm optimization algorithm which solves the 2-dimensional Schwefel test function (based on the description in Pedersen, M.E.H. (2010). PhD thesis. University of Southampton)"; pso.Problem = problem; pso.Inertia.Value = 10; pso.MaxIterations.Value = 1000; pso.NeighborBestAttraction.Value = 0.5; pso.PersonalBestAttraction.Value = -0.01; pso.SwarmSize.Value = 50; var inertiaUpdater = pso.InertiaUpdaterParameter.ValidValues .OfType <ExponentialDiscreteDoubleValueModifier>() .Single(); inertiaUpdater.StartValueParameter.Value = new DoubleValue(10); inertiaUpdater.EndValueParameter.Value = new DoubleValue(1); pso.InertiaUpdater = inertiaUpdater; pso.ParticleCreator = pso.ParticleCreatorParameter.ValidValues .OfType <RealVectorParticleCreator>() .Single(); var swarmUpdater = pso.SwarmUpdaterParameter.ValidValues .OfType <RealVectorSwarmUpdater>() .Single(); swarmUpdater.VelocityBoundsIndexParameter.ActualName = "Iterations"; swarmUpdater.VelocityBoundsParameter.Value = new DoubleMatrix(new double[, ] { { -10, 10 } }); swarmUpdater.VelocityBoundsStartValueParameter.Value = new DoubleValue(10.0); swarmUpdater.VelocityBoundsEndValueParameter.Value = new DoubleValue(1.0); swarmUpdater.VelocityBoundsScalingOperatorParameter.Value = swarmUpdater.VelocityBoundsScalingOperatorParameter.ValidValues .OfType <ExponentialDiscreteDoubleValueModifier>() .Single(); pso.TopologyInitializer = null; pso.TopologyUpdater = null; pso.SwarmUpdater = swarmUpdater; pso.Seed.Value = 0; pso.SetSeedRandomly.Value = true; #endregion pso.Engine = new ParallelEngine.ParallelEngine(); return(pso); }
public void ShouldRun10Times() { int i = 0; var pso = new ParticleSwarmOptimization(2, 10, 50, -50, (double[] d) => { return(Math.Abs((d[0] + d[1]) - 5)); }, (double f) => { i++; return(i == 10); }, FitnessMethod.Minimize); pso.RunUntilTargetReached(); Assert.True(i == 10); }
public void ShouldMaximizeFunction() { int i = 0; var pso = new ParticleSwarmOptimization(2, 10, 50, -50, (double[] d) => { return(Math.Abs((d[0] + d[1]) - 5)); }, (double f) => { i++; return(i == 10); }, FitnessMethod.Maximize); double startBestFitness = pso.BestSwarmFitness; pso.RunUntilTargetReached(); Assert.True(pso.BestSwarmFitness > startBestFitness); }