private ParticleSwarmOptimization(ParticleSwarmOptimization original, Cloner cloner) : base(original, cloner) { qualityAnalyzer = cloner.Clone(original.qualityAnalyzer); solutionsCreator = cloner.Clone(original.solutionsCreator); mainLoop = cloner.Clone(original.mainLoop); Initialize(); }
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; }