读研究生的时候上了智能控制的课,课上讲了遗传算法、粒子群算法还有模糊控制等等。我对遗传算法非常感兴趣,2018年的时候用MATLAB复现了遗传算法进化蒙娜丽莎,这也是我知乎头像的来源。

本文就来详细的介绍遗传算法的基本内容,以及如何使用遗传算法绘制“蒙娜丽莎”等让你心仪的图片。

第一节 遗传算法概述

遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。遗传算法是一种借鉴生物界自然选择和自然遗传机制的随机搜索法。它与传统的算法不同,大多数古典的优化算法是基于一个单一的度量函数的梯度或较高次统计,以产生一个确定性的试验解序列;遗传算法不依赖于梯度信息,而是通过模拟自然进化过程来搜索最优解,它利用某种编码技术,作用于称为染色体的数字串,模拟由这些串组成的群体的进化过程。

1.1 遗传算法的基本思想

遗传算法正是依据生物进化中的“适者生存”规律的基本思想设计的,它把问题的求解过程模拟为群体的适者生存过程,通过群体的一代代的不断进化(包括竞争、繁殖和变异等)出现新群体,相当于找出问题的新解,最终收敛到“最适应环境”的个体(解),从而求得问题的最优解或满意解。

遗传算法在求解优化问题时,都是将实际问题的求解空间按一定的编码方式表现出来,即对解空间中的各个解进行编码。所谓解的编码就是把各个解用一定数目的字符串(如“0”和“1”)表示。字符串中的每一位数称为遗传基因,每一个字符串(即一个解的编码)称为一个染色体或个体。个体的集合称为群体。遗传算法的寻优过程就是通过染色体的结合,即通过双亲的基因遗传、变异和交配等,使解的编码发生变化,从而根据“适者生存”的规律,最终找出最优解。表1说明了生物遗传的基本概念在遗传算法中的体现。

1.2 遗传算法与传统方法的比较

1.2.1 遗传算法与启发式算法的比较

启发式算法是通过寻求一种能产生可行解的启发式规则,找到问题的一个最优解或近似最优解。该方法求解问题的效率较高,但是具有唯一性,不具有通用性,对每个所求问题必须找出其规则。但遗传算法采用的是不是确定性规则,而是强调利用概率转换规则来引导搜索过程。

1.2.2 遗传算法与爬山法的比较

爬山法是直接法、梯度法和Hessian法的通称。爬山法首先在最优解可能存在的地方选择一个初始点,然后通过分析目标函数的特性,由初始点移到一个新的点,然后再继续这个过程。爬山法的搜索过程是确定的,容易产生局部最优解;而遗传算法是随机的。

1.2.3 遗传算法与穷举法的比较

穷举法就是对解空间内的所有可行解进行搜索,但是通常的穷举法并不是完全穷举法,即不是对所有解进行尝试,而是有选择地尝试,如动态规划法、限界剪枝法。对于特殊的问题,穷举法有时也表现出很好的性能。但一般情况下,对于完全穷举法,方法简单可行,但求解效率太低;对于动态规划法、限界剪枝法,则鲁棒性不强。相比较而言,遗传算法具有较高的搜索能力和极强的鲁棒性。

经上面的探讨,可以看到遗传算法与传统优化方法在本质上有着不同之处,主要有以下几点:

  1. 遗传算法搜索种群中的点是并行的,而不是单点;
  2. 遗传算法并不需要辅助信息或辅助知识,只需要影响搜索方向的目标函数和相应的适应度;
  3. 遗传算法使用概率变换规则,而不是确定的变换规则;
  4. 遗传算法工作使用编码参数集,而不是自身的参数集(除了在实值个体中使用)。

1.3 遗传算法的计算步骤

图1为利用遗传算法求解工程优化设计问题的流程图,包括以下步骤:

  1. 确定寻优参数,进行编码。编码时先要设置编码长度;
  2. 随机产生一组初始解(即个体)组成初始种群。初始种群中个体的数目称作初始种群的规模;
  3. 计算种群中各个个体的目标函数值及其相应的适应度函数值;
  4. 形成匹配集。根据种群中各个染色体的适应度函数值,采取一定的选择方法,从种群中选出适应值较大的个染色体(其中有些染色体是重复的),称这个染色体的集合即为匹配集。这一过程即为选择操作。
  5. 按某种复制规则进行繁殖。由匹配集中的个染色体繁殖产生个新的染色体,得到一个新的种群。繁殖方法主要有两种:交叉和变异。
  6. 若遗传代数(迭代次数)达到给定的允许值或其它收敛条件已满足时停止遗传,否则返回步骤2。

第二节 程序实现

本程序利用遗传算法,基于matlab软件编写程序,通过100个半透明三角形绘制图像逼近被载入的原始图像。在自然界中,生物个体样貌很大程度上由染色体上的基因决定的。同样,我们把100个半透明三角形组成的东西看作为一个个体,则该个体样貌由组成它的半透明三角形的位置及颜色决定。可以将100个半透明三角形认定为该个体的“基因”。该“基因”通过选择、交叉、变异等遗传过程,逐渐逼近理想中的原始图像。下面具体针对遗传算法的主要过程进行详细阐述,

(1)载入原始图像

在matlab中,图像是以矩阵的形式表述,通过以下程序即可载入原始图像。

[

(2)创建初始种群

种群由7200×total_amount阶矩阵表示,采取二进制形式(其中7200=8×(2×3+3)×100,8位二进制数表示0-255直接的数,每个三角形有三个顶点和一个RGB颜色)。在ASCII表中的48和49分别对应0和1。每个个体的“基因”,即100个三角形的位置色、颜随机。程序如下:

population = char(randi([48,49],7200,total_amount))

(3)计算适应度值

适应度值是度量某个物种对于生存环境的适应程度。对生存环境适应程度较高的物种将获得更多的繁殖机会,而对生存环境适应程度较低的物种,其繁殖机会就会相对较少,甚至逐渐灭绝。由于图片是由像素点构成的,因此需要将原始图像与matlab程序绘制的逼近图像进行逐像素点对比.将两张图片相应位置的像素点值相减求绝对值,再将差值累加就得到了图像之间的总差距。根据matlab中彩色图片的表示特性可知,两张图片的最大差值为255×255×255×3,因此适应度函数为:

适应度值计算程序如下:

error = abs(pic_resize - pic_gene);
Fitness = 1 - sum(error(:))/max_diff;

(4)选择最优子代

本程序对每代循环中适应度最高的2代基因特殊照顾,可不经过选择、交叉、变异直接遗传到下一代循环中。程序如下所示:

[~,outstanding_gene_index] = sort(fitness_array);
outstanding_gene_index = outstanding_gene_index(end-outstanding_gene_amount+1:end);
outstanding_gene = population(:,outstanding_gene_index);

(5)选择

选择指决定以一定的概率从种群中选择若干个体的操作。一般而言,选择的过程是一种基于适应度的优胜劣汰的过程。本程序采用轮盘赌选择法。其基本思想是:各个个体被选中的概率与其适应度大小成正比。计算各个种群的选择概率,并进一步得到累计概率,与在[0,1]区间内产生一个随机数进行对比,若该随机数小于或等于个体的累积概率且大于个体1的累积概率,选择个体进入子代种群。实现程序如下:

fitness_array = fitness_array / sum(fitness_array(:));  %归一化 (选择概率)
accumulation= cumsum(fitness_array);           %累计概率
roulette_number = rand(1,pop_num);
survive_index = discretize(roulette_number ,[0,accumulation]);
new_population = population(:,survive_index);
new_population = [new_population,outstanding_gene];
new_population = new_population(:,randperm(total_amount))

(6)交叉

基因交叉,或者基因重组,就是把两个父体部分结构加以替换,生成新的个体的操作。交叉策略可分为单点交叉、多点交叉、均匀交叉等。其中,单点交叉指在个体编码串中只随机设置一个交叉点,然后在该点相互交换两个配体个体的部分染色体;多点交叉是指在个体基因串中随机设置多个交叉点,然后进行基因块交换。其操作过程与一点交叉和两点交叉相类似;均匀交叉也称一致交叉,其具体运算是通过随机生成一个屏蔽字来决定子代个体如何从父代个体获得基因。这个屏蔽字的长度要与个体基因串长度相同,且均由0,1生成。

交叉(二进制均匀交叉)
crossover_index = rand(7200,1)<cross_position;   %生成屏蔽模板
population_new = new_population;
for m = 1:total_amount/4if rand < cross_rateser=find(crossover_index==0);population_new(ser,m) = new_population(ser,m+total_amount/4);population_new(ser,m+total_amount/4) = new_population(ser,m);end
end
for n = 2*total_amount/4:3*total_amount/4if rand < cross_rateser=find(crossover_index==0);population_new(ser,n) = new_population(ser,n+total_amount/4);population_new(ser,n+total_amount/4) = new_population(ser,n);end
end 

本程序对二进制编码进行均匀交叉。均匀交叉在开始迭代时可以加快新的较优模式的发现,在趋于收敛时可防止收敛于局部极值点,而且具有比经典交叉更好的重组能力。

(6)变异

在基因交叉之后产生的子代个体,其变量可能以很小的概率或者步长发生转变,这个过程称为变异。程序中变异概率为0.001。实现程序如下:

%% 变异
mutation_index = rand(7200,total_amount)<mut_rate;
population = char(uint8(xor(new_population>48,mutation_index))+48); %异或,相同为1相异为0
population = [population(1:7200,outstanding_gene_amount+1:end),outstanding_gene];

第三节 运行结果

第四节 一点小结

  1. 相比单点交叉算法和多点交叉算法,二进制均匀交叉算法在运算效率方面具有明显优势。在实际试验中,采用单点交叉算法达到适应度值为0.90左右需要迭代4500次左右。而采用二进制均匀交叉算法,仅仅迭代550次适应度值即可到达0.90左右。对比发现,采用二进制均匀交叉算法,不仅加快了迭代过程,而且增强了逼近效果,还在趋于收敛时可防止收敛于局部极值点。
  2. 遗传算法中的变异运算是产生新个体的辅助方法,它决定了遗传算法的局部搜索能力,同时保持种群的多样性。交叉运算和变异运算的相互配合,共同完成对搜索空间的全局搜索和局部搜索。变异概率不能太小,这样降低全局搜索能力;也不能太大,这时遗传算法退化为随机搜索。
  3. 遗传算法的全局搜索能力不强,很容易陷入局部最优解跳不出来。需要根据实际情况进一步的改进。

最后的最后,代码内容其实很简单,如果大家点赞收藏或者需要的人比较多,我会整理出来,分享给大家。

分享两本遗传算法相关的书籍:

感谢阅读!

遗传算法matlab_科学与艺术的融合:遗传算法绘制蒙娜丽莎相关推荐

  1. 科学与艺术的融合:遗传算法绘制蒙娜丽莎

    点击上方蓝色字体,关注我们 读研究生的时候上了智能控制的课,课上讲了遗传算法.粒子群算法还有模糊控制等等.我对遗传算法非常感兴趣,用MATLAB复现了遗传算法进化蒙娜丽莎,这也是我公众号头像的来源. ...

  2. 遗传算法matlab_智能算法之Genetic Algorithm遗传算法

    智能算法之Genetic Algorithm遗传算法 前言:本文主要围绕 Matlab 的实现展开,Java版本以及Python版本参考文章最后的源码地址,MatLab和python实现大致相同,Ja ...

  3. 从蒙娜丽莎到战争机器 — 达芬奇大师科学展

    这位16世纪的科学家与艺术家发明创造无数,包括飞行器.潜水装备和武器等等. 即将有一个展览向我们展示这位旷世奇才的一些发明模型.互动装置和设计草图. 有翅膀的飞船 据悉展览将于明年2月10日在伦敦科学 ...

  4. 浅谈科学与艺术交融——艺工交叉

    在课上观看<达芬奇的人生密码>纪录片后,在感慨达芬奇在各方面的卓越成就之余,对科学与艺术的融合也有了更深一步的理解和思考. 科学是什么?<辞海>中提到:"科学是关于自 ...

  5. 项目管理的科学与艺术

    项目管理是科学还是艺术?我想答案是仁者见仁.智者见智.我的观点是:项目管理是科学和艺术的融合.这可能是个讨巧的回答,但没什么不对,科学和艺术本来就是相融的. 为什么项目管理是科学和艺术的融合?简单来说 ...

  6. CCAI 2017 人工智能科学与艺术论坛 | 科学、艺术、女性之间的碰撞

    为了更好地引导和推动中国人工智能技术研究和产业创新,由中国人工智能学会.阿里巴巴集团 & 蚂蚁金服主办,CSDN.中国科学院自动化研究所承办的第三届中国人工智能大会(CCAI 2017)将于 ...

  7. 那个站在科学与艺术路口撸码绘的女同学(二)

    因本学期接触了<互动媒体>这门课程,了解到了"码绘"的神奇,所以总结两篇文章,记录自己码绘路上的辛酸喜乐.<那个站在科学与艺术路口撸码绘的女同学(一)>主要 ...

  8. 管理是科学还是艺术呢?-----行动力

    问你管理是科学呢还是艺术呢?有人说管理是科学,有人说是艺术,这个时候有人说管理既是科学也是艺术.这非常对,但是这个回答最没用.因为如果你是管理实践者,这会让你丧失行动的方向感和解决问题的侧重点.因为如 ...

  9. CSDN推荐好书:《软件开发的科学与艺术》

    <软件开发的科学与艺术>(书号:7-5053-7555-5/TP.4380),电子工业出版社出版,将于2002年4月20日正式发行.定价:38元. 内 容 提 要 本书凝聚了微软专家多年研 ...

最新文章

  1. python gui框架_Python的GUI框架PySide的安装配置教程
  2. SQLServer学习-- SQLServer
  3. ERP_基于Oracle SOA的企业服务总线整合
  4. VTK修炼之道77:交互部件_分割/配准类Widget与其他Widget
  5. msb Lesson00_Object_Class.scala
  6. css优先级计算规则
  7. Python 学习第十六天 html 前端内容总结
  8. spring 构造函数注入_Spring构造函数注入和参数名称
  9. 华为matebook和linux版本区别,华为MateBook14Linux版本开箱评测 | 从来没有让我们失望!...
  10. c语言推箱子源代码及注释,求大神 解析推箱子源代码 要详细
  11. chrome 文本框 获取焦点时 边框色
  12. 从面试官的角度聊聊培训班对程序员的帮助,同时给培训班出身的程序员一些建议
  13. CF 1467 B. Hills And Valleys
  14. Ubuntu16.04配置deeplabv3+的pytorch版本
  15. 小游戏《恶梦》的总结
  16. python人民币小写转大写_Python小程序 -- 人民币小写转大写辅助工具
  17. java游戏spa,【Vue的路由,SPA概念】
  18. [29期] 一个乞丐的故事,什么叫职业人?
  19. WowLua学习笔记
  20. 人脸识别资源大列表(人脸识别检测,关键点检测 看这些就够了)

热门文章

  1. 【安卓逆向】cannot connect to daemon at tcp:5037: cannot connect to 127.0.0.1:5037: 由于目标计算机积极拒绝,无法连接。 (100
  2. Unity手动漫游(移动端)
  3. NVIDIA主控接入USB摄像头
  4. 行内元素,块元素,行内块元素特点
  5. 金山卫士界面源码解读及界面库分离 (5)
  6. toad怎么打开oracle,toad for oracle如何使用?
  7. [转帖]关于CP936
  8. 【原创】谈谈服务雪崩、降级与熔断
  9. 不安全的集合类Set
  10. 【C语言|函数|数组】多维数组作为函数参数