void Krill_OnGenerationComplete(object sender, RunEventArgs e) { KrillPopulation population = (KrillPopulation)sender; var bestKrill = population.GetBestKrill(); Console.WriteLine("Iteration: {0}, Fitness: {1}, Coordinates: ({2}, {3})", e.Iteration, Math.Round(bestKrill.Fitness, 4), Math.Round(bestKrill.Coordinates[0], 4), Math.Round(bestKrill.Coordinates[1], 4)); }
/// <summary> /// EQUATION 8 /// </summary> private Vector <double> AlphaTarget(Krill krill, int currentIteration) { Krill bestKrill = KrillPopulation.GetBestKrill(); if (bestKrill.Fitness > krill.Fitness) { double K_i_best = K_i_j(krill.Fitness, bestKrill.Fitness); Vector <double> X_i_best = X_i_j(krill.Coordinates, bestKrill.Coordinates); double C_best = EffectiveCoefficient(currentIteration); return(X_i_best.Multiply(C_best * K_i_best)); } else { return(Vector <double> .Build.Dense(krill.Coordinates.Count)); } }
/// <summary> /// EQUATION 12 /// </summary> public Vector <double> CreateVirtualFood() { double sum = 0; foreach (var krill in KrillPopulation.Population) { PositionOfFood += krill.Coordinates / (krill.Fitness + Epsilon); } foreach (var krill in KrillPopulation.Population) { sum += (1 / (krill.Fitness + Epsilon)); } PositionOfFood = PositionOfFood / sum; PositionOfFood = MathHelpers.FindLimits(PositionOfFood, KrillPopulation.GetBestKrill().Coordinates, LB_Vector, UB_Vector); return(CompareToFoodLastPosition(PositionOfFood)); }
public void Run(int evaluations, double C_t, double N_max, double V_f, double D_max) { var scaleVector = CalculateScaleVector(C_t, UB_vector, LB_vector); InducedMotion inducedMotion = new InducedMotion(KrillPopulation, FitnessFunction, evaluations, N_max); ForagingMotion foragingMotion = new ForagingMotion(KrillPopulation, FitnessFunction, evaluations, V_f); VirtualFood virtualFood = new VirtualFood(KrillPopulation, FitnessFunction, UB_vector, LB_vector); PhysicalDiffusion physicalDiffusion = new PhysicalDiffusion(D_max, evaluations, scaleVector.Count); // We evaluate each krill in the population KrillPopulation.EvaluatePopulation(FitnessFunction); for (int i = 1; i <= evaluations; i++) { var vf_position = virtualFood.CreateVirtualFood(); foreach (var krill in KrillPopulation.Population) { Vector <double> N_i = inducedMotion.GetInducedMotion(krill, i); Vector <double> F_i = foragingMotion.GetForagingMotion(krill, i, vf_position); Vector <double> D_i = physicalDiffusion.GetPhysicalDiffusion(i); Vector <double> X_i = (F_i + N_i).Add(D_i); // EQUATION 1 X_i = X_i.PointwiseMultiply(scaleVector); var newPosition = krill.Coordinates + X_i; var bestKrillPosition = KrillPopulation.GetBestKrill().Coordinates; krill.Coordinates = MathHelpers.FindLimits(newPosition, bestKrillPosition, LB_vector, UB_vector); } // We evaluate each krill in the population KrillPopulation.EvaluatePopulation(FitnessFunction); OnGenerationComplete.Invoke(KrillPopulation, new RunEventArgs(i)); } OnRunComplete.Invoke(KrillPopulation, new RunEventArgs(evaluations)); }