用曼德博集合进行遗传编程

3
我正在阅读一本有趣的书籍,关于使用遗传编程来交互式地演化图像。大部分函数集由简单的算术和三角函数组成(这些函数实际上操作并返回图像)。这些函数构成了编码我们图像的解析树的内部节点。树的叶子节点或终端值是随机数和x、y坐标。
有一个关于将复平面的迭代函数添加到函数集中的部分:
说遗传算法在树的某个地方插入特定的Mandelbrot集合作为节点。该函数需要两个参数:mandel(cReal, cImag),将它们视为复平面上的实部和虚部坐标。如果基因组恰好提供了像素坐标(x,y),并且mandel()是根节点,那么您将得到熟悉的Mset。但很有可能cReal和cImag本身就是许多函数分支的结果,其中散布着许多坐标x,y的实例。进入迭代循环,围绕一段时间,最终以某种距离测量逃脱到Mset吸引子,例如迭代次数。
我的问题是,如何将曼德博集合渲染器制作成一个函数,该函数以复平面上一点的实部和虚部坐标作为参数,并返回曼德博集合的渲染结果?
1个回答

1

我不确定这是否真正回答了您的问题,但我理解您引用的文本简单地说明mandel函数只是另一个函数(如乘法、min、max、加法等),可以出现在您的遗传程序中。

mandel函数与乘法函数一样,需要两个参数(in_1in_2),并返回单个值。而乘法函数仅返回in_1 * in_2,mandel函数可能会做类似于此的事情:

int mandel(int in_1, int in_2) {
  x = 0
  y = 0
  iteration = 0
  max_iteration = 1000

  while( x*x + y*y <= (2*2) && iteration < max_iteration ) {
    xtemp = x*x - y*y + in_1
    y = 2*x*y + in_2
    x = xtemp

    ++iteration
  }

  if( iteration == max_iteration ) return 0
  else return iteration
}

如果你的整个基因程序树只包含一个输入为x,另一个输入为ymandel函数,那么反复评估你的程序并保存不同的(x,y)值的结果将会给你一个漂亮的Mandelbrot集合图片。
当然,基因编程的好处在于输入可以比xy更加复杂。例如,如果一个输入是x,另一个输入是x + 2*y,结果会是什么样子呢?或者如果一个输入是x,另一个输入是mandel(x,y)呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接