系列链接

        遗传算法讲解及实例

        差分进化算法讲解及实例

        模拟退火算法讲解及实例

一、定义

简单来说,遗传算法就是将染色体的一些性质如“选择、交叉、变异”用在了求解的过程中,用于求解复杂方程的数值解,求解的效率较传统算法更高一些。

二、算法思想

遗传算法就是对当前的一些解概率性的选择留下,或者发生一些交叉和变异,更新为新的解,然后用一个评价函数用来评价解的好坏。而好坏程度则有决定这些解在下一代解中出现的概率,往复迭代,直到满足终止条件。

基因的选择

我们假设一串数01101代表染色体,每个数字代表一种基因,每一位的0和1代表两种等位基因,所以该染色体数经过选择后依然是01101,也就是生存了下来,遗传给了后一代。

基因的变异

依旧以01101为例,如果第一位发生了变异,则会变为它的等位基因1,变为11101,这就是染色体中的基因突变。

基因的交叉

对于两个染色体11011和01101,这两个染色体的前两位发生了交叉,那么两个染色体将变为01011和11101,这就是基因的交叉。

算法精度

使用一堆二进制的数来代表解,比如用8位二进制的数来代表区间 [0,1] 那么求解精度为1/256≈0.004。

术语

三、算法步骤

初始化

对于一般的计算问题,随机初始化就足够了

适应度计算

实际上就是当前解带入目标函数后的函数值,比如你要求最大值,那么将当前解带入后值越大则说明适应度越好

终止条件

一般是完成了规定的迭代次数

选择操作

一般选用“轮盘赌”,类似抽奖,一个圆中占得扇形面积最大就最容易中奖,因此适用性越高的约容易留下,详细可参见链接

交叉操作

确定一个概率,对每一个有P的概率交叉L*P个基因,其中L表示一个染色体中的基因个数

变异操作

同上,指定一个概率,使一定数量的基因被替换成等位基因

四、练习一下

到目前为止大致思想说完了,还觉得不够清晰?那就以一道题目为例:

        例:求 f(x)=x+10sin(5x)+7cos(4x) 在[0,10]上的最大值

先把图像画出来如上图所示,这显然是个具有多峰的函数,下面我们使用遗传算法来求解一下,先放求解结果,左图是适应度的迭代过程,看得出来每一代的适应度都在提升,右图中红色的点是求解的最优值,很明显求解的结果是很好的,没有陷入局部最优。

下边我贴出代码,代码参考“智能优化算法及其MATLAB实例”

脚本1 —— 画图

%%%%%%%%%f(x)=x+10sin(5x)+7cos(4x)%%%%%%%%%%
clear all;              %清除所有变量
close all;              %清图
clc;                    %清屏
x=0:0.01:10;
y=x+10*sin(5*x)+7*cos(4*x);
plot(x,y)
xlabel('x')
ylabel('f(x)')
title('f(x)=x+10sin(5x)+7cos(4x)')

脚本2 —— 适应度评价函数

%%%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function result=func1(x)
fit= x+10*sin(5*x)+7*cos(4*x);
result=fit;

标本3 —— 遗传算法

%%%%%%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;              %清除所有变量
close all;              %清图
clc;                    %清屏
NP=50;                  %种群数量
L=20;                   %二进制数串长度
Pc=0.8;                 %交叉率
Pm=0.1;                 %变异率
G=100;                  %最大遗传代数
Xs=10;                  %上限
Xx=0;                   %下限
f=randi([0,1],NP,L);        %随机获得初始种群
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:G%%%%%%%%%%%%将二进制解码为定义域范围内十进制%%%%%%%%%%%%%%for i=1:NPU=f(i,:);m=0;for j=1:Lm=U(j)*2^(j-1)+m;endx(i)=Xx+m*(Xs-Xx)/(2^L-1);Fit(i)= func1(x(i));endmaxFit=max(Fit);           %最大值minFit=min(Fit);           %最小值rr=find(Fit==maxFit);fBest=f(rr(1,1),:);        %历代最优个体   xBest=x(rr(1,1));Fit=(Fit-minFit)/(maxFit-minFit);  %归一化适应度值%%%%%%%%%%%%%%%%%%基于轮盘赌的复制操作%%%%%%%%%%%%%%%%%%%sum_Fit=sum(Fit);fitvalue=Fit./sum_Fit;fitvalue=cumsum(fitvalue);ms=sort(rand(NP,1));fiti=1;newi=1;while newi<=NPif (ms(newi))<fitvalue(fiti)nf(newi,:)=f(fiti,:);newi=newi+1;elsefiti=fiti+1;endend   %%%%%%%%%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%%%%%%for i=1:2:NPp=rand;if p<Pcq=randi([0,1],1,L);for j=1:Lif q(j)==1;temp=nf(i+1,j);nf(i+1,j)=nf(i,j);nf(i,j)=temp;endendendend%%%%%%%%%%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%%%%%%%%%%%%i=1;while i<=round(NP*Pm)h=randi([1,NP],1,1);      %随机选取一个需要变异的染色体for j=1:round(L*Pm)         g=randi([1,L],1,1);   %随机需要变异的基因数nf(h,g)=~nf(h,g);endi=i+1;endf=nf;f(1,:)=fBest;                   %保留最优个体在新种群中trace(k)=maxFit;                %历代最优适应度
end
xBest;                              %最优个体
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')

