打卡Day12

@浙大疏锦行

知识点:

遗传算法:

  • 来源于自然界中的生物进化和基因遗传思想:模拟生物进化过程,通过 “选择(保留优秀解)、交叉(组合解的特征)、变异(引入新特征)” 迭代优化
  • 我想培养出一只超级泰迪犬?该怎么办呢?
  • 首先,我有一群泰迪犬,但是小泰迪们的各种基因不同,形态各色,我只想要一只高大、卷毛和聪明的泰迪。(这是初始解的集合,也是案例学习代码中,我们所设定的随机森林中的一堆的参数范围)
  • 接着,我开始挑选符合上述特征的泰迪,让他们进行交配,其它作绝育处理,来饲养。符合我理想的泰迪活了下来,能交配。(这群没被绝育的泰迪,适应度很高,符和我们的理想。也就是案例代码中,准确率高的参数组合)
  • 接着,这些泰迪开始交配,生出小泰迪们。(基因会交叉)父代的基因交叉
  • 为了避免泰迪们的基因出问题,比如近狗交配,我会时不时引入新的泰迪犬进入种群。(按照一定的比例产生新的基因,变异产生新的基因特征,也就是改变参数组合中的一部分)
  • 接着,重复上述过程,整个种群的特征都是我想要的了,得到了最优解。
  • 代码
  • #遗传算法借鉴于生物遗传,那么我也写个选择最优泰迪基因的算法。
    #本人作为爱狗人士希望培育出自己理想的犬种:泰迪“熊”犬!体型庞大的泰迪:
    import numpy as np
    teddy_genes=np.random.uniform(low=1, high=10, size=(100, 4)).round(2)
    teddy_population = [
        {
            "size": row[0],
            "curly_fur": row[1],
            "smart": row[2],
            "life_length": row[3]
        }
        for row in teddy_genes
    ]
    #我有了一百只泰迪
    #定义好泰迪评估函数
    def good_teddy(individual):
        size,curly_fur,smart,life_length=individual
        fitness=0.4*size+0.3*curly_fur+0.3*smart-0.2*life_length
        return fitness,
    
    #泰迪有四个特征
    from deap import base, creator, tools, algorithms # DEAP是一个用于遗传算法和进化计算的Python库
    import random
    size_range = (1, 10)
    curly_fur_range = (1, 10)
    smart_range = (1, 10)
    life_length_range = (1, 10)
    creator.create("FitnessMax", base.Fitness, weights=(1.0,))
    creator.create("Individual", list, fitness=creator.FitnessMax)
    toolbox = base.Toolbox()
    #设置基因生成函数,从泰迪基因中随机抽取
    toolbox.register("attr_size", random.randint, *size_range)
    toolbox.register("attr_curly_fur", random.randint, *curly_fur_range)
    toolbox.register("attr_smart", random.randint, *smart_range)
    toolbox.register("attr_life_length", random.randint, *life_length_range)
    #生成泰迪个体:存放四个基因在容器中
    toolbox.register("individual", tools.initCycle, creator.Individual,
                     (toolbox.attr_size, toolbox.attr_curly_fur,
                      toolbox.attr_smart, toolbox.attr_life_length), n=1)  
    toolbox.register("population", tools.initRepeat, list, toolbox.individual)
    #注册一下函数评估器
    toolbox.register("evaluate", good_teddy)
    #遗传注册
    toolbox.register("mate", tools.cxTwoPoint)
    toolbox.register("mutate", tools.mutUniformInt, low=[size_range[0], curly_fur_range[0],
                                                         smart_range[0], life_length_range[0]],
                     up=[size_range[1], curly_fur_range[1],
                      smart_range[1], life_length_range[1]], indpb=0.1)
    #锦标赛选取最好的值
    toolbox.register("select", tools.selTournament, tournsize=3)
    NGEN = 50  # 迭代代数
    POP_SIZE = 100  # 种群大小
    CXPB = 0.7  # 交叉概率
    MUTPB = 0.3  # 变异概率
    pop = toolbox.population(n=POP_SIZE)
    for gen in range(NGEN):
        offspring = algorithms.varAnd(pop, toolbox, cxpb=CXPB, mutpb=MUTPB)
        fits = toolbox.map(toolbox.evaluate, offspring)
        for fit, ind in zip(fits, offspring):
            ind.fitness.values = fit
        pop = toolbox.select(offspring, k=len(pop))
        best_ind = tools.selBest(pop, k=1)[0]
        best_size, best_curly_fur, best_smart, best_life_length = best_ind
        print(f"第{gen}代最优解:{best_ind},适应度值:{best_ind.fitness.values[0]}")
    
    

    打卡Day12_第1张图片

你可能感兴趣的:(python学习打卡,python,机器学习)