3

有没有办法使用DEAP实现健身共享/利基?具体来说,我正在寻找pdf 第 98 页上定义的方法的实现(Goldberg 的健身共享)如果您知道 DEAP 中的任何其他方法,那也会很有用。

谢谢

4

2 回答 2

1

编写您自己的选择程序。默认例程位于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 的其余部分一起使用:

toolbox.register("select", tools.selYourSelectionRoutine, yourargs)

我有一个更像是基于相对适应度的概率选择,我无权使用它,它只有大约 10-15 行 python,所以它可以完成,而且并不难。

我不知道(还)公开可用的特定选择例程的任何实现。

于 2015-05-13T23:50:22.057 回答
0

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

假设您已经定义了一个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表示对附近邻居的惩罚有多强。

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

population = toolbox.population()
toolbox.register('evaluate', shared_fitness, population=population, sigma=0.1, alpha=1.)

之后,您可以使用像 $\mu + \lambda$ 这样的标准算法,它会根据后代的适应度来选择后代,以获得利基。

于 2019-11-08T09:33:42.453 回答