DEAP中的健身共享

2024-05-19 20:54:20 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有方法可以使用DEAP实现健身共享/小生境?具体来说,我在寻找pdf第98页上定义的here(Goldberg的fitness sharing)方法的实现。如果你知道DEAP中的任何其他方法,那也很有用。在

谢谢


Tags: 方法here定义pdffitnesssharing小生境deap
2条回答

编写你自己的选择程序。 默认例程在deap/tools/selection.py处,可以作为入门指南

例如:

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一起使用:

^{pr2}$

我有一个更像是基于相对适合度的概率选择,我没有这个权限,它只有大约10-15行python代码,所以它可以完成,而且不太难。在

我不知道这个特定的选择例程的任何实现都是公开的。在

要进行健身共享,您必须定义自己的共享健身函数,该函数取决于整个人群。在

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

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表示对邻近邻居的惩罚力度有多大。在

这种共享健身可以像常规健身一样注册到工具箱中。在

^{pr2}$

之后,您可以使用一个标准算法,如$\mu+\lambda$,它将根据后代的适应度来选择后代,以获得小生境。在

相关问题 更多 >