3

我正在阅读这本引人入胜的书中的一章,内容是关于使用遗传编程交互式进化图像。大多数函数集由简单的算术和三角函数组成(真正操作并返回图像)。这些函数构成了对我们的图像进行编码的解析树的内部节点。树的叶子或终端值是随机数和 x,y 坐标。

有一节关于将复平面的迭代函数添加到函数集:

假设遗传学将一个特定的 Mandelbrot 集作为节点插入到浓密的树的某处。该函数需要两个参数:mandel(cReal, cImag),将它们视为复平面中的实坐标和虚坐标。如果基因组恰好提供了像素坐标 (x,y),并且 mandel() 是根节点,那么您将得到熟悉的 Mset。但是很可能 cReal 和 cImag 本身就是整个函数分支的结果,许多坐标 x,y 的实例散布在叶子之间。进入迭代循环,绕一圈,最后用一些距离 Mset 吸引子的距离来衡量,比如迭代次数。

我的问题是如何将 Mandelbrot 集渲染器作为一个函数,将复平面上点的实坐标和虚坐标作为参数并返回 Mandelbrot 集的渲染?

4

1 回答 1

1

我不确定这是否真的回答了你的问题,但我对你引用的文字的理解只是说该mandel函数只是可以出现在你的基因程序中的另一个函数(如乘法、最小值、最大值、加法等)。

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
}

如果你的整个遗传程序树只包含mandel一个输入 asx和另一个输入 as的函数y,那么反复评估你的程序以获得一堆不同的(x,y)值并保存结果将为你提供 Mandelbrot 集的漂亮图片。

当然,关于遗传编程的巧妙之处在于输入可以比x和更精美yx例如,如果一个输入是,另一个输入是,结果会是什么样子x + 2*y?或者如果一个输入是x,另一个是mandel(x,y)

于 2010-08-16T19:33:57.170 回答