遗传算法

此节介绍最著名的遗传算法(GA)。遗传算法属于进化算法,基本思想是取自“物竞天泽、适者生存”的进化法则。简单来说,遗传算法就是将问题编码成为染色体,然后经过不断选择、交叉、变异等操作来更新染色体的编码并进行迭代,每次迭代保留上一代好的染色体,丢弃差的染色体,最终达到满足目标的最终染色体。整个流程由下图构成(手写,见谅 -_-!!)

流程图

步骤由以下几步构成:

编码(coding)——首先初始化及编码。在此步,根据问题或者目标函数(objective function)构成解数据(solutions),在遗传算法中,该解数据就被称为染色体(chromosome)。值得一提的是,遗传算法为多解(population based)算法,所以会有多条染色体。初始化中会随机生成N条染色体,, 这里表示染色体包含了n条。其中 ,这里表示第i条染色体由d维数值构成。GA会以这个N个数据作为初始点开始进行进化。

评估适应度(evaluate fitness)——这一步用染色体来进行目标函数运算,染色体的好坏将被指明。

选择(selection)——从当前染色体中挑选出优良的个体,以一定概率使他们成为父代进行交叉或者变异操作,他们的优秀基因后代得到保留。物竞天择这里得以体现。

交叉(crossover)——父代的两个两个染色体,通过互换染色体构成新的染色体。例如下图,父亲母亲各提供两个基因给我。这样我既保留了父母的基于,同时又有自己的特性。

交叉

变异(mutation)——以一定概率使基因发生突变。该算子一般以较低概率发生。如下图所示:

变异

下面我们将一步一步为各位呈现如何用matlab编写一个简单的GA算法。

本问题为实数最小化minimization问题。我们需要在解空间内找到最小值或近似最小值,此处我们使用sphere函数作为目标函数(读者可以自行修改为其他的目标函数)。

sphere function

  • 初始化:在这一步中,我们将在给定问题空间内生成随机解,代码如下:
% %% 初始化% % 输入:chromes_size,dim维数,lb下界,ub上界% % 输出:chromes新种群function chromes=init_chromes(chromes_size,dim,lb,ub) % 上下界中随机生成染色体 chromes = rand(chromes_size,dim)*(ub-lb)+lb;end
  • 选择:选择是从当前代中挑选优秀的染色体保留以繁殖下一代。我们这里采取的方法是俄罗斯轮盘选择方式。谁的解优,谁获得选中的概率越高。首先,我们需要先求出各染色体的fitness倒数。
  • ,然后求出各染色体的比重,比重越大,被保留机会越大。。代码如下:
%% 选择%俄罗斯轮盘赌function [newchromes,newfitness] = selection(chromes,fitness) weights = 1./fitness; % fitness倒数 totalfit=sum(weights); % 累加所有weights totalf = weights./totalfit; %求出各染色体比重 index = []; for i = 1:size(chromes,1) % 循环选出较优染色体 pick = rand; while pick == 0 pick = rand; end for j = 1:size(chromes,1) pick = pick - totalf(j); if pick<0 index = [index j]; break end end end newchromes =chromes(index,:); newfitness = fitness(index);end
  • 交叉:此步会随机选取两个选择过后的染色体作为父代,从两个染色体中各截取一部分基因生成新的染色体,代码如下:
%% 交叉function newchromes = crossover(chromes,pc) % 生成一个新的解 newchromes = ones(size(chromes)); for i = 1:size(chromes,1) % 随机选取两个染色体 parents=randperm(10,2); %随机选取一个位置 pos = round(rand*size(chromes,2)); if(rand

变异:以一各小概率生成随机变异一个gene,代码如下:

% 变异function newchromes= muatation(chromes,pm,lb,ub) for i = 1:size(chromes,1) newchromes(i,:) = chromes(i,:); if (rand

主函数,首先初始化各参数,然后进行迭代,当满足终止条件停止:

% 清除workspace,清屏clearclc % 染色体数量chromes_size = 20;% 问题维数dim = 10;% 交叉概率pc =0.9;% 变异概率pm = 0.2;% 问题上下边界lb = -1;ub = 1;% 循环次数maxiter = 1000;% 目标方程namefunc= 'objfun';fd = str2func(namefunc);​% 初始化chromes = init_chromes(chromes_size,dim,lb,ub);% 求个染色体fitness for i = 1:chromes_size fitness(i)=feval(fd,chromes(i,:)); end% 求出最优解 [bestfitness bestindex]=min(fitness); bestchrome = chromes(bestindex,:); % 主循环for iter=1:maxiter % 选择 [chromes,newfitness] = selection(chromes,fitness); % 交叉 chromes= crossover(chromes,pc); % 变异 chromes= muatation(chromes,pm,lb,ub); % 更新最优 for i = 1:chromes_size fitness(i)=feval(fd,chromes(i,:)); if fitness(i)

运行之后生成一个fitness下降曲线,如下图:

适应度下降曲线

遗传算法大大提升了寻优问题的通用性,因为遗传算法属于stochastic algorithm,不再是Deterministic algorithm(如果各位对此感兴趣,请留言,我可进一步讲解)。

但是有些显著缺陷还是明显影响该算法效率,主要问题如下:

premature,过早收敛,极易陷入局部最优解初始点对算法结果影响巨大,初始点好的解效果好,反之亦然。

下一节,将介绍群智能算法的代表之作——粒子群寻优算法。

如有任何疑问请留言,欢迎评论交流,创作不易,请勿抄袭,请收藏,关注,转发~

遗传算法matlab_三分钟学会遗传算法相关推荐

  1. 三分钟学会css3中的flexbox布局

    2019独角兽企业重金招聘Python工程师标准>>> 这篇文章里我们将学习CSS里flexbox布局的几个最重要的概念,通过学习flexbox布局,你会发现以往遇到的所有的关于布局 ...

  2. Juniper 210 密码清不掉_三分钟学会如何找回mysql密码

    一.在测试工作中我们肯定会写一些sq查询语句方便我们验证数据是否正确,从而判断当前软件是否存在缺陷,但是查询的过程中肯定需要我们先连接数据库,如果数据库密码忘记我们就无法完成工作,这里就教会大家如何快 ...

  3. 三分钟学会PS小清新调色教程-萧蕊冰

    今天的PS小教程教你三分钟学会PS小清新调色教程.夏天到了,夏天的阳光很大,拍出的照片都会有一种暖色的感觉,那么我们怎么把一张照片调成日式小清新呢?今天我们就来学一个PS小清新调色教程,让你体验一下日 ...

  4. 遗传算法(三)——基本遗传算法

    目录 2.基本遗传算法 2.1基本遗传算法描述 2.1.1基本遗传算法的构成要素 2.1.2基本遗传算法描述 2.1.3基本遗传算法的形式化定义 2.2基本遗传算法的实现 2.2.1个体适应度评价 2 ...

  5. WORD如何设置打印? 三分钟学会WORD打印技巧

    我们在办公的时候,很多人时常会需要打印各种各样的文件,很多人都只知道,去打印当前页,或者是整个文档,但在Word打印中也有很多不同的技巧,那么Word如何设置打印?今天呢就来给大家分享一下Word打印 ...

  6. 【ROM制作工具】如何三分钟学会制作手机线刷包?一键制作线刷包详细教程

    如何在最短的时间内制作一款手机线刷包让卡顿的手机线刷回官方?线刷回官方的手机刷机包在制作时有什么样的技巧?接下来将和大家分享一下如何在三分钟制作一款手机线刷包! 一键制作线刷包详细教程 准备工作: 首 ...

  7. 强连接运营社张强:三分钟学会社群运营,从这三个方面、六个引流涨粉技巧出发

    在你构建好社群以后,首先要考虑的事情就是如何运营社群 社群运营可以总结为一句话:一个载体,两个动力,三个方面 . 1.运营载体: 物超所值的产品或服务,一个社群应该是有温度的圈子,别人为啥在这社群?取 ...

  8. 三分钟学会基础k线图知识

    学习K线可以说是每位贵金属投资者的必经阶段,而学习质量的好坏直接决定投资者的看盘和技术分析基础的打得牢不牢固.而本文将有系统地为大家介绍K线的基础知识. 一.K线的定义 K线是记录一段时间内价格变化情 ...

  9. 三分钟学会给任何电脑完整重装系统!新手必看!以win10为例

    小白们,不论你电脑是什么型号,状态如何,都可以按照以下流程操作,简单易上手. 由于本人电脑(联想拯救者)从刚开始使用就经常莫名其妙重启,斟酌之后选择重装系统.学习到实践成功,为时半天.在此和大家分享一 ...

  10. 三分钟学会用SpringMVC搭建最小系统(超详细)_转载

    前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...

最新文章

  1. 多台计算机怎样才能同时使用互联网,如何实现一台路由器多台计算机同时上网...
  2. python对话框机制_Chromium 新的弹窗机制以及 HTML 的 dialog 元素
  3. MySQL5.6 yum安装
  4. MYSQL 如果把数据文件保存到其他磁盘里
  5. JS基础_使用工厂方法创建对象(了解下就行了,用的不多)
  6. HTML5 Audio标签API整理(三)
  7. vs2008 MFC类继承结构
  8. 从零开始的数模学习(5):TOPSIS法(评价类模型)
  9. android视频播放的代码
  10. html相册 自动,ACDSee的HTML相册生成
  11. LFS-初入门第一篇(准备环境)
  12. 阅读笔记04——魔鬼搭讪学
  13. Silverlight实用窍门系列:29.Silverlight碰撞测试、检测自定义控件碰撞,雷达扫描图之扫描雷达点状态【附带源码实例】...
  14. 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(10)——天下没有免费午餐定理(No Free Lunch Theorem)
  15. Mendix基于腾讯云部署最佳实践
  16. 社交媒体中有哪些有趣的数据?能挖掘出哪些价值?
  17. Qiime2 软件安装
  18. javascript中 $和#符号的意思
  19. 微观经济学第六周作业(需求函数,收入效应与替代效应)
  20. tps5430应用电路详解_TPS5430的应用(1)

热门文章

  1. Javascript特效代码大全(420个)
  2. IGBT芯片赛道竞争激烈,水光半导体Wassersun推出全新IGBT制程技术
  3. FusionChartsFree的JSP标签开发
  4. clearcase、Git之我见
  5. 智能汽车“增量部件”争夺战(一):以华为海思为样榜,比亚迪蔚来们的漫漫造芯路
  6. KindEditor上传图片及使用
  7. 复制错误:安装程序无法复制文件 Atapi.sys
  8. OpenV2X 开源社区成立,填补 5G 路侧开放基础架构(RSOI)空白
  9. wifi上行下行速度测试_测试网速_测试网速wifi在线测试
  10. 计算机测试性评估,计算机CPU性能评估软件PCMark