首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中的适合度比例选择(轮盘赌轮盘选择)

Python中的适合度比例选择(轮盘赌轮盘选择)
EN

Stack Overflow用户
提问于 2012-04-26 05:23:50
回答 6查看 25.4K关注 0票数 19

我有一个具有属性适应度的对象(染色体)列表(chromosome.fitness介于0和1之间)

给定一个这样的对象列表,我如何实现一个返回单个染色体的函数,该染色体被选中的机会与其适应度成正比?也就是说,适应度为0.8的染色体被选中的可能性是适应度为0.4的染色体的两倍。

我发现了一些Python和伪代码实现,但是它们对于这个需求来说太复杂了:函数只需要一个染色体列表。染色体将自身的适合度存储为内部变量。

我已经写的实现是在我决定允许染色体存储它们自己的适合度之前,所以要复杂得多,涉及压缩列表和事情。

谢谢Lattyware。下面的函数似乎起作用了。

代码语言:javascript
运行
复制
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
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-04-26 05:29:12

有一种非常简单的方法可以从字典中选择一个加权随机选择:

代码语言:javascript
运行
复制
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

如果您手头没有字典,可以修改它以适合您的类(因为您还没有给出它的更多细节,或者生成一个字典:

代码语言:javascript
运行
复制
choices = {chromosome: chromosome.fitness for chromosome in chromosomes}

假设适合性是一个属性。

这是一个修改后的函数示例,再次做出相同的假设,以获取可迭代的染色体。

代码语言:javascript
运行
复制
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
票数 17
EN

Stack Overflow用户

发布于 2018-09-09 18:59:17

使用numpy.random.choice。

代码语言:javascript
运行
复制
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)]
票数 19
EN

Stack Overflow用户

发布于 2014-11-29 23:17:57

我更喜欢更少的代码:

代码语言:javascript
运行
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10324015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档