Esta clase debe ser extendida por las clases que desean
escalar el fitness de un Individuo (por ejemplo para la seleccion)
El fitness escalado de un individuo se obtiene mediante la ejecución
de MotorAG.getFitness(IIndividuo)
Este scaler implementa un algoritmo de nichos paralelos, como se describe
en el libro de Goldberg(capitulo 5)
El fitness se escala mediante la siguiente fórmula
fitness_escalado = fitness_original/ Sum(s(d(xi, xj))
donde Sum denota sumatoria
d indica distancia entre 2 individuos
s indica la 'sharing function' que en este caso es triangular
La funcion de sharing triangular es como sigue:
sharing(distancia) = (sigmaShare - distancia) / sigmaShare
y para distancias mayores que sigmaShare la funcion de sharing da 0
Este scaler solo funciona con individuos del tipo bitString
Este scaler realiza la operacion (1/fitness) con lo cual invierte el tipo de optimizacion
Es decir, que para cada fitness que llega en la cadena, retorna el inverso de ese fitness
Este scaler se asegura que al momento de iniciar una iteración, se ajusten los parametros
para que todos los fitness de la poblacion actual sean positivos.
Esta clase implementa el último eslabon de una cadena de FitnessScalers
Es decir, que por ejemplo puedo definir una cadena de scalers de esta manera
motor.setFitnessScaler(new FitnessScalerAxB(new FitnessScalerPositive(new FitnessScalerSink()), 2,3));