我正在学习使用Python DEAP模块,并且创建了最小化适应度函数和评估函数。我用于健身功能的代码如下:
ct.create("FitnessFunc", base.Fitness, weights=(-0.0001, -100000.0))
注意重量差异很大。这是因为the DEAP documentation for Fitness说:
权重也可以用来改变每个目标彼此之间的重要性。这意味着权重可以是任何实数,并且仅使用符号来确定是否进行了最大化或最小化。
对我来说,这是您可以通过增大权重来使一个权重优先。
我正在使用algorithms.eaSimple
(带有HallofFame)进行进化,并且使用tools.selTournament
选择了人口中最好的个体。
评估功能返回abs(sum(input)), len(input)
。运行后,我从HallOfFame中获取值并进行评估,但是,输出类似于以下内容(行末的数字由我添加):
(154.2830144, 3) 1
(365.6353634, 4) 2
(390.50576340000003, 3) 3
(390.50576340000003, 14) 4
(417.37616340000005, 4) 5
让我感到困惑的是,我认为文档指出,较大的第二权重意味着len(input)
会产生较大的影响,并导致类似以下的输出:
(154.2830144, 3) 1
(365.6353634, 4) 2
(390.50576340000003, 3) 3
(417.37616340000005, 4) 5
(390.50576340000003, 14) 4
注意,第4行和第5行已交换。这是因为第4行的权重远大于第5行的权重。
看来,首先实际上是根据第一个元素评估适应性,然后仅在第一个元素之间存在联系时才考虑第二个元素。如果是这种情况,那么设置除-1或+1以外的权重的目的是什么?
[从Pareto-optimality的角度来看,无论权重如何,A=(390.50576340000003, 14)
和B=(417.37616340000005, 4)
两种解决方案都不优于另一种;总是f1(A) > f1(B)
和f2(A) < f2(B)
,因此两者都不占主导地位(source):
[如果它们位于相同的边界,则现在可以基于第二个指标来选择获胜者:边界中每个解决方案周围的解决方案密度,现在考虑了权重(拥挤距离)。实际上,如果您选择合适的运算符,例如selNSGA2
。您正在使用的selNSGA2
运算符仅基于第一个目标进行选择:
selTournament
如果仍要使用它,则可以考虑更新评估函数,以返回目标加权总和的单个输出。但是,在非凸目标空间的情况下,此方法将失败(有关详细信息,请参见第12页selTournament
)。
def selTournament(individuals, k, tournsize, fit_attr="fitness"):
chosen = []
for i in xrange(k):
aspirants = selRandom(individuals, tournsize)
chosen.append(max(aspirants, key=attrgetter(fit_attr)))
return chosen