示例#1
0
        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));
        }
示例#2
0
        /// <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));
            }
        }
示例#3
0
        /// <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));
        }
示例#4
0
        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));
        }