Python 在DEAP遗传算法中,如何在每次生成后更新或调整评估函数

Python 在DEAP遗传算法中,如何在每次生成后更新或调整评估函数,python,arrays,numpy,genetic-algorithm,deap,Python,Arrays,Numpy,Genetic Algorithm,Deap,我用DEAP软件包做了一个遗传算法。我的求值函数如下所示 Arch = np.array([0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) def evalComp(individual): compare = ((np.absolute( Arch[3] - individual[3])+np.absolute( Arch[4] - individual[4])+np.absolute( Arch[5] - individual[5])+np.ab

我用DEAP软件包做了一个遗传算法。我的求值函数如下所示

Arch = np.array([0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0])

def evalComp(individual):
    compare = ((np.absolute( Arch[3] - individual[3])+np.absolute( Arch[4] - individual[4])+np.absolute( Arch[5] - individual[5])+np.absolute( Arch[6] - individual[6])+np.absolute( Arch[7] - individual[7])+np.absolute( Arch[8] - individual[8])+np.absolute( Arch[9] - individual[9])+np.absolute( Arch[10] - individual[10])+np.absolute( Arch[11] - individual[11])+np.absolute( Arch[12] - individual[12])+np.absolute( Arch[13] - individual[13])+np.absolute( Arch[14] - individual[14])+np.absolute( Arch[15] - individual[15])+np.absolute( Arch[16] - individual[16])+np.absolute( Arch[17] - individual[17])+np.absolute( Arch[18] - individual[18])+np.absolute( Arch[19] - individual[19]))/17)
    return compare,
我想做的是在每一代之后将“Arch”更改为不同的numpy数组。我的问题是“g”由主函数定义,“evalComp”在主函数之外。以下是完整的GA:

import random
import time
from deap import base
from deap import creator
from deap import tools
import numpy as np
from secrets import randbelow

start_time = time.time() # Calculates runtime
creator.create("FitnessMax", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("attr_int", randbelow, (10))
toolbox.register("individual", tools.initRepeat, creator.Individual, 
                 toolbox.attr_int, 20) 

toolbox.register("population", tools.initRepeat, list, toolbox.individual)

# Archetype

Arch = np.array([0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0])

pop = toolbox.population(n=5)
pop = (pop)
print(pop)
print("\n")
print("\n")

def evalComp(individual):
    compare = ((np.absolute( Arch[3] - individual[3])+np.absolute( Arch[4] - individual[4])+np.absolute( Arch[5] - individual[5])+np.absolute( Arch[6] - individual[6])+np.absolute( Arch[7] - individual[7])+np.absolute( Arch[8] - individual[8])+np.absolute( Arch[9] - individual[9])+np.absolute( Arch[10] - individual[10])+np.absolute( Arch[11] - individual[11])+np.absolute( Arch[12] - individual[12])+np.absolute( Arch[13] - individual[13])+np.absolute( Arch[14] - individual[14])+np.absolute( Arch[15] - individual[15])+np.absolute( Arch[16] - individual[16])+np.absolute( Arch[17] - individual[17])+np.absolute( Arch[18] - individual[18])+np.absolute( Arch[19] - individual[19]))/17)
    return compare,

toolbox.register("evaluate", evalComp)
toolbox.register("mate", tools.cxUniform)
toolbox.register("mutate", tools.mutShuffleIndexes, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=4)

def main():
    random.seed(43)
    pop = toolbox.population(n=50)


    print("Start of evolution")

    fitnesses = list(map(toolbox.evaluate, pop))
    for ind, fit in zip(pop, fitnesses):
        ind.fitness.values = fit

    print(" Evaluated %i individuals" % len(pop))

    CXPB, MUTPB = 0.5, 0.3
    fits = [ind.fitness.values[0] for ind in pop]
    global g
    g = 0
    while max(fits) > 0 and g < 50:
        g = g + 1
        print("-- Generation %i --" % g)
        offspring = toolbox.select(pop, len(pop))
        offspring = list(map(toolbox.clone, offspring))
        for child1, child2 in zip(offspring[::2], offspring[1::2]):
            if random.random() < CXPB:
                toolbox.mate(child1, child2, 0.3)
                del child1.fitness.values
                del child2.fitness.values

        for mutant in offspring:
            if random.random() < MUTPB:
                toolbox.mutate(mutant)
                del mutant.fitness.values

        invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
        fitnesses = map(toolbox.evaluate, invalid_ind)
        for ind, fit in zip(invalid_ind, fitnesses):
            ind.fitness.values = fit

        print(" Evaluated %i individuals" % len(invalid_ind))

        pop[:] = offspring
        fits = [ind.fitness.values[0] for ind in pop]

        length = len(pop)
        mean = sum(fits) / length
        sum2 = sum(x*x for x in fits)
        std = abs(sum2 / length - mean**2)**0.5

        print(" Min %s" % min(fits))
        print(" Max %s" % max(fits))
        print(" Avg %s" % mean)
        print(" Std %s" % std)

    print("-- End of (successful) evolution --")
    print("\n")
    print("\n")
    print("Archetype",  Arch)

    print("\n")
    best_ind = tools.selBest(pop, 1)[0]
    print("Best individual is %s, %s" % (best_ind, best_ind.fitness.values))

if __name__ == "__main__":
    main()


print("--- %s seconds ---" % (time.time() - start_time))
随机导入
导入时间
来自deap进口基地
来自deap导入创建者
来自deap导入工具
将numpy作为np导入
从下面的秘密导入
开始时间=时间。时间()计算运行时间
create(“FitnessMax”,base.Fitness,weights=(-1.0,))
creator.create(“个人”,列表,fitness=creator.FitnessMax)
toolbox=base.toolbox()
工具箱.寄存器(“attr_int”,下文,(10))
toolbox.register(“个人”,tools.initRepeat,creator.individual,
toolbox.attr_int,20)
toolbox.register(“填充”,tools.initRepeat,list,toolbox.individual)
#原型
Arch=np.数组([0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0])
pop=工具箱。人口(n=5)
流行音乐=(流行音乐)
打印(pop)
打印(“\n”)
打印(“\n”)
def evalComp(个人):
比较=((np.绝对(拱[3]-个体[3])+np.绝对(拱[4]-个体[4])+np.绝对(拱[5]-个体[5])+np.绝对(拱[6]-个体[6])+np.绝对(拱[7]-个体[7])+np绝对(拱[8]-个体[9])+np绝对(拱[10]-个体[11])-个体[11]+np.绝对(拱[12]-个体[12])+np.绝对(拱[13]-个体[13])+np.绝对(拱[14]-个体[14])+np.绝对(拱[15]-个体[15])+np.绝对(拱[16]-个体[16])+np绝对(拱[17]-个体[17])+np绝对(拱[18]-个体[18])+np绝对(拱[19]-个体[19])/17)
返回比较,
工具箱注册(“评估”,evalComp)
toolbox.register(“mate”,tools.cxUniform)
toolbox.register(“mutate”,tools.mutshuffleIndex,indpb=0.05)
toolbox.register(“选择”,tools.self,tournsize=4)
def main():
随机种子(43)
pop=工具箱。人口(n=50)
印刷(“进化的开始”)
fitnesses=列表(映射(toolbox.evaluate,pop))
对于ind,适合拉链(流行,适合):
ind.fitness.values=fit
打印(“已评估%i个人”%len(pop))
CXPB,MUTPB=0.5,0.3
fits=[ind.fitness.value[0]表示pop中的ind]
全球g
g=0
当最大(配合)>0且g<50时:
g=g+1
打印(“--第%i代--%g”)
子代=工具箱。选择(pop,len(pop))
后代=列表(映射(toolbox.clone,后代))
对于child1,zip中的child2(子代[::2],子代[1::2]):
如果random.random()
提前谢谢

更新:

@usernumber建议在生成循环中定义
Arch
。我尝试过这样做,它似乎在每个循环后打印新的
Arch
,但是
evalComp
仍然使用
Arch
的原始定义来计算适合度。如果我删除原始的
Arch=np.array([…])
行,我会得到
name错误:没有定义名称“Arch”


我想要的是在求值函数中使用生成循环内部的
Arch
evalComp()

Arch
添加到求值函数的参数中

def evalComp(individual, Arch):
    compare = ...
    return compare,
然后,在工具箱中注册求值函数时,将Arch传递给它

toolbox.register("evaluate", evalComp, Arch)
由于
Arch
指向numpy数组,因此在修改其内容时,
eval
将访问数组的新内容。因此,在生成循环中,您只需将
Arch
的值设置为您想要的值

while g<50:
    Arch = np.random.rand(10)
当g0和g<50时:
g=g+1
Arch=np.random.rand(20)
打印(“--第%i代--%g”)
子代=工具箱。选择(pop,len(pop))
后代=列表(映射(toolbox.clone,后代))
对于child1,zip中的child2(子代[::2],子代[1::2]):
如果random.random()import random
import time
from deap import base
from deap import creator
from deap import tools
import numpy as np
from secrets import randbelow

start_time = time.time() # Calculates runtime
creator.create("FitnessMax", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("attr_int", randbelow, (10))
toolbox.register("individual", tools.initRepeat, creator.Individual, 
                 toolbox.attr_int, 20) 

toolbox.register("population", tools.initRepeat, list, toolbox.individual)

# Archetype

Arch = np.array([0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0])

pop = toolbox.population(n=5)
pop = (pop)
print(pop)
print("\n")
print("\n")

def evalComp(individual, Arch):
    compare = ((np.absolute( Arch[3] - individual[3])+np.absolute( Arch[4] - individual[4])+np.absolute( Arch[5] - individual[5])+np.absolute( Arch[6] - individual[6])+np.absolute( Arch[7] - individual[7])+np.absolute( Arch[8] - individual[8])+np.absolute( Arch[9] - individual[9])+np.absolute( Arch[10] - individual[10])+np.absolute( Arch[11] - individual[11])+np.absolute( Arch[12] - individual[12])+np.absolute( Arch[13] - individual[13])+np.absolute( Arch[14] - individual[14])+np.absolute( Arch[15] - individual[15])+np.absolute( Arch[16] - individual[16])+np.absolute( Arch[17] - individual[17])+np.absolute( Arch[18] - individual[18])+np.absolute( Arch[19] - individual[19]))/17)
    return compare,

toolbox.register("evaluate", evalComp, Arch)
toolbox.register("mate", tools.cxUniform)
toolbox.register("mutate", tools.mutShuffleIndexes, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=4)

def main():
    random.seed(43)
    pop = toolbox.population(n=50)


    print("Start of evolution")

    fitnesses = list(map(toolbox.evaluate, pop))
    for ind, fit in zip(pop, fitnesses):
        ind.fitness.values = fit

    print(" Evaluated %i individuals" % len(pop))

    CXPB, MUTPB = 0.5, 0.3
    fits = [ind.fitness.values[0] for ind in pop]
    global g
    g = 0
    while max(fits) > 0 and g < 50:
        g = g + 1
        Arch = np.random.rand(20)
        print("-- Generation %i --" % g)
        offspring = toolbox.select(pop, len(pop))
        offspring = list(map(toolbox.clone, offspring))
        for child1, child2 in zip(offspring[::2], offspring[1::2]):
            if random.random() < CXPB:
                toolbox.mate(child1, child2, 0.3)
                del child1.fitness.values
                del child2.fitness.values

        for mutant in offspring:
            if random.random() < MUTPB:
                toolbox.mutate(mutant)
                del mutant.fitness.values

        invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
        fitnesses = map(toolbox.evaluate, invalid_ind)
        for ind, fit in zip(invalid_ind, fitnesses):
            ind.fitness.values = fit

        print(" Evaluated %i individuals" % len(invalid_ind))

        pop[:] = offspring
        fits = [ind.fitness.values[0] for ind in pop]

        length = len(pop)
        mean = sum(fits) / length
        sum2 = sum(x*x for x in fits)
        std = abs(sum2 / length - mean**2)**0.5

        print(" Min %s" % min(fits))
        print(" Max %s" % max(fits))
        print(" Avg %s" % mean)
        print(" Std %s" % std)

    print("-- End of (successful) evolution --")
    print("\n")
    print("\n")
    print("Archetype",  Arch)

    print("\n")
    best_ind = tools.selBest(pop, 1)[0]
    print("Best individual is %s, %s" % (best_ind, best_ind.fitness.values))

if __name__ == "__main__":
    main()


print("--- %s seconds ---" % (time.time() - start_time))