遗传算法 100个三角形绘制Firefox图标

学习遗传算法

为了了解遗传算法的基本原理,我阅读了遗传算法GA(Genetic Algorithm)入门知识梳理,之后选择了一个简单的问题学习代码:使用遗传算法求解y=x*x(x∈0-31,x是整数)的最大值,参考了遗传算法_求最大值这篇文章。感谢这两篇文章的作者。

随后我在网上发现了科学松鼠会 遗传算法:内存中的进化这篇介绍,觉得很有意思,可以通过遗传算法用100个三角形绘制出Firefox图标,想自己去实现它。

因为对OpenCV比较熟悉,就使用该工具进行图像处理,但是貌似OpenCV没有自带的绘制半透明三角形的方法,感谢OpenCV基本绘图两个半透明颜色色的叠加计算方法文章的作者,在此基础我有了更好的思路。

实现方法:

参考科学松鼠会的思路,下面是我的实现方法:

创建初始群体

  1. 种群内扇贝个数设定为16。
  2. 每个扇贝壳上有100个半透明三角形。每个三角形的三个点与颜色随机生成。
  3. 使用OpenCV绘制该扇贝,与理想图片逐像素对比,计算出该扇贝适应度(适应度=像素点个数*通道数/所有像素点4通道差值累积和)。

交叉

  1. 随机寻找两扇贝配对。
  2. 100个三角形内随机寻找n个三角形,两扇贝进行交叉操作。

变异

  1. 某个扇贝随机一个三角形的三点与颜色变异。

更新适应度

选择

  1. 淘汰适应度最低的两个扇贝。
  2. 为保持种群数量不变,其余扇贝内随机寻找两扇贝交叉补缺位。

运行参数

  1. 交叉率:0.86
  2. 变异率:0.1
  3. 迭代次数:180000
  4. 种群大小:16
  5. 三角形个数:100

微调

  1. 选择算子:轮盘赌算法(容易早熟),淘汰最低两个交叉补缺位(目前所用的方法)。
  2. 变异算子:变异两个三角形,变异一个三角形(两方法差别不大)。
  3. 变异率:0.2(过高,种群适应度增长缓慢),0.1(目前所用的值).
  4. 理想图像分辨率:128*128(渲染速度过慢),32*32(目前所用的值)。

实验效果

Firefox理想图标:
《遗传算法 100个三角形绘制Firefox图标》
遗传算法180000代最优扇贝:
《遗传算法 100个三角形绘制Firefox图标》
遗传算法历代最优扇贝:
《遗传算法 100个三角形绘制Firefox图标》

比较看出:实验结果30000代时已经形成了基本的轮廓,之后增长速度趋于缓慢。虽然基本轮廓形成了,但是细节不好,并且迭代次数过多,与科学松鼠会 遗传算法:内存中的进化文章中贴出的算法结果相差很多,应该是我有很多细节、优化方面没考虑到。

实验代码

下面是我实现的代码,有兴趣的同学可以看看,如果各位有更好的思路或者优化方法的,希望能在评论多多指导,感谢各位!
TuanZ7/GA-Firefox

Related Articles
Genetic Programming: Evolution of Mona Lisa
遗传算法 三角形

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/Tuanz7/article/details/78673169
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