图片的选择进化
[email protected]
tag:基因算法,遗传算法,进化算法,分形,复数函数库,表达式编译
摘要: 翻看以前自己的代码的时候,发现一个有趣的程序:《图片的选择适应》,
(改名为《图片的选择进化》跟贴切一些);
原程序于2003年用Delphi写的;程序的灵感来源于函数迭代产生的漂亮的分形图片
(见: http://blog.csdn.net/housisong/Gallery/280093.aspx )和基因算法(或进化算法);
程序把图片看作一个“生命”体,图片的像素由一个函数(基因串)生成,利用进化原理
的“优胜劣汰”来得到有趣的图片;
正文:
图片生成过程:
二维图片上的某个像素点坐标可以用一个数对来描述P(x,y),把这个点的坐标当作一
个复数Z(x,y)参数带入一个复数函数F(Z),得到函数值FZ,进一步将FZ继续带入F(Z)函数
(这个过程叫做迭代),迭代指定的次数后,假设得到的结果为FZN,把FZN的值按一定的方法
映射到颜色空间得到颜色值ColorZ,这样就得到了图片上P(x,y)点的颜色; 依次处理图片
上的每个点就得到了整张图片;
基因算法:
把单个基本复数函数(加、减、乘、除、指数等)看作基因(DNA),复数函数F(Z)就可以看作图片
的基因串(基因序列或染色体),图片“个体”就是基因串的“表达”;
初始基因串可以从一个简单基因开始(祖先),利用随机的变异和组合基因来产生多个
不同的后代(变异是指用一个新的基因替换旧的基因,组合是指在基因串的一个随机位置插
入一个随机的新的基因;还可以考虑加入基因串之间的交换);运行程序的人扮演“上帝”的
角色:)来决定哪个后代“个体”可以产生新的后代,这就是一个“优胜劣汰”的过程;
经过一代一代不断的“优胜劣汰”,就可以得到很多有趣的图片:)
(基因算法也可以用于求解其他很多复杂问题)
程序中,基因是用字符串来表示的,比如"Add(Z0,Z1)","Sin(Z)","Max(Z0,Z1)";基因的组合
就是操作字符串的组合,比如"Sub(Z0,Z1)"和"Abs(Z)"的一种组合结果"Sub(Abs(Z0),Z1)";
基因的变异就是字符串的替换;
图片生成过程就是解析字符串表达式来求值的过程,为了加快速度,程序将字符串表达式
编译生成了机器码来执行;
可以考虑的改进:增大基因的尺度,比如把各种变形和效果等作为基础的基因片断,从而加
快进化过程; 允许用户保存和打开基因串并和别人共享; 增加一个“减”基因的过程,从
而优化计算速度; 更加强大的颜色映色; ......
程序操作界面截屏:
一次进化过程中生成的图片序列(共11张,对应不同的11代个体):
另一个程序选择界面截图:
补充一个网友用程序生成的进化图:
该程序生成的更多图片: http://blog.csdn.net/housisong/Gallery/279996.aspx
(可以给我发邮件([email protected] )索要程序和完整源代码(Delphi写的),注明<图片的选择进化>)