public ParticleSwarm(int population_size, int dimension_count, CostEvaluationMethod evaluator, double[] lower_bounds, double[] upper_bounds) { mDimensionCount = dimension_count; mLowerBounds = lower_bounds; mUpperBounds = upper_bounds; mParticleGenerator = (constraints) => { SimpleParticle p = new SimpleParticle(this, mDimensionCount, constraints); double lower_bound; double upper_bound; double range; for (int d = 0; d < mDimensionCount; ++d) { lower_bound = lower_bounds[d]; upper_bound = upper_bounds[d]; range = upper_bound - lower_bound; p[d, ParticleVectorType.Position] = lower_bound + range * RandomEngine.NextDouble(); p[d, ParticleVectorType.Velocity] = 0; } Particle cast_p = p as Particle; return(cast_p); }; mParticles = new Particle[population_size]; mLocalBestParticles = new Particle[population_size]; mEvaluator = evaluator; }
public ParticleSwarm(int population_size, int dimension_count, CostEvaluationMethod evaluator, CreateParticleMethod generater = null) { mDimensionCount = dimension_count; mParticleGenerator = generater; mEvaluator = evaluator; mParticles = new Particle[population_size]; mLocalBestParticles = new Particle[population_size]; mEvaluator = evaluator; }
public static double Solve(int population_size, int dimension_count, CostEvaluationMethod evaluator, CreateParticleMethod generator, out Particle global_best_solution, double[] lower_bounds = null, double[] upper_bounds = null, object constraints = null, double tolerance = 0.000001, int maxIterations = 100000) { ParticleSwarm <Particle> solver = new ParticleSwarm <Particle>(population_size, dimension_count, evaluator, generator); solver.LowerBounds = lower_bounds; solver.UpperBounds = upper_bounds; solver.Initialize(constraints); int iteration = 0; double cost_reduction = tolerance; double global_best_solution_cost = solver.GlobalBestSolutionCost; double prev_global_best_solution_cost = global_best_solution_cost; while (cost_reduction >= tolerance && iteration < maxIterations) { prev_global_best_solution_cost = global_best_solution_cost; solver.Iterate(); global_best_solution_cost = solver.GlobalBestSolutionCost; cost_reduction = prev_global_best_solution_cost - global_best_solution_cost; iteration++; } global_best_solution = solver.GlobalBestSolution.Clone() as Particle; return(global_best_solution_cost); }