public override void Ejecutar(Knapsack theProblem, Random myRandom) { EFOs = 0; var population = new List <PSOSolution>(); for (var i = 0; i < PopulationSize; i++) { var s = new PSOSolution(theProblem, this); s.RandomInitialization(myRandom); population.Add(s); } population.Sort((x, y) => - 1 * x.Fitness.CompareTo(y.Fitness)); BestSolution = new PSOSolution(population[0]); if (population[0].IsOptimalKnown()) { return; } for (var g = 1; g < MaxGenerations; g++) { for (var i = 0; i < PopulationSize; i++) { population[i].UpdateVelocity((PSOSolution)BestSolution, W, C1, C2, myRandom); population[i].UpdatePosition(myRandom); population[i].Repare(myRandom); population[i].Complete(myRandom, new List <int>()); population[i].Evaluate(); population[i].UpdateHistory(); } population.Sort((x, y) => - 1 * x.Fitness.CompareTo(y.Fitness)); population[0].LocalOptimizer(LocalIterations, myRandom); if (BestSolution.Fitness < population[0].Fitness) { BestSolution = new PSOSolution(population[0]); } if (EFOs >= MaxEFOs) { break; } if (population[0].IsOptimalKnown()) { break; } } }
public PSOSolution(PSOSolution original) : base(original) { LocalBestObjects = new int[MyProblem.TotalItems]; for (var i = 0; i < MyProblem.TotalItems; i++) { LocalBestObjects[i] = original.LocalBestObjects[i]; } LocalBestFitness = original.LocalBestFitness; Velocity = new double[MyProblem.TotalItems]; for (var i = 0; i < MyProblem.TotalItems; i++) { Velocity[i] = original.Velocity[i]; } }
public void UpdateVelocity(PSOSolution bestSolution, double w, double c1, double c2, Random myRandom) { for (var i = 0; i < MyProblem.TotalItems; i++) { Velocity[i] = w * Velocity[i] + c1 * myRandom.NextDouble() * (LocalBestObjects[i] - Objects[i]) + c2 * myRandom.NextDouble() * (bestSolution.Objects[i] - Objects[i]); if (Velocity[i] > 4) { Velocity[i] = 4; } if (Velocity[i] < -4) { Velocity[i] = -4; } } }