本文转载至知乎ID:Charles(白露未晞)知乎个人专栏
本文转载至知乎ID:Charles(白露未晞)知乎个人专栏
下载W3Cschool手机App,0基础随时随地学编程>>戳此了解
导语
日子真是...
发现不知不觉又好多天没发文章了。
恰巧看到一个关于遗传算法的很有意思的应用,利用遗传算法拟合图像,于是过来分享一波。
让我们愉快地开始吧~~~
相关文件
百度网盘下载链接: https://pan.baidu.com/s/1VMyY7u2C9Zq0vlMJZE1GSw
密码: ec77
开发工具
Python版本:3.6.4
相关模块:
PIL模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
参考资料
50个半透明多边形重现蒙娜丽莎:
http://alteredqualia.com/visualization/evolve/
科学松鼠会《遗传算法》:
http://songshuhui.net/archives/10462
原理简介
改编参考资料中的故事:
很久很久以前,海岸边生活着一群扇贝,它们衣食不愁,有房有车。但好景不长,人类的到来打破了它们原本无忧无虑的生活。
每隔一段时间,人类就会挖走它们之中的一部分。不过,这些人不喜欢贝壳花纹长得像哈士奇的扇贝,所以他们总是选择那些长得比较不像哈士奇的扇贝。
这种状况持续了好几万年。这个时候,神奇的事情发生了:所有的扇贝贝壳上都印着哈士奇!
遗传算法——元启发式算法之一:
首先致敬一波达尔文?
简单而言,遗传算法模拟了大自然中种群在选择压力下的演化过程,从而得到了对应问题的近似解。
具体而言,就是生物体长什么样子很大程度上是由染色体上的基因决定的。如果我们利用n个多边形组成一只哈士奇的话,我们同样也可以认为哈士奇长什么样子由这些多边形的具体位置和颜色决定,也就是说这些多边形可以被看作是哈士奇的“基因”。
当然,需要注意的是,这个算法得到的只是问题的近似解而非精确解,且存在基因过早同一化等问题。
来自http://xkcd.com/534/的冷笑话:
算法设计:
遗传算法只是一个框架,对于具体问题当然需要设计具体的算法。
时间关系,本次算法设计一切从简。
Step1:
随机生成100幅与原始图像大小相同的噪声图像。
Step2:
种群变异(变异概率50%),即在100幅生成的图像上加一些随机噪声。
Step3:
计算与原始图像的差异度。计算公式为:
Step4:
保留与原始图像差异度较低的生成图像,并让它们交叉融合生成新的图像以使得种群的数量保持不变。
Step5:
循环执行Step2-4。
具体实现过程详见相关文件中的源代码。
使用演示
在cmd窗口运行Genetic.py文件即可。
部分参数解释:
以chrome浏览器图标(大小为30×30)为例:
【图像较大的话时间花销比较大T_T】
可以看到还是有那么点意思的。
有兴趣的同学可以多跑几轮,看看几万轮之后的结果是什么,时间关系我就不继续跑了。
更多
参考资料中的第一个链接是一个遗传算法拟合蒙娜丽莎的在线测试系统。
其最终的结果为:
当然还有其他图案的:
emmm,比我的结果好很多的样子。
有空再优化我自己写的东西吧~~~