que tiene una lista de objetos (cromosoma) que tienen un atributo de fitness (chromosome.fitness está entre 0 y 1)aptitud selección proporcional (ruleta rueda de selección) en Python
Dada una lista de este tipo de objetos, ¿cómo puede Implemento una función que devuelve un solo cromosoma cuya posibilidad de ser seleccionado es proporcional a su estado físico. Es decir, un cromosoma con aptitud 0.8 tiene el doble de probabilidades de ser seleccionado que uno con una aptitud de 0.4.
He encontrado algunas implementaciones de Python y pseudocódigo, pero son demasiado complejas para este requisito: la función solo necesita una lista de cromosomas. Los cromosomas almacenan su propia condición física como una variable interna.
La implementación que ya escribí fue antes de que decidiera permitir que los cromosomas almacenaran su propio estado físico, por lo que era mucho más complicado e implicaba relampagar listas y cosas.
---------------------------- EDIT ---------------- ------------
Gracias Lattyware. La siguiente función parece funcionar.
def selectOne(self, population):
max = sum([c.fitness for c in population])
pick = random.uniform(0, max)
current = 0
for chromosome in population:
current += chromosome.fitness
if current > pick:
return chromosome
Si usted tiene muchas opciones, o usted tiene que tomar muchos valores con el mismo conjunto de pesos, también se puede convertir esta solución O (n) en una solución O (log (n)) usando una búsqueda binaria, o incluso una solución O (1) usando algún tipo de tabla de búsqueda. –
@SvenMarnach Esto es cierto, aquí estoy dando la solución más simple, no necesariamente la más rápida, eso es digno de mención. –
[Este artículo] (http://www.keithschwarz.com/darts-dice-coins/) ofrece una buena exposición del desarrollo de un algoritmo O (1) para este muestreo. – Dougal