一、遗传算法概述

遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。

二、算法过程

(1)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。

(2)个体评价:计算群体P(t)中各个个体的适应度。

(3)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。

(4)交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。

(5)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。

(6)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。

遗传操作包括以下三个基本遗传算子(genetic operator):选择(selection);交叉(crossover);变异(mutation)。

1、选择

从群体中选择优胜的个体,淘汰劣质个体的操作叫选择。选择算子有时又称为再生算子(reproduction operator)。选择的目的是把优化的个体(或解)直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的,常用的选择算子有以下几种:适应度比例方法、随机遍历抽样法、局部选择法。

2、交叉

在自然界生物进化过程中起核心作用的是生物遗传基因的重组(加上变异)。同样,遗传算法中起核心作用的是遗传操作的交叉算子。所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。通过交叉,遗传算法的搜索能力得以飞跃提高。

3、变异

变异算子的基本内容是对群体中的个体串的某些基因座上的基因值作变动。依据个体编码表示方法的不同,可以有以下的算法:

a)实值变异。

b)二进制变异。

一般来说,变异算子操作的基本步骤如下:

a)对群中所有个体以事先设定的变异概率判断是否进行变异

b)对进行变异的个体随机选择变异位进行变异。

遗传算法引入变异的目的有两个:一是使遗传算法具有局部的随机搜索能力。当遗传算法通过交叉算子已接近最优解邻域时,利用变异算子的这种局部随机搜索能力可以加速向最优解收敛。显然,此种情况下的变异概率应取较小值,否则接近最优解的积木块会因变异而遭到破坏。二是使遗传算法可维持群体多样性,以防止出现未成熟收敛现象。此时收敛概率应取较大值。

4、终止条件

当最优个体的适应度达到给定的阈值,或者最优个体的适应度和群体适应度不再上升时,或者迭代次数达到预设的代数时,算法终止。预设的代数一般设置为100-500代。

三、源码及其分析

1、在Matlab上绘制所求函数的图像,如图3-1所示。

图3-1 绘制函数图像

所求的函数为 y=ⅇ-0.05xsinx,取值范围是-2到2之间。

2、初始化并配置相关参数,如图3-2所示。

图3-2 相关参数配置

NIND是个体数目,表示的初始随机选择的几个数字;MAXGEN表示的是最大的遗传代数,即循环的次数;PRECI表示的是变量的二级制位数;GGAP表示的是代沟;px表示的是交叉概率;pm表示的是变异概率。

需要把初值gen即循坏的开始定义为0,方便后面进行循环,同时要初始化种群,这里只需要调用遗传算法中自带的函数crtbp即可。需要特别注意的是我在这里面把FieldD、Chrom、X、ObjV进行了复制,即用两个相同的参数,这是为了方便后续进行遗传循环的时候分别求最大值最小值做铺垫。

3、遗传循环,具体代码如图3-3所示。

图3-3 遗传循环

这里面的循环主要分为两部分,第一部分是求最小值,第二部分是求最大值。第一部分求最小值代码如图3-4所示。

图3-4 求最小值

同样在循环迭代中,每次循环都需要对一些参数进行重新配置:适应度值、选择、重组、变异、自带个体的十进制转换、计算子代的目标函数、生成新种群。其中选择、重组、变异都是至关重要的三步骤,也是遗传算法中的关键。

求最大值也是同样的道理,具体代码如图3-5所示。

图3-5 求最大值

最小值很最大值的算法中,唯一不同的是在求最大值的时候他会把函数值进行一个求负的操作,同时还多了一个max的函数,在求最小值的时候是min函数。

4、把最小值的点和最大值的点存在数组里,具体代码如图3-6所示。

图3-6 记录最大值和最小值

5、在图像上画出最值的点,并且输出最值的结果,如图3-7,3-8所示。

图3-7 输出最大值和最小值

图3-8 运行结果

四、结果分析

其实在遗传算法中,他就是类似与进化论一样,优胜劣汰,根据你给定的条件,他就会朝着给定的方向走。因为我们给定的是最大值和最小值的条件,那么他就会往最大值和最小值的方向走,但是每一次都是随机的,所以就会取每一代中最大的和最小的再进行下一轮的迭代,因为我们给定的是20次迭代,如果说给的迭代次数越多,那么他的效果就会更加接近真值,就会离正真的最值更近。但是在这个问题中,我们也不用求得那么准确,大概接近就可以达到我们的要求。

五、附录代码

clc
clear all
close all
%% 画出函数图
figure(1);
hold on;
lb=-2;ub=2; %函数自变量范围【-2,2】
ezplot('exp(-0.05*X)*sin(X)',[lb,ub]);   %画出函数曲线
xlabel('自变量/X')
ylabel('函数值/Y')%% 定义遗传算法参数
NIND=40;        %个体数目
MAXGEN=20;      %最大遗传代数
PRECI=20;       %变量的二进制位数
GGAP=0.95;      %代沟
px=0.7;         %交叉概率
pm=0.01;        %变异概率
trace=zeros(2,MAXGEN);                        %寻优结果的初始值
FieldD1=[PRECI;lb;ub;1;0;1;1];                      %区域描述器
Chrom1=crtbp(NIND,PRECI);                      %初始种群
%% 优化
gen=0;                                  %代计数器
X1=bs2rv(Chrom1,FieldD1);                 %计算初始种群的十进制转换
ObjV1=exp(-0.05*X1).*sin(X1);        %计算目标函数值%% 2th
FieldD2=FieldD1;
Chrom2=Chrom1;
X2=X1;
ObjV2=ObjV1;while gen<MAXGEN%% 1thFitnV1=ranking(ObjV1);                               %分配适应度值SelCh1=select('sus',Chrom1,FitnV1,GGAP);              %选择SelCh1=recombin('xovsp',SelCh1,px);                  %重组SelCh1=mut(SelCh1,pm);                               %变异X1=bs2rv(SelCh1,FieldD1);               %子代个体的十进制转换ObjVSel1=exp(-0.05*X1).*sin(X1);             %计算子代的目标函数值[Chrom1,ObjV1]=reins(Chrom1,SelCh1,1,1,ObjV1,ObjVSel1); %重插入子代到父代,得到新种群X1=bs2rv(Chrom1,FieldD1);%% 2thFitnV2=ranking(-ObjV2);                               %分配适应度值SelCh2=select('sus',Chrom2,FitnV2,GGAP);              %选择SelCh2=recombin('xovsp',SelCh2,px);                  %重组SelCh2=mut(SelCh2,pm);                               %变异X2=bs2rv(SelCh2,FieldD2);               %子代个体的十进制转换ObjVSel2=exp(-0.05*X2).*sin(X2);             %计算子代的目标函数值[Chrom2,ObjV2]=reins(Chrom2,SelCh2,1,1,ObjV2,ObjVSel2); %重插入子代到父代,得到新种群X2=bs2rv(Chrom2,FieldD2);gen=gen+1;                                             %代计数器增加%获取每代的最优解及其序号,Y为最优解,I为个体的序号% 1th[Y,I]=min(ObjV1);trace(1,gen)=X1(I);                            %记下每代的mintrace(2,gen)=Y;                               %记下每代的min%% 2th[M,N]=max(ObjV2);trace(3,gen)=X2(N);                            %记下每代的maxtrace(4,gen)=M;                               %记下每代的max
end%% 画最值
plot(trace(1,end),trace(2,end),'bo');                            %画出最后一代的种群
plot(trace(3,end),trace(4,end),'kx');
grid on;
hold off;%% 显示最值
minY=trace(2,end);
minX=trace(1,end);
fprintf(['最小值:\nX_min=',num2str(minX),'\nY_min=',num2str(minY),'\n'])maxY=trace(4,end);
maxX=trace(3,end);
fprintf(['最大值:\nX_max=',num2str(maxX),'\nY_max=',num2str(maxY),'\n'])

遗传算法求函数的最值问题相关推荐

  1. Python实现遗传算法求函数最值

    Python实现遗传算法求函数最值 详细源代码:GA.py 1.算法过程图解 2.详细过程举例说明 (1)待求解方程 (2)确定编码方案 主要是确定编码长度: def segment_length(s ...

  2. python求函数极值_python 遗传算法求函数极值的实现代码

    废话不多说,大家直接看代码吧! """遗传算法实现求函数极大值-Zjh""" import numpy as np import rando ...

  3. 用标准遗传算法求函数最大值

    题:用标准遗传算法求函数f(x)=x+10sin(5x)+7cos(4x)的最大值,其中x的取值范围为[0,10].只是一个有多个局部极值的函数 仿真过程: (1)初始化种群数目NP=50,染色体二进 ...

  4. 基于遗传算法求函数最小值

    一.遗传算法概述 遗传算法( genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的"物竞天择.适者生存"的演化法则.遗传算法是把问题参数编码为染色体 ...

  5. 遗传算法求函数极值(含MATLAB代码实现)

    介绍转载自https://blog.csdn.net/xujinpeng99/article/details/6211597,后面用自己设置的函数进行实验. 引言:遗传算法求函数极值算是遗传算法的一种 ...

  6. 遗传算法求函数最小值(多维)1

     目标函数:  代码: %%实值遗传算法求函数极值%%%% %%%%%初始化参数%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 NP=100; %染色 ...

  7. 遗传算法求函数最小值(多维)2

     目标函数:  代码: function o=func21(x) o=sum(x.^2-10*cos(2*pi.*x)+10); end %%实值遗传算法求函数极值%%%% %%%%%初始化参数%%% ...

  8. 均值定理最大值最小值公式_如何使用均值定理求函数的最值

    如何使用均值定理求函数的最值 河北省武邑县职教中心 [摘 要] 摘要:均值定理是高中数学中重要的内容,在高考中占有很重要的地 位,成为高考的高频考点 . 它们总能在高考的舞台上与其姊妹知识合理.巧妙. ...

  9. 人工智能遗传算法求函数极值

    ** 人工智能遗传算法求函数极值 ** 1.实验目的与原理 1)目的 熟悉和掌握遗传算法的原理.流程和编码策略,并利用遗传求解函数优化问题,理解求解函数极值问题的流程并测试主要参数对结果的影响,掌握遗 ...

最新文章

  1. 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST
  2. 推荐系统笔记: 基于邻居的协同过滤问题 中的降维
  3. 【NLP】Transformer温故知新
  4. jstack 脚本 自动日志_深入理解jstack日志
  5. 合理使用EntityFramework数据验证的异常错误提示信息
  6. VMWARE VICLIENT实现虚拟机独立管理
  7. 认识和学习orchestrator之基本使用篇
  8. ubuntu 卸载NVIDIA 驱动
  9. 云场景实践研究第46期:吉利汽车
  10. Oracle 日历表详解(含节假日)
  11. 方大九钢携手图扑软件:数字孪生智慧钢厂
  12. 纯代码蓝色理想的logo
  13. HTML中的锚点连接
  14. GPU显存占满但利用率却很低
  15. 【OpenStreetMap】任意城市道路数据下载(附带数据解释)
  16. 图 邻接矩阵幂的含义 离散数学定理14.11
  17. 若依分离版整合IJpay实现第三方支付-(微信支付篇_v2)
  18. seo外包公司可以为企业带来什么好处
  19. “顶流”长沙,如何发展MCN?
  20. 皇室战争android换到苹果嘛,皇室战争怎么切换账号 苹果端和安卓端切换账号方法介绍...

热门文章

  1. 优秀的流程图应该是什么样的?如何制作?
  2. mysql获取近7天每天数据_sql 获取最近7天的每日数据
  3. 【学习日志】2022.08.19 计算机图形学、OpenGL、疼迅云游戏引擎面试、GLAD、GLFW、virtual
  4. 常见胸肌问题解答(五):下缘不够清晰
  5. AI算法工程师手册,Google软件开发指南,JAX强化学习环境,全国高校生活质量信息汇总,几篇AI前沿论文 | ShowMeAI资讯日报
  6. 计算机操作系统(一)
  7. C++-练习-105
  8. 互联网女皇2013互联网趋势报告
  9. lstm轴承寿命预测
  10. 海外优秀资讯抢先看2:私有应用云平台Sandstorm之易用性