Fix Artificial Bee Colony by using inverse fitness probability

This commit is contained in:
Fabian Becker 2014-11-22 19:34:04 +01:00
parent 6ae2aa28b9
commit 08f7b92f86

View File

@ -81,6 +81,16 @@ public class ArtificialBeeColony extends AbstractOptimizer implements Serializab
population.incrGeneration();
}
protected double getFitnessProportion(AbstractEAIndividual indy) {
double fitness = indy.getFitness(0);
if (fitness >= 0) {
fitness = 1.0 / (1.0 + fitness);
} else {
fitness = 1.0 + Math.abs(fitness);
}
return fitness;
}
@Override
public void optimize() {
/**
@ -131,8 +141,8 @@ public class ArtificialBeeColony extends AbstractOptimizer implements Serializab
*/
int t = 0, i = 0;
double sumFitness = 0.0;
for (Object individual : this.population) {
sumFitness += ((AbstractEAIndividual) individual).getFitness(0);
for (AbstractEAIndividual individual : this.population) {
sumFitness += getFitnessProportion(individual);
}
while (t < this.population.size()) {
double r = RNG.randomDouble();
@ -141,7 +151,7 @@ public class ArtificialBeeColony extends AbstractOptimizer implements Serializab
* Choose a food source depending on its probability to be chosen. The probability
* is proportional to the
*/
double pI = 1 - (this.population.getEAIndividual(i).getFitness(0) / sumFitness);
double pI = getFitnessProportion(this.population.getEAIndividual(i))/sumFitness;
if (r < pI) {
t++;