• Deap: python中的遗传算法工具箱


    Overview 程序概览

    官方文档:http://deap.readthedocs.io/en/master/index.html
    1. Types : 选择你要解决的问题类型,确定要求解的问题个数,最大值还是最小值
    2. Initialization : 初始化基因编码位数,初始值,等基本信息
    3. Operators : 操作,设计evaluate函数,在工具箱中注册参数信息:交叉,变异,保留个体,评价函数
    4. Algorithm : 设计main函数,确定参数并运行得到结果

    Types

    # Types
    from deap import base, creator
    
    creator.create("FitnessMin", base.Fitness, weights=(-1.0,))  
    
    # weights 1.0, 求最大值,-1.0 求最小值
    # (1.0,-1.0,)求第一个参数的最大值,求第二个参数的最小值
    creator.create("Individual", list, fitness=creator.FitnessMin)

    Initialization

    import random
    from deap import tools
    
    IND_SIZE = 10  # 种群数
    
    toolbox = base.Toolbox()
    toolbox.register("attribute", random.random)
    # 调用randon.random为每一个基因编码编码创建 随机初始值 也就是范围[0,1]
    toolbox.register("individual", tools.initRepeat, creator.Individual,
                     toolbox.attribute, n=IND_SIZE)
    toolbox.register("population", tools.initRepeat, list, toolbox.individual)

    Operators

    # Operators
    # difine evaluate function
    # Note that a comma is a must
    def evaluate(individual):
        return sum(individual),
    
    
    # use tools in deap to creat our application
    toolbox.register("mate", tools.cxTwoPoint) # mate:交叉
    toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1) # mutate : 变异
    toolbox.register("select", tools.selTournament, tournsize=3) # select : 选择保留的最佳个体
    toolbox.register("evaluate", evaluate)  # commit our evaluate

    高斯变异:

    这种变异的方法就是,产生一个服从高斯分布的随机数,取代原先基因中的实数数值。这个算法产生的随机数,数学期望当为当前基因的实数数值。
    一个模拟产生的算法是,产生6个服从U(0,1)的随机数,以他们的数学期望作为高斯分布随机数的近似。

    mutate方法

    • 这个函数适用于输入个体的平均值和标准差的高斯突变

    • mu:python中基于平均值的高斯变异

    • sigma:python中基于标准差的高斯变异

    • indpb:每个属性的独立变异概率

    mate : 交叉

    select : 选择保留的最佳个体

    evaluate : 选择评价函数,要注意返回值的地方最后面要多加一个逗号

    Algorithms 计算程序

    也就是设计主程序的地方,按照官网给的模式,我们要早此处设计其他参数,并设计迭代和取值的代码部分,并返回我们所需要的值.

    
    # Algorithms
    def main():
        # create an initial population of 300 individuals (where
        # each individual is a list of integers)
        pop = toolbox.population(n=50)
        CXPB, MUTPB, NGEN = 0.5, 0.2, 40
    
        '''
        # CXPB  is the probability with which two individuals
        #       are crossed
        #
        # MUTPB is the probability for mutating an individual
        #
        # NGEN  is the number of generations for which the
        #       evolution runs
        '''
    
        # Evaluate the entire population
        fitnesses = map(toolbox.evaluate, pop)
        for ind, fit in zip(pop, fitnesses):
            ind.fitness.values = fit
    
        print("  Evaluated %i individuals" % len(pop))  # 这时候,pop的长度还是300呢
        print("-- Iterative %i times --" % NGEN)
    
        for g in range(NGEN):
            if g % 10 == 0:
                print("-- Generation %i --" % g)
            # Select the next generation individuals
            offspring = toolbox.select(pop, len(pop))
            # Clone the selected individuals
            offspring = list(map(toolbox.clone, offspring))
            # Change map to list,The documentation on the official website is wrong
    
            # Apply crossover and mutation on the offspring
            for child1, child2 in zip(offspring[::2], offspring[1::2]):
                if random.random() < CXPB:
                    toolbox.mate(child1, child2)
                    del child1.fitness.values
                    del child2.fitness.values
    
            for mutant in offspring:
                if random.random() < MUTPB:
                    toolbox.mutate(mutant)
                    del mutant.fitness.values
    
            # Evaluate the individuals with an invalid fitness
            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
    
            # The population is entirely replaced by the offspring
            pop[:] = offspring
    
        print("-- End of (successful) evolution --")
    
        best_ind = tools.selBest(pop, 1)[0]
    
        return best_ind, best_ind.fitness.values  # return the result:Last individual,The Return of Evaluate function
    

    要注意的地方就是,官网中给出的Overview代码中有一行代码是错误的,需要把一个数据类型(map)转换为list.

    输出结果

      Evaluated 50 individuals
    -- Iterative 40 times --
    -- Generation 0 --
    -- Generation 10 --
    -- Generation 20 --
    -- Generation 30 --
    -- End of (successful) evolution --
    best_ind [-2.402824207878805, -1.5920248739487302, -4.397332290574777, -0.7564815676249151, -3.3478264358788814, -5.900475519316307, -7.739284213710048, -4.469259215914226, 0.35793917907272843, -2.8594709616875256]
    best_ind.fitness.values (-33.10704010746149,)
    • best_ind : 最佳个体
    • best_ind.fitness.values : 最佳个体在经过evaluate之后的输出
    #!usr/bin/env python
    # -*- coding:utf-8 _*-
    """
    @author:fonttian 
    @file: Overview.py
    @time: 2017/10/15 
    """
    
    # Types
    from deap import base, creator
    
    creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
    # weights 1.0, 求最大值,-1.0 求最小值
    # (1.0,-1.0,)求第一个参数的最大值,求第二个参数的最小值
    creator.create("Individual", list, fitness=creator.FitnessMin)
    
    # Initialization
    import random
    from deap import tools
    
    IND_SIZE = 10  # 种群数
    
    toolbox = base.Toolbox()
    toolbox.register("attribute", random.random)
    # 调用randon.random为每一个基因编码编码创建 随机初始值 也就是范围[0,1]
    toolbox.register("individual", tools.initRepeat, creator.Individual,
                     toolbox.attribute, n=IND_SIZE)
    toolbox.register("population", tools.initRepeat, list, toolbox.individual)
    
    
    # Operators
    # difine evaluate function
    # Note that a comma is a must
    def evaluate(individual):
        return sum(individual),
    
    
    # use tools in deap to creat our application
    toolbox.register("mate", tools.cxTwoPoint) # mate:交叉
    toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1) # mutate : 变异
    toolbox.register("select", tools.selTournament, tournsize=3) # select : 选择保留的最佳个体
    toolbox.register("evaluate", evaluate)  # commit our evaluate
    
    
    # Algorithms
    def main():
        # create an initial population of 300 individuals (where
        # each individual is a list of integers)
        pop = toolbox.population(n=50)
        CXPB, MUTPB, NGEN = 0.5, 0.2, 40
    
        '''
        # CXPB  is the probability with which two individuals
        #       are crossed
        #
        # MUTPB is the probability for mutating an individual
        #
        # NGEN  is the number of generations for which the
        #       evolution runs
        '''
    
        # Evaluate the entire population
        fitnesses = map(toolbox.evaluate, pop)
        for ind, fit in zip(pop, fitnesses):
            ind.fitness.values = fit
    
        print("  Evaluated %i individuals" % len(pop))  # 这时候,pop的长度还是300呢
        print("-- Iterative %i times --" % NGEN)
    
        for g in range(NGEN):
            if g % 10 == 0:
                print("-- Generation %i --" % g)
            # Select the next generation individuals
            offspring = toolbox.select(pop, len(pop))
            # Clone the selected individuals
            offspring = list(map(toolbox.clone, offspring))
            # Change map to list,The documentation on the official website is wrong
    
            # Apply crossover and mutation on the offspring
            for child1, child2 in zip(offspring[::2], offspring[1::2]):
                if random.random() < CXPB:
                    toolbox.mate(child1, child2)
                    del child1.fitness.values
                    del child2.fitness.values
    
            for mutant in offspring:
                if random.random() < MUTPB:
                    toolbox.mutate(mutant)
                    del mutant.fitness.values
    
            # Evaluate the individuals with an invalid fitness
            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
    
            # The population is entirely replaced by the offspring
            pop[:] = offspring
    
        print("-- End of (successful) evolution --")
    
        best_ind = tools.selBest(pop, 1)[0]
    
        return best_ind, best_ind.fitness.values  # return the result:Last individual,The Return of Evaluate function
    
    
    if __name__ == "__main__":
        # t1 = time.clock()
        best_ind, best_ind.fitness.values = main()
        # print(pop, best_ind, best_ind.fitness.values)
        # print("pop",pop)
        print("best_ind",best_ind)
        print("best_ind.fitness.values",best_ind.fitness.values)
    
        # t2 = time.clock()
    
        # print(t2-t1)
    
  • 相关阅读:
    考试 题目
    引用数据类型 Scanner和 Random
    数组
    数据字典 事物 序列 索引视图
    小程序下拉刷新
    使用e.target.dataset的问题
    动态统计当前输入内容的字节、字符数
    小程序根据input输入,动态设置按钮的样式
    小程序刨坑(一)
    charles 踩坑记录
  • 原文地址:https://www.cnblogs.com/fonttian/p/8480729.html
Copyright © 2020-2023  润新知