点击上方蓝色字体,关注我们

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

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

第一节  遗传算法概述

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

1.1  遗传算法的基本思想

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

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

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

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

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

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

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

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

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

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

  • 遗传算法搜索种群中的点是并行的,而不是单点;

  • 遗传算法并不需要辅助信息或辅助知识,只需要影响搜索方向的目标函数和相应的适应度;

  • 遗传算法使用概率变换规则,而不是确定的变换规则;

  • 遗传算法工作使用编码参数集,而不是自身的参数集(除了在实值个体中使用)

1.3  遗传算法的计算步骤

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

  1. 确定寻优参数,进行编码。编码时先要设置编码长度;

  2. 随机产生一组初始解(即个体)组成初始种群。初始种群中个体的数目称作初始种群的规模;

  3. 计算种群中各个个体的目标函数值及其相应的适应度函数值;

  4. 形成匹配集。根据种群中各个染色体的适应度函数值,采取一定的选择方法,从种群中选出适应值较大的个染色体(其中有些染色体是重复的),称这个染色体的集合即为匹配集。这一过程即为选择操作。

  5. 按某种复制规则进行繁殖。由匹配集中的个染色体繁殖产生个新的染色体,得到一个新的种群。繁殖方法主要有两种:交叉和变异。

  6. 若遗传代数(迭代次数)达到给定的允许值或其它收敛条件已满足时停止遗传,否则返回步骤2。

第二节  程序实现

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

(1)载入原始图像

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

[filename, pathname] = uigetfile({'*.jpg;*.png;','选择图片文件'});
pic_origin = imread(fullfile(pathname,filename));

(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

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

(7)变异

在基因交叉之后产生的子代个体,其变量可能以很小的概率或者步长发生转变,这个过程称为变异。程序中变异概率为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];

第三节  运行结果

第四节  一点小结

  • 相比单点交叉算法和多点交叉算法,二进制均匀交叉算法在运算效率方面具有明显优势。在实际试验中,采用单点交叉算法达到适应度值为0.90左右需要迭代4500次左右。而采用二进制均匀交叉算法,仅仅迭代550次适应度值即可到达0.90左右。对比发现,采用二进制均匀交叉算法,不仅加快了迭代过程,而且增强了逼近效果,还在趋于收敛时可防止收敛于局部极值点。

  • 遗传算法中的变异运算是产生新个体的辅助方法,它决定了遗传算法的局部搜索能力,同时保持种群的多样性。交叉运算和变异运算的相互配合,共同完成对搜索空间的全局搜索和局部搜索。变异概率不能太小,这样降低全局搜索能力;也不能太大,这时遗传算法退化为随机搜索。

  • 遗传算法的全局搜索能力不强,很容易陷入局部最优解跳不出来。需要根据实际情况进一步的改进。

感谢阅读!

微信号:yikeAI14539

知乎:李是Lyapunov的李

添加微信号,加入一刻AI交流群

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

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

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

  2. AI 让梵高、维米尔、高更、比亚兹莱和莫迪利亚尼重画《蒙娜丽莎》?

    作为艺术史上最富盛名的符号形象,<蒙娜丽莎>是卢浮宫里访问量最大,也是最常被衍生和模仿的艺术作品. 用不同时期艺术家的标志性风格重绘<蒙娜丽莎> 让艺术史上不同时期艺术家们以自 ...

  3. openCV+dlib实现给蒙娜丽莎换脸

    opencv+dlib实现给蒙娜丽莎换脸 本案例利用opencv+dlib实现了给蒙娜丽莎换脸. 换脸实现的基本原理: 使用dlib的shape_predictor_68_face_landmarks ...

  4. 通过深度学习+TensorFlow.js对蒙娜丽莎进行动画处理

    看蒙娜丽莎(Mona Lisa)画像时,你会发现她的眼睛将四处移动跟随你.这就是所谓的"蒙娜丽莎效应".为了娱乐,我们把蒙拉丽莎画像制成交互式数字肖像,通过你的浏览器和网络摄像头将 ...

  5. 第十六届全国大学生智能车竞赛技术报告 | 单车拉力组- 上海海事大学-骑摩托的蒙娜丽莎

    简 介: 本文设计的智能车系统以 STC16F40K128微控制器为核心控制单元,通过车体前方的电感检测赛道电磁信息,通过编码器检测智能车的实时速度,利用陀螺仪检测小车姿态,使用PID 控制算法调节电 ...

  6. AI用50个三角形画出抽象版蒙娜丽莎,有股后现代的感觉了 | 谷歌大脑出品

    明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在,给AI一个短语和50个三角形,它就能创作一副极简风格的抽象画了. 只需输入"a drawing of cat(一张猫的画像) ...

  7. 蒙娜丽莎,品牌创新的探索者

    在只要能生产出类似的产品就能赚到钱,大家都把精力放在捕捉现有市场机会的2000年左右,蒙娜丽莎试水品牌高度的产品创新,从无差异的品牌战略转向有限的差异化多品牌战略,这一成功转型无疑是蒙娜丽莎十年品牌路 ...

  8. tensorflow sigmoid 如何计算训练数据的正确率_“来自蒙娜丽莎的凝视”— 结合 TensorFlow.js 和深度学习实现...

    客座博文 / Emily Xie,软件工程师 背景 坊间传闻,当您在房间里走动时,蒙娜丽莎的眼睛会一直盯着您. 这就是所谓的"蒙娜丽莎效应".兴趣使然,我最近就编写了一个可互动的数 ...

  9. 【​观察】纺织印花行业转型与升级提速 爱普生蒙娜丽莎掀起技术迭代革命...

    申耀的科技观察 读懂科技,赢取未来! 毫无疑问,今天我们所处的是一个充满巨变和不断颠覆的时代,无论是云计算.大数据.物联网.人工智能等新兴技术的落地和兴起,还是"互联网+"风暴的侵 ...

最新文章

  1. 操作临时表+事务级别临时表操作+会话级别临时表操作
  2. 在cds学到的(非技术)
  3. Linux 退出vi 命令简介
  4. 集成显卡与独立显卡的区别
  5. MySQL建表的限定于巨_Linux入门笔记(4/1/2016修改)
  6. Git本地版本控制备忘
  7. 利用老毛桃启动盘制作三合一系统启动:WINPE + CDlinux + Ubuntu
  8. 巨蟹座---永远的伤
  9. 迪士尼的漫威宇宙第四阶段计划出炉
  10. knex 找不到mysql_转义knex mysql查询语句
  11. React 基础学习
  12. 计算机主机的硬盘件,硬盘组件、硬盘减振装置以及计算机主机的制作方法
  13. Windows-Oracle 11g详细安装教程
  14. 自己开发CMS系统还是使用成熟的CMS系统?
  15. 常用电脑硬件技术术语集锦
  16. 博士第六年还没有发 Paper 是一种什么样的体验?| 文末送书
  17. 6000端口有毒,谷歌浏览器访问不到
  18. 7-51 实验9_2_身份证号码最后一位 (100 分)
  19. rrt算法 c语言,未知环境下改进的基于RRT算法的移动机器人路径规划
  20. 微信公众平台开发--快递查询

热门文章

  1. 熊猫入金讲付费一种能力
  2. leetcode292. Nim 游戏(java python3)
  3. android数据漫游,测量Android上的数据漫游流量?
  4. 问题分析报告--压力环境下运行缓慢
  5. 儿童帐篷出口美国CPC认证测试项目流程介绍
  6. 11 一道几何题,众所周知,坠帅坠可爱的ZZZ学长是计算几何的大师,这次他遇到了这样一个题目。 给定3个点a,b,c 找到一个点,使得如果我们把平面绕着这个点旋转一定的角度,a可以落在b原来的位置,
  7. SERP调用企业微信API接口,发送文本信息实例
  8. 宝塔安装 SVN 搭建svn版本库
  9. Petalinux对zcu106编译自定义驱动模块
  10. informix 插入中文显示问号