zoukankan      html  css  js  c++  java
  • 遗传算法-选择算子

    选择算子很多,本文先做个简单汇总,等应用时再自行研究 

    轮盘赌选择(roulette wheel selection)

    锦标赛选择(tournament selection)

    随机遍历抽样(stochastic universal selection)

    局部选择(local selection)

    截断选择(truncation selection)

    轮盘赌选择

    个体适应度越高,被选择的概率越大;    【没特点】

    在该策略下,

    最优个体不一定被遗传到下一代,但这不是缺点,因为这同时避免了超级个体的影响;

    最差个体可能被遗传到下一代,这个不提倡,但也不是说不可以,说不定最差个体交叉变异后很牛逼;

    锦标赛选择

    每次随机选择若干个体,挑选适应度最好的保留下来,迭代 N 次生成新种群;   【特点是最差个体一定被淘汰】 

    在该策略下,最差个体一定会被淘汰;最优个体不一定保留

    随机竞争选择

    每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止  【特点是最差个体一定被淘汰】

    精英保留策略

    依某种策略生成新种群后,用当代最优个体随机替换新种群的某个体,或者直接替换最差个体;  【特点是最优个体一定被保留】

    示例代码

    import random
    import numpy as np
    
    
    class GeneticAlgorithm(object):
        def __init__(self):
            pass
    
        def select_lunpandu(self, fitness, pop_size):
            '''
            选择算子:轮盘赌选择
            '''
            new_pop_index = np.random.choice(range(pop_size), size=pop_size, replace=True, p=fitness / fitness.sum())
            return new_pop_index
    
        def select_jingying(self, fitness, pop_size):
            '''
            选择算子:精英保留策略
            '''
            ### 首先按轮盘赌选择
            new_pop_index = np.random.choice(range(pop_size), size=pop_size, replace=True, p=fitness / fitness.sum())
            print('temp', new_pop_index)
            new_fitness = fitness[new_pop_index]    # 新种群
            max_fit_index = np.argmax(fitness)      # 当代最优个体
            min_fit_index = np.argmin(new_fitness)  # 新种群中最差个体
            new_pop_index[min_fit_index] = max_fit_index    # 替换
            return new_pop_index
    
    
    if __name__ == '__main__':
        ##### test GeneticAlgorithm
        ga = GeneticAlgorithm()
    
        ### test select_lunpandu
        fitness = np.array([1, 3, 8, 4])
        print(ga.select_lunpandu(fitness, 4))
    
        ### test select_jingying
        fitness = np.array([1, 3, 5, 4])
        print(ga.select_jingying(fitness, 4))

    其他

    • 无回放随机选择(也叫期望值选择Excepted Value Selection):根据每个个体在下一代群体中的生存期望来进行随机选择运算。方法如下:

      (1) 计算群体中每个个体在下一代群体中的生存期望数目N。

      (2) 若某一个体被选中参与交叉运算,则它在下一代中的生存期望数目减去0.5,若某一个体未 被选中参与交叉运算,则它在下一代中的生存期望数目减去1.0。

      (3) 随着选择过程的进行,若某一个体的生存期望数目小于0时,则该个体就不再有机会被选中。

    • 确定式选择:按照一种确定的方式来进行选择操作。具体操作过程如下:

      (1) 计算群体中各个个体在下一代群体中的期望生存数目N。

      (2) 用N的整数部分确定各个对应个体在下一代群体中的生存数目。

      (3) 用N的小数部分对个体进行降序排列,顺序取前M个个体加入到下一代群体中。至此可完全确定出下一代群体中M个个体。

    • 无回放余数随机选择:可确保适应度比平均适应度大的一些个体能够被遗传到下一代群体中,因而选择误差比较小。

    • 均匀排序:对群体中的所有个体按期适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。

    • 随机联赛选择:每次选取几个个体中适应度最高的一个个体遗传到下一代群体中。

    • 排挤选择:新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性

    参考资料:

    https://zhuanlan.zhihu.com/p/29474851  遗传算法中几种不同选择算子

    https://www.jianshu.com/p/ae5157c26af9

  • 相关阅读:
    Nginx调优
    Nginx的压缩配置
    【进阶 6-1 期】JavaScript 高阶函数浅析
    个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能
    Java程序猿跳槽应该学哪些方面的技术!
    xamarin学习之路 例一、嵌入网页
    xamarin学习之路 一、vs2015 环境搭建
    xamarin 学习异常问题解决方法
    js 替换字符串 replace函数运用
    76Byte让你的JQuery更快
  • 原文地址:https://www.cnblogs.com/yanshw/p/14547226.html
Copyright © 2011-2022 走看看