Генетическое программирование с помощью набора Мандельброта - PullRequest
3 голосов
/ 14 августа 2010

Я читаю главу в этой увлекательной книге об использовании генетического программирования для интерактивного развития изображений. Большая часть набора функций состоит из простых арифметических и триггерных функций (которые действительно работают и возвращают изображения). Эти функции составляют внутренние узлы деревьев разбора, которые кодируют наши изображения. Листья дерева или конечные значения являются случайными числами и координатами x, y.

Есть раздел о добавлении итерационных функций комплексной плоскости к набору функций:

Скажем, генетика вставляет определенный набор Мандельброта как узел где-то в густое дерево Функция ожидает два аргумента: mandel (cReal, cImag), лечение их как действительные и мнимые координаты в комплексной плоскости. Если геном просто получилось предоставить координаты пикселей (x, y), а mandel () были корнем узел, вы бы получили знакомый Mset. Но есть вероятность, что cReal и cImag сами являются результатами целых ветвей функций со многими экземплярами координат х, у разбросаны среди листьев. Введите цикл итерации, орбиту некоторое время, и, наконец, сбежать с некоторой мерой расстояния до Мсет аттрактор, например количество итераций.

Мой вопрос: как бы вы сделали рендерер множества Мандельброта как функцию, которая принимает действительные и воображаемые координаты точки на комплексной плоскости в качестве аргументов и возвращает рендеринг множества Мандельброта?

1 Ответ

1 голос
/ 16 августа 2010

Я не уверен, что это действительно отвечает на ваш вопрос, но мое понимание текста, который вы цитировали, просто говорит, что mandel функция - это просто другая функция (например, умножение, мин, макс, сложение и т. д.), которые могут появиться в вашей генетической программе.

Функция mandel, как и функция умножения, принимает два аргумента (in_1 и in_2) и возвращает одно значение. В то время как функция умножения просто возвращает in_1 * in_2, функция Манделя может сделать что-то вроде этого :

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 с одним входом в качестве x и другим входом в качестве y, то повторно оценивая вашу программу для набора различных значений (x,y) и сохраняя результат даст вам хорошую картину множества Мандельброта.

Конечно, замечательная вещь в генетическом программировании состоит в том, что входные данные могут быть более изящными, чем просто x и y. Например, как бы выглядел результат, если бы один вход был x, а другой - x + 2*y? Или если один вход был x, а другой был mandel(x,y)?

...