3

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

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

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

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

ответ

1

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

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

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)?