图片的选择进化(好玩:)

                                   图片的选择进化
                               
HouSisong@GMail.com

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


(可以给我发邮件(HouSisong@Gmail.com )索要程序和完整源代码(Delphi写的),注明<图片的选择进化>) 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值