遗传算法(白话文版)

遗传算法是一种基于生物进化理论的全局优化方法。通过模拟自然选择和遗传过程,逐步优化解决方案,寻找问题的极值点。文章详细介绍了算法的基本思想、实现过程,包括随机生成初始种群、选择、交叉和变异等步骤,并提供了代码实例,展示了遗传算法在寻找最优解方面的有效性。
摘要由CSDN通过智能技术生成

遗传算法是一种全局最优化算法,其很好地借鉴了自然界中生物进化的规律,通过模拟这种优胜劣汰的规律以寻找极值点。本文将从其原理,实现过程以及可行性的角度通俗地解剖这种算法!


一、算法基本思想

       遗传算法是进化算法中的一种,初见其字面其实就可以大致推知出其的思想了。遗传算法就是建立在达尔文的生物进化论基础上的,通过模拟自然界不断筛选适应度比较好的个体,并通过使它们发生交叉(生物学中的专用名词,简单地理解就是生儿育女),变异,产生的新的个体会组成新的种群,继续进行新的一轮进化,最终留下的个体都有很高的适应度,这些个体中往往包含我们需要寻找的极值点。
       太抽象不理解?没关系,笔者还为你准备了精美的演示图片:
 

  1. 很久之前,有一群快乐小猪生活在山区里,它们生活的位置都是不同的。
  1. 然而,有一天突然从山脚下升起了一股毒烟,并慢慢向山上蔓延,此时,一些生活在低海拔的小猪就被毒死了,而生活在较高海拔的小猪侥幸活了下来,但它们知道毒烟不断向上蔓延,所以它们会向高处迁居。
  1. 迁居的过程是漫长的,在这个过程中,有些小猪会相爱?,并生下后代,然后,它们自身就会死去,它们的子孙从它们父母已达到的高度继续向上迁居。这样,一代又一代,有一天,这些小猪发现自己达到了最高点附近,此时,毒烟渐渐散去,小猪们在最高点继续快乐地生活下去。

以上就是遗传算法的基本思想了。

 


二、实现过程

       接下来,我们根据上面的图片讲解遗传算法怎么实现。
       首先,我们注意,小猪的初始生活点是随机的,也就是,有的小猪生活的海拔高,有的就比较低,对应到算法中就是,算法开始,我们会随机生成一组点(当然这些点需要在可行域内)。
       然后,毒气的出现,使得一些海拔低的小猪被毒死了,而海拔高的小猪活了下来,对应到算法就是选择(Selection)的过程(有?轮盘赌算法?和锦标赛算法),在这个过程中,我们会把适应度高的点保留下来,而遗弃适应度低的点(所谓适应度可以通俗地理解为这个点对应的函数值的大小)。
       接着,活下来的小猪会生育后代,其后代会在父母已达到的高度继续向上迁居,对应算法的过程是交叉(Crossover)过程,这个过程中,我们随机抽取几对点,每对点会进行类似“中和”的操作,适应度高的点和适应度低的点“中和”生成平均适应度更高的点。这个地方我们通过一个具体的例子来进行理解:我们假设抽取的一个点的坐标为(1,1),其适应度为8,而另一个点的坐标为(2,2),适应度为2,此时,这对点的平均适应度为5,接着,我们随机生成一个随机数a(0~1之间),然后,a(1,1)+(1-a)(2,2)和(1-a)(1,1)+a(2,2)这两个点(也就是(1,1)和(2,2)连线上的两点)就是之前两个点“中和”的结果,我们会发现这两个新生成的点平均适应度往往更好,最后我们用新生成的点来取代原先的两个点。当然,交叉的操作的实现方式有很多种,上面的只是其中一种实现方式。
       然而,我们知道,生物在进化过程中可能会发生变异(上面的漫画中未体现),变异后的个体适应度可能更好,当然也可能更差,所以我们会回到选择的过程,将适应度好的保留下来,将差的剔除掉,接着继续交叉,变异,这样就开始了新的一轮循环。当迭代到一定次数时,这些点渐渐都来到了最高点附近。在上面的迭代过程中,我们会记录下适应度最好的那个体,如果,新的迭代中产生更好的个体,则将该个体记录为最好的,算法结束后,我们返回这个适应度最好的个体即可。

 


三、可行性评估

       遗传算法既然流传了几十年,解决了很多问题,从实践角度看,其肯定是可行的,在接下来的程序运行中我们也会看到。我们还需要从理论角度评估其可行性。
       首先,选择过程中,我们默认采用了?轮盘赌算法?,这个算法可以使得适应度高的个体有更大的概率保留下来,而适应度低的个体保留下来的概率则小,当然,也有可能,适应度低的个体保留下了而抛弃了适应度高的,但从概率角度看,随着测试次数的增加,往往适应度高的个体能被保留下来。
       我们再来看交叉的过程,这个过程中,当有一对个体发生交叉时,则产生的后代的适应度是居于其父母的适应度的之间的,这样看起来把适应度高的个体“拖累”了,但这样的结果是产生的后代的平均适应度往往增大了,也就是种群的平均水平提高了。
       上面讲到交叉操作使得种群的平均适应度提高了而“拖累”了适应度高的点,这样不就实现不了找最高的目标了呀。所以,我们还需要变异操作,使其中一些点发生“变异”,变异的点可能适应度更高,在下一轮的选择过程中,这些适应度高的点更有可能保留下来,组成新的种群,整个过程下来,整个种群的平均适应度基本上一直在提高(除非都到了最高点附近),而变异这种碰运气的操作使得我们可能瞎猫拖到一个最高点。
       可以说,整个遗传算法的各个阶段都是碰运气的过程,但碰到适应度高的点的可能性大,所以,在多次迭代和多次测试中,这些点往往能收敛于最高点。

 


四、具体代码

激动人心的时候来了,有了上述基础后,我们就可以阅读具体代码了(这段代码笔者在anaconda3中多次测试通过,但并不保证代码完全正确,如果你发现问题的话,可以在评论中留言,谢谢)。

# -*- coding: utf-8 -*-
"""
If you find bugs,please contact us :sj2050@vip.163.com or
									zzzain46@gmail.com or
									ruanyipu@gmail.com
Thank you! 

@author: SJ2050
"""

import numpy as np
import matplotlib.pyplot as plt

# Solve Chinese garbled problem
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False 

def ga_real(population_size,fit_func,feasible_range,**options):
    """
    input:
        popolation_size = population_size (int)
        fit_func = name of fitness value function (function) 
        feasible_range = feasible restrain region (two dimensional array)
        
        options : is_print(plot,default = True) ,
                max_iter(iteration number,default = 3*population_size),
                p_c(crossover possibility, default = 0.75),
                p_m(mutation_possibility, default = p_c/20)

    return:
        best_value_so_far,
        best_chromosome_so_far,
        search_points,
        upper,
        lower,
        average
    """
    # initialize input
    is_print = options.get('is_print')
    if (is_print==None or is_print!=False):
        is_print = True
        
#    selection = options.get('selection')
#    if (selection==None or type(selection)!=int):
#        selection = 1
    
    max_iter = options.get('max_iter')
    if(max_iter==None or type(max_iter)!= int or max_iter <= 0):
        max_iter = 3*population_size
    
    p_c = options.get('p_c')
    if(p_c==None or type(p_c
  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值