:感觉代码还是通俗易懂的,我在参考代码上加了点注释,修改了几个过时函数

遗传算法——通俗讲解,轻松掌握相关推荐

  1. vue标准时间改为时间戳_区块链科普005:什么是时间戳?白话通俗讲解时间戳是什么意思?...

    原标题:区块链科普005:什么是时间戳?白话通俗讲解时间戳是什么意思? 八宝饭区块链:什么是时间戳 时间戳是什么?可能很多人都没有听过,但是作为办公一族应该掌握这个技能.时间戳技术就是数字签名技术一种 ...

  2. 人工智能算法通俗讲解系列(二):逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 今天,我们介绍的机器学习算法叫逻辑回归.它英语名称是Logistic Regression,简称LR. 跟之前一样,介绍这个算 ...

  3. Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解

        Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...

  4. 冲突域、广播域的通俗讲解

    冲突域.广播域的通俗讲解 1.冲突域(物理分段)         连接在同一导线上的所有工作站的集合,或者说是同一物理网段上所有节点的集合或以太网上竞争同一带宽的节点集合.这个域代表了冲突在其中发生并 ...

  5. 通俗讲解:图像傅里叶变换

    转自某乎:通俗讲解:图像傅里叶变换 - 知乎 这里我们主要要讲的是二维图像傅里叶变换,但是我们首先来看一张很厉害的一维傅里叶变换动图. 妈耶~厉害哇!它把时域和频域解释的很清楚! 什么!你看不懂! 简 ...

  6. 关于CSS浮动(float,clear)的通俗讲解(经验分享)

    很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多 ...

  7. 二维小波变换_小波变换完美通俗讲解系列之 (一)

    声明:该篇文章转自csdn,原始博主已经找不到了,在这里给出转载博主地址,如有侵权,请私信我删除. https://blog.csdn.net/liusandian/article/details/5 ...

  8. Java多数据源最通俗讲解

    Java多数据源最通俗讲解 before after 理论 实操 编码 小总结 before 项目中可能会用到很多的数据源,例如目前这个项目中用到了五个数据源,那么数据源的 配置和数据源的切换就成为了 ...

  9. 通俗讲解 依概率收敛,大数定理和中心极限定理

    通俗讲解 依概率收敛,大数定理和中心极限定理 依概率收敛 首先说一下结论,依概率收敛是一种基础证明工具,可以类比到高数中的极限定义,将一种直觉上的 "逼近某个数" 用数学公式来定义 ...

最新文章

  1. linux网站权限怎么设置好,linux网站权限设置方法,网站安全配置,linux网站权限...
  2. Erlang中使用变量的简单示例
  3. Citrix Production Features by Edition
  4. html仿苹果浏览器,完美仿iPhone风格主题 领航浏览器体验
  5. Manuscript match— 找到最适合你文章的那个ta(之期刊杂志)
  6. ofo回应发币传闻:从未参与虚拟货币的发行 与GSE Lab合作已终止
  7. hadoop元数据mysql中表字段_Hive元数据表汇总分析
  8. POJ 1149 PIGS(最大流)dinic模板注释
  9. ARM中国上演夺权互撕大战:抢公章、互发声明、董事长兼CEO“被罢免”
  10. 微信绑定的卡服务器,微信亲属卡有什么作用 微信亲属卡怎么绑定
  11. <数据结构> 顺序表
  12. 2019最新java自学路线
  13. JQ设置cookie(3分钟搞定)
  14. java实现md5签名算法
  15. text to image(一):《GENERATING IMAGES FROM CAPTIONS WITH ATTENTION》
  16. 我的AI之路(55)--如何获取kinetics数据集和如何制作自己的kinetics数据集
  17. C语言之#error/#warning
  18. 两个案例带你了解 cookie 和 SSL(开心网 jobbole)
  19. 求最大公约数__gcd(a,b)
  20. Macbook terminal: No application knows how to open问题

热门文章

  1. 拆卡服务器芯片,千元级最新专业卡Quadro FX380详细拆解
  2. 如何消除proteus仿真时的红蓝色点(高低电平显示点)
  3. 2020 年百度之星·程序设计大赛部分题解
  4. 老徐WEB:JS简单实现图片滚动效果轮播图,自动、手动和自适应(二)
  5. input限制上传的文件大小
  6. 共轭梯度法(Conjugate Gradients)(2)
  7. 当图片加载失败时,做处理(onerror)(vue)
  8. SAP S4 MM配置详解之一:全局设置-定义国家/货币汇率/计量单位/工厂日历
  9. 平面设计(印章绘制,海报设计)
  10. c语言kmp算法代码,C语言KMP算法的实现