答案 0 :(得分:0)
编写自己的选择例程。 默认例程位于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]
然后按照处方的其余部分使用它:
toolbox.register("select", tools.selYourSelectionRoutine, yourargs)
我有一个更像是基于相对适应性的概率选择,我没有权利,它只有大约10-15行的python - 所以它可以做到,并且不是很难过。
我不知道公开可用的特定选择例程的任何实现(还)。
答案 1 :(得分: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 $等标准算法,该算法将根据后代的适应性来选择后代。