public void UpdateAttractiveness(FireflyParticle a) { if (a.PersonalBestFitness < this.PersonalBestFitness) { double distance = AbstractFunction.EuclidianDistance(a.PersonalBestPosition, this.Position); double exponential = Math.Pow(Math.E, -LuciferinProductionCoefficient * distance); Attractiveness = AttractivenessFactor * exponential; } }
public void UpdatePosition(FireflyParticle a) { for (int i = 0; i < Parameters.DIMENSION_AMOUNT; i++) { //xi,d ← xi,d + β(xj,d − xi,d ) + α(rand() − 0.5) if (a.PersonalBestFitness < this.PersonalBestFitness) { this.Position[i] = this.PersonalBestPosition[i] + Attractiveness * (a.PersonalBestPosition[i] - this.Position[i]) + Alpha * (random.NextDouble() - 0.5); } else { this.Position[i] = this.Position[i] + Alpha * (random.NextDouble() - 0.5); } } }
public void UpdatePopulation(bool saveFitnessLog = false) { if (saveFitnessLog) { GlobalBestLog = new List <double>(); } for (int i = 0; i < Parameters.ITERATION_AMOUNT; i++) { foreach (FireflyParticle pA in ParticleList) { //Console.WriteLine("PB: {0}", FireflyParticle.GlobalBest); //if (pA == ParticleList[1]) Console.WriteLine("X: {0} / Y:{1}", FireflyParticle.PositionGBest[0], FireflyParticle.PositionGBest[1]); foreach (FireflyParticle pB in ParticleList) { if (pA == pB) { continue; } pA.UpdateAttractiveness(pB); pA.UpdatePosition(pB); pA.UpdateFitness(); } pA.ForceBoundaries(); } FireflyParticle.UpdateAttractivenessFactor(); if (saveFitnessLog) { GlobalBestLog.Add(FireflyParticle.GlobalBestFitness); } } }
public Swarm(EFunction function) { FireflyParticle.ClearStaticFields(); ParticleList = FireflyParticle.CreateSwarm(function); }