DEAP工具箱:考虑突变和交叉算子中不同类型和范围的基因

Sae*_*ide 5 python-2.7 deap

我正在研究遗传算法的实现,并且正在使用 DEAP 工具箱。我编写了一个初始化染色体的代码,它们的第一个基因是 [0.01, 2048] 范围内的浮点数,第二个基因又是 [0.0001, 10] 范围内的浮点数,最后三个基因是布尔值。这是我的代码:

toolbox.register("attr_flt1", random.uniform, 0.01, 2048)
toolbox.register("attr_flt2", random.uniform, 0.0001, 10)
toolbox.register("attr_bool", random.randint, 0, 1)
enter ctoolbox.register("individual", tools.initCycle, creator.Individual,
             (toolbox.attr_flt1, toolbox.attr_flt2, toolbox.attr_bool, toolbox.attr_bool, toolbox.attr_bool),
             n=1)
Run Code Online (Sandbox Code Playgroud)

有一个创建人口的样本:

[1817.2852738610263, 6.184224906600851, 0, 0, 1], [1145.7253307024512, 8.618185266721435, 1, 0, 1], ...
Run Code Online (Sandbox Code Playgroud)

现在,我想通过考虑基因类型和范围的差异来对我的染色体进行突变和交叉。目前我有一个错误,因为在应用交叉和变异运算符后,染色体的第一个基因产生了 0 值,这与我的评估函数错误。任何人都可以帮助我使用 DEAP 工具箱来编码选择、突变和交叉,从而在最初定义的范围内产生新的群体吗?

use*_*ber 2

如果您使用突变运算符mutPolynomialBounded此处有记录),那么您可以指定每个基因的间隔。

根据您指定的界限,也许可以使用诸如

eta = 0.5 #indicates degree of ressemblance of mutated individual
indpb = 0.1 #probability of individual to be mutated
low = [0.01, 0.0001, 0, 0, 0] #lower bound for each gene
up = [2048, 10, 1, 1, 1] #upper bound for each gene
toolbox.register('mutate', mutPolynomialBounded(individual, eta, low, up, indpb))
Run Code Online (Sandbox Code Playgroud)

作为突变函数将解决您的错误。这样,第一个基因在 区间 中[0.01, 2048],第二个基因在 区间 中[0.0001, 10],最后三个基因在 区间 中[0, 1]


如果您还希望最后三个基因为0or 1(但不是介于两者之间的浮点数),那么您可能必须实现自己的突变函数。例如,以下函数将根据您的要求为每个基因选择随机值

def mutRandom(individual, indpb):
    if random.random() < indpb:
        individual[0] = toolbox.attr_flt1()
        individual[1] = toolbox.attr_flt2()
        for i in range(2, 5):
            individual[i] = toolbox.attr_bool()
    return individual,
Run Code Online (Sandbox Code Playgroud)