我有一个具有属性适应度的对象(染色体)列表(chromosome.fitness介于0和1之间)
给定一个这样的对象列表,我如何实现一个返回单个染色体的函数,该染色体被选中的机会与其适应度成正比?也就是说,适应度为0.8的染色体被选中的可能性是适应度为0.4的染色体的两倍。
我发现了一些Python和伪代码实现,但是它们对于这个需求来说太复杂了:函数只需要一个染色体列表。染色体将自身的适合度存储为内部变量。
我已经写的实现是在我决定允许染色体存储它们自己的适合度之前,所以要复杂得多,涉及压缩列表和事情。
谢谢Lattyware。下面的函数似乎起作用了。
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
发布于 2012-04-26 05:29:12
有一种非常简单的方法可以从字典中选择一个加权随机选择:
def weighted_random_choice(choices):
max = sum(choices.values())
pick = random.uniform(0, max)
current = 0
for key, value in choices.items():
current += value
if current > pick:
return key
如果您手头没有字典,可以修改它以适合您的类(因为您还没有给出它的更多细节,或者生成一个字典:
choices = {chromosome: chromosome.fitness for chromosome in chromosomes}
假设适合性是一个属性。
这是一个修改后的函数示例,再次做出相同的假设,以获取可迭代的染色体。
def weighted_random_choice(chromosomes):
max = sum(chromosome.fitness for chromosome in chromosomes)
pick = random.uniform(0, max)
current = 0
for chromosome in chromosomes:
current += chromosome.fitness
if current > pick:
return chromosome
发布于 2018-09-09 18:59:17
使用numpy.random.choice。
import numpy.random as npr
def selectOne(self, population):
max = sum([c.fitness for c in population])
selection_probs = [c.fitness/max for c in population]
return population[npr.choice(len(population), p=selection_probs)]
发布于 2014-11-29 23:17:57
我更喜欢更少的代码:
import itertools
def choose(population):
bounds = list(itertools.accumulate(chromosome.fitness for chromosome in population))
pick = random.random() * bounds[-1]
return next(chromosome for chromosome, bound in zip(population, bounds) if pick < bound)
https://stackoverflow.com/questions/10324015
复制相似问题