Ниже мы рассмотрим достаточно общий алгоритм, позволяющий строить множество самоподобных фрактальных структур, в том числе очень напоминающих объекты живой природы. Не так давно по телевизору транслировался научно-популярный фильм BBC о глубоководной жизни, который буквально заворожил меня. Потрясающе красивые съемки, сделанные с глубоководных аппаратов, действовали почти гипнотически, приковывая взгляд к экрану. Животные, обитающие на глубинах в несколько километров в царстве вечной темноты и огромного давления, имеют, как правило, хрупкие, абсолютно прозрачные тела, тут и там обрамленные разноцветным фосфоресцирующим свечением. Их изысканные формы практически полностью основаны на принципах, которые будут обсуждаться ниже.
Задумывались ли вы когда-нибудь, откуда в вашей голове рождаются новые оригинальные идеи (если, конечно, таковые хотя бы иногда вас посещают). Они рождаются как бы спонтанно из хаоса подсознательного. По выражению новосибирского философа А.Г.Чусовитина, "Разум - это бухгалтер мысли, но не ее творец"*. Однако эти внезапные озарения не происходят сами собой, беспричинно. Как правило, стимулом или катализатором творческого процесса выступают иные оригинальные мысли, приходящие извне. К числу таких "взрывных" эвристичных идей, думается, с полным правом можно отнести принцип L-формализма, предложенный биологом Аристидом Линдермауером для кодирования квазифрактальных самоподобных геометрических структур (см. онлайновый номер журнала "Информатика", расположенный по указанному ниже адресу).
Суть L-кодирования сводится к следующему. Представим себе некое виртуальное программируемое устройство, состоящее из пера, управляющего им механизма и листа бумаги. Управляющий пером механизм способен исполнять несколько команд. А именно: он может опустить перо на бумагу и вычертить прямой отрезок заданной длины в направлении текущей ориентации пера (команда F). Он может изменить ориентацию пера по отношению к текущей на какой-то заданный относительный угол по часовой или против часовой стрелки (команды + и -). Он может также запоминать (заносить в стек) свое текущее состояние (команда [) и вспоминать (извлекать из стека) ранее запомненное состояние (команда ]). Под состоянием в данном случае понимается тройка чисел (x, y, a), где x и y - это координаты пера и а - это угол, определяющий направление ориентации пера. Таким образом, задав некое начальное направление а0, определив относительный угол поворота в 900 и задав длину отрезка, при помощи последовательности команд F+F+ F+F мы можем нарисовать квадрат. Определив относительный угол поворота в 600, при помощи последовательности команд F++F++F можно нарисовать равносторонний треугольник.
Предположим также, что в программы для нашего виртуального устройства, кроме пяти перечисленных команд, можно включать любые другие символы, которые управляющий механизм будет просто игнорировать. То есть если мы введем программу F+BF+CCF+CF, то устройство все равно нарисует квадрат. Теперь мысленно оснастим наше устройство приставкой, которая перед тем, как передать введенную программу на управляющий механизм, может заданное число раз просматривать ее, и при каждом очередном просмотре заменять любые символы последовательности по предварительно указанным правилам. Исходную программную последовательность символов теперь будем называть аксиомой. Например, введем аксиому FB+, и определим правило B < F+FB. Зададим также количество просмотров, равное, например, двум. Тогда на входе механизма после обработки введенной аксиомы приставкой получим последовательность FF+FF+FB+. Вот, собственно, и все. При помощи описанного несложного виртуального устройства можно строить множество самых разнообразных фрактальных форм - от традиционных математических фракталов, таких, как, например, снежинка Коха или кривая Гильберта, до структур, очень напоминающих растительную или подводную жизнь.
По адресу inf.1september.ru/2000/6/fract/main.htm можно найти программы для моделирования L-фракталов, написанные на Q-basic и на C. Я, однако, написал собственный вариант программного кода на Visual Basic, который алгоритмически несколько отличается от программы, приведенной по указанному выше адресу.
На рисунке приведено несколько примеров фрактальных структур, построенных при помощи описанной программы.

Может ли быть случайным столь разительное сходство L-фракталов с формами живых организмов? Думается, что нет. Наверняка генетические программы развития растительных и подводных организмов имеют много общего с принципами описанного L-кодирования. С позиций L-формализма легко поддаются логическому объяснению и разнообразие биологических форм, и принципы их эволюции. Ведь для получения какой-либо новой формы достаточно лишь немного изменить какой-либо параметр или элемент исходной программы, сохранив при этом сам принцип построения. В то же самое время L-формализм демонстрирует всю несостоятельность статистических аддитивных подходов к описанию наследования фенотипических признаков организмов, которые до настоящего времени имеют сильное влияние в биологической науке. На примере L-фракталов можно проиллюстрировать конструктивный параллельный перенос эвристичных идей из разных областей знания. Думается, что фрактальная геометрия могла бы натолкнуть генетиков на решение многих загадок, связанных с природными принципами формообразования и наследования. Впрочем, справедливо и обратное. Недаром принцип L-кодирования был предложен не математиком, а именно биологом.
А. КОЛЕСНИКОВ,
[email protected]
* Чусовитин А.Г. Концепция
деятельности (онтологический и
методологический аспекты)\\
Полигнозис 4\2000, - с 149
Dim x_stack(200) As Single
Dim y_stack(200) As Single
Dim a_stack(200) As Single
Dim MaxDepth As Byte
Dim ProgramString As String
Dim NewProgramString As String
Dim Rule(10) As String
Dim RuleSimbol(10) As String
Dim Replace As Boolean
Dim Axiom As String
Dim Simbol As String
Dim Nrule As Byte
Dim angle As Byte
Dim R As Single
Private Sub Form_Click()
Open "Растение 2.txt" For Input As #1
Input #1, Axiom
Input #1, angle
Input #1, Nrule
Input #1, MaxDepth
For i = 1 To Nrule
Input #1, RuleSimbol(i)
Input #1, Rule(i)
Next i
Close #1
R = 500
Interpretation
Visualisation
End Sub
Public Sub Interpretation()
Depth = 0
ProgramString = Axiom
NewProgramString = ""
Do While Depth <= MaxDepth
For i = 1 To Len(ProgramString)
Simbol = Mid$(ProgramString, i, 1)
Replace = False
j = 1
Do While j <= Nrule
If RuleSimbol(j) = Simbol Then
Replace = True: Exit Do
End If
j = j + 1
Loop
If Replace Then
NewProgramString = NewProgramString + Rule(j)
Else
NewProgramString = NewProgramString + Simbol
End If
Next i
Depth = Depth + 1
ProgramString = NewProgramString
NewProgramString = ""
R = R / 1.5
Loop
End Sub
Public Sub Visualisation()
Pi = 3.141592654
x = 3000
y = 0
a = 0
sector = (360 / angle) * Pi / 180
Cs = 0
PSet (x, 7000 - y)
For i = 1 To Len(ProgramString)
Simbol = Mid$(ProgramString, i, 1)
Select Case Simbol
Case "F"
x = x + R * Cos(a)
y = y + R * Sin(a)
Line -(x, 7000 - y)
Case "+"
a = a - sector
Case "-"
a = a + sector
Case "["
Cs = Cs + 1
x_stack(Cs) = x
y_stack(Cs) = y
a_stack(Cs) = a
Case "]"
x = x_stack(Cs)
y = y_stack(Cs)
a = a_stack(Cs)
PSet (x, 7000 - y)
Cs = Cs - 1
End Select
Next i
End Sub





