首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DEAP中的适应度共享

DEAP中的适应度共享
EN

Stack Overflow用户
提问于 2015-04-17 09:16:32
回答 2查看 725关注 0票数 3

有没有办法使用DEAP实现体能共享/小众定位?具体地说,我正在寻找pdf第98页上定义的方法here (Goldberg's fitness sharing)的实现。如果您知道DEAP中有任何其他方法,那也会很有用。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2015-05-14 07:50:22

编写您自己的选择例程。默认例程位于deap/tools/selection.py,作为入门指南可能很有用

例如:

代码语言:javascript
复制
def selYourSelectionRoutine(individuals, k):
    """Select the *k* best individuals among the input *individuals*.

    :param individuals: A list of individuals to select from.
    :param k: The number of individuals to select.
    :returns: A list containing the k best individuals.
    """
    return sorted(individuals, key=attrgetter("fitness"), reverse=True)[:k]

然后按照他们的规定在deap的其余部分中使用它:

代码语言:javascript
复制
toolbox.register("select", tools.selYourSelectionRoutine, yourargs)

我有一个更像是基于相对适合度的概率选择,这是我没有权利的,它只有10-15行python-所以它可以做到,并且不是很难。

我还不知道那个特定的选择例程有什么公开的实现。

票数 1
EN

Stack Overflow用户

发布于 2019-11-08 17:33:42

要进行适应度共享,您必须定义自己的共享适应度函数,该函数依赖于整个种群。

假设您已经定义了一个fitness函数,您可以执行以下操作:

代码语言:javascript
复制
from scipy.spatial import distance_matrix

def sharing(distance, sigma, alpha):
    res = 0
    if distance<sigma:
        res += 1 - (distance/sigma)**alpha
    return res

def shared_fitness(individual, population, sigma, alpha):
    num = fitness(individual)[0]

    dists = distance_matrix([individual], population)[0]
    tmp = [sharing(d, sigma, alpha) for d in dists]
    den = sum(tmp)

    return num/den,

这种共享的适应性将有利于邻居较少的个人。sigma是一个半径,在这个半径内,邻居将惩罚个人的共享健康。如果sigma更大,那么您的利基将会更远,并且您可能会错过局部最大值。如果sigma较小,则需要更大的人口,并且算法将需要更长的运行时间。alpha表明了对附近邻居的惩罚力度有多大。

然后,可以像常规健身一样在工具箱中注册此共享健身。

代码语言:javascript
复制
population = toolbox.population()
toolbox.register('evaluate', shared_fitness, population=population, sigma=0.1, alpha=1.)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29688582

复制
相关文章

相似问题

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