L-система

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
L-системы деревьев образуют реальные модели натуральных растений

L-система или система Линденмайера — это параллельная система переписывания и вид формальной грамматики. L-система состоит из алфавита символов, которые могут быть использованы для создания строк, набора порождающих правил[en], которые задают правила подстановки вместо каждого символа, начальной строки («аксиомы»), с которой начинается построение, и механизма перевода образованной строки в геометрические структуры. L-системы предложил и развивал в 1968 Аристид Линденмайер, венгерский биолог и ботаник из Утрехтского университета. Линденмайер использовал L-системы для описания поведения клеток растений и моделирования процесса развития растения[en]. L-системы использовались также для моделирования морфологии различных организмов[1] и могут быть использованы для генерации самоподобных фракталов, таких как системы итерируемых функций[en].

Истоки[править | править вики-текст]

«Сорняки», сгенерированные с помощью L-системы в 3D.

В качестве биолога Линденмайер работал с дрожжами и нитевидными грибами и изучал схемы роста различных видов водорослей, таких как синезелёные водоросли Anabaena catenula. Первоначально L-системы были разработаны для формального описания развития таких простых многоклеточных организмов и для иллюстрации связи между соседними клетками растения. Позже система была расширена для описания высших растений и сложных ветвящихся структур.

Структура L-системы[править | править вики-текст]

Рекурсивная природа правил L-системы приводит к самоподобию и потому подобные фракталам формы легко описываются с помощью L-системы. Модели растений и выглядящие естественно органические формы легко сформировать, так как при увеличении уровня рекурсии модель медленно «растёт» и становится более сложной. Системы Линденмайера популярны также в генерации искусственной жизни.

Грамматики L-систем очень похожи на полусистемы Туэ[en] (см. «Иерархия Хомского»). L-системы теперь известны как параметрические L системы, которые определяются как кортеж

G = (V, ω, P),

где

  • V (алфавит) — это множество символов, содержащих как элементы, которые могут быть заменены (переменные), так и элементы, которые не могут быть заменены ("константы" или "терминальные символы")
  • ω (старт, аксиома или инициатор) — это строка символов из V, определяющая начальное состояние системы
  • P — это множество порождающих правил[en], определяющих, каким образом переменные могут быть заменены комбинациями констант и других переменных. Порождающее правило состоит из двух строк, прототип и преемник. Для любого символа A, входящего в алфавит V, не входящего в левую часть правил P, предполагается правило вывода A → A. Эти символы называются константами или терминальными символами. (см. «Закон тождества»).

Правила грамматики L-системы применяются итеративно, начиная с аксиомы (начального состояния). На итерации применяется как можно больше правил. Факт, что на каждой итерации применяется как можно больше правил, отделяет L-систему от формального языка генерируемого формальной грамматике, которая применяет только одно правило на итерацию. Если бы правила вывода применялись по одному, легко было бы сгенерировать язык, а не L-систему. Таким образом, L-системы являются подмножеством языков.

L-систем является контекстно-свободной, если каждое правило вывода ссылается только на индивидуальные символы, а не на их соседей. Контекстно-свободные L-системы определяются контекстно-свободной грамматикой. Если правило зависит не только от единичного символа, но и от соседних, система называется контекстно-зависимой L-системой.

Если существует в точности одно правило для каждого символа, говорят, что L-система детерминированная (детерминированная контекстно-независимая L-система называется D0L системой[en]). Если имеется несколько правил и каждая выбирается с некоторой вероятностью на каждой итерации, то это стохастическая L-система.

Чтобы использовать L-системы для генерации графических образов, требуется, чтобы символы в модели относились к элементам рисунка на экране компьютера. Например, программа Fractint[en] использует черепашью графику (похожую на графику в языке Лого) для получения изображения на экране. Программа интерпретирует каждую константу в модели L-системы как команды системы черепашьей графики.

Примеры L-систем[править | править вики-текст]

Пример 1: Водоросли[править | править вики-текст]

Оригинальная L-система Линденмайера для моделирования роста водорослей.

переменные : A B
константы : нет
аксиома  : A
правила  : (A → AB), (B → A)

Система даёт

n = 0 : A
n = 1 : AB
n = 2 : ABA
n = 3 : ABAAB
n = 4 : ABAABABA
n = 5 : ABAABABAABAAB
n = 6 : ABAABABAABAABABAABABA
n = 7 : ABAABABAABAABABAABABAABAABABAABAAB

Пример 1: Водоросли, объяснение[править | править вики-текст]

n=0:         A           старт (аксиома/инициатор)
            / \
n=1:       A   B         начальная единственная A превращается в AB по правилу (A → AB), правило (B → A) не может быть применено
          /|    \
n=2:     A B     A       к строке AB применяются все правила, A снова превращается в AB, а B превращается A
        /| |     |\
n=3:   A B A     A B     заметьте, что все A переводятся в копию себя и добавляется B, которая превращается ...
      /| | |\    |\ \
n=4: A B A A B   A B A   ... в A в следующем поколении, что приводит к рекурсии

Результатом будут слова Фибоначчи[en]. Если посчитать длину каждой строки, получим знаменитую последовательность Фибоначчи (опуская первую 1):

1 2 3 5 8 13 21 34 55 89 ...

Для каждой строки, если мы отсчитаем k-ую позицию с левого конца строки, значение зависит от того, попадает ли k, умноженное на золотое сечение, в интервал . Отношение вхождений букв A к B также сходится к золотому сечению.

Этот пример даёт тот же результат (в смысле длины строк, не в смысле последовательности букв A и B), если правило (AAB) заменить на (ABA), но при этом получим зеркально отражённые строки.

Эта последовательность является катенантной[en], поскольку , где является n-ым поколением.

Пример 2: Дерево Пифагора[править | править вики-текст]

  • переменные: 0, 1
  • константы: [, ]
  • аксиома: 0
  • правила: (1 → 11), (0 → 1[0]0)

Фигура строится рекурсивным применением правил вывода к аксиоме. Каждый символ входной строки проверяется в списке правил, чтобы определить, на что следует заменить символ. В этом примере «1» на входе превращается в «11» на выходе, а «[» не меняется. Применяя правила вывода к аксиоме «0», получим:

аксиома: 0
1-ая рекурсия: 1[0]0
2-ая рекурсия: 11[1[0]0]1[0]0
3-я рекурсия: 1111[11[1[0]0]1[0]0]11[1[0]0]1[0]0

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

  • 0: рисуй отрезок, кончающийся листом
  • 1: рисуй отрезок
  • [: положи в стек положение и угол рисования, поверни влево на 45 градусов
  • ]: выбери из стека положение и угол, поверни вправо на 45 градусов

«Положи в стек» и «выбери из стека» относится к LIFO-стеку (более подробная грамматика потребовала бы разделить на «положи в стек» и «поверни»). Когда интерпретатор встречает «[», текущее положение черепахи и угол движения сохраняются в стеке, когда же встречается «]», положение и угол восстанавливаются. Если несколько значений заносятся в стек, восстанавливается последнее занесённое значение. В литературе L-системы, использующие такой подход к ветвлению, называют «bracketed L-systems» (скобочные L-системы)[2].

Применяя эти графические правила к полученной ранее строке, мы имеем:

Аксиома  
Первая рекурсия  
Вторая рекурсия  
Третья рекурсия  
Четвёртая рекурсия  
Седьмая рекурсия, уменьшенная в десять раз  

Пример 3: Множество Кантора[править | править вики-текст]

Cantor set in seven iterations.svg
переменные: A B
константы: нет
старт: A {стартовая строка}
правила: (A → ABA), (B → BBB)

Пусть A означает «рисуем отрезок», а B означает «движемся».

Такая грамматика порождает знаменитое канторово фрактальное множество на вещественной оси R.

Пример 4: Кривая Коха[править | править вики-текст]

Вариант кривой Коха, использующей только прямые углы.

переменные : F
константы : + −
старт  : F
правила  : (F → F+F−F−F+F)

Здесь F означает «рисуем отрезок», + означает «повернуть влево на 90°», а − означает «повернуть вправо на 90°» (см. «Черепашья графика»).

n = 0:
F
Квадрат Коха - 0 итераций
n = 1:
F+F−F−F+F
Квадрат Коха - 1 итерация
n = 2:
F+F−F−F+F + F+F−F−F+F − F+F−F−F+F − F+F−F−F+F + F+F−F−F+F
Квадрат Коха - 2 итерации
n = 3:
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F +
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F −
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F −
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F +
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F
Квадрат Коха - 3 итерации

Пример 5: Треугольник Серпинского[править | править вики-текст]

Треугольник Серпинского, нарисованный с помощью L-системы.

переменные: F G
константы: + −
старт: F−G−G
правило: (F → F−G+F+G−F), (G → GG)
угол: 120°

Здесь F и G означают «рисуем отрезок», + означает «повернуть вправо на угол», а − означает «повернуть влево на угол».

Можно также аппроксимировать треугольник Серпинского, используя L-систему создания стреловидной кривой Серпинского[en].

переменные: A B
константы: + −
старт: A
правила: (A → +B−A−B+), (B → −A+B+A−)
угол: 60°

Здесь A и B изначают «рисуем отрезок», + означает «повернуть влево на угол», а − означает «повернуть влево на угол» (см. «Черепашья графика»).

Serpinski Lsystem.svg
Итерации для n = 2, n = 4, n = 6, n = 8

Пример 6: Кривая дракона[править | править вики-текст]

Кривая дракона, нарисованная с помощью L-системы.

переменные : X Y
константы : F + −
старт  : FX
правила  : (X → X+YF+), (Y → −FX−Y)
угол  : 90°

Здесь F означает «рисуем отрезок», − означает «повернуть влево на 90°», а + означает означает «повернуть вправо на 90°». X и Y не соответствуют какому-либо действию при рисовании, а используются только для построения кривой.

Dragon curve L-system.svg
Кривая дракона для n = 10

Пример 7: Фрактальное растение[править | править вики-текст]

переменные : X F
константы : + − [ ]
старт  : X
правила  : (X → F−[[X]+X]+F[+FX]−X), (F → FF)
угол  : 25°

Здесь F означает «рисуем отрезок», − означает «повернуть влево на 25°», а + означает «повернуть вправо на 25°». X не соответствует какому-либо действию при рисовании используется только для построения кривой. Квадратная скобка «[» соответствует сохранению текущих значений позиции и угла, которые восстанавливаются, когда выполняется соответствующий символ «]».

Fractal-plant.svg
Фрактальное растение для n = 6

Варианты[править | править вики-текст]

Было сделано несколько разработок на основе техники L-систем, которые могут быть использованы совместно. Среди них cтохастические грамматики[en], контекстно-зависимые грамматики и параметрические грамматики.

Стохастические грамматики[править | править вики-текст]

Модели грамматик, которые мы сейчас рассматривали, являются детерминированными. То есть, если дан какой-либо символ из алфавита, имеется в точности одно правило, которое всегда выбирается и всегда выполняется одна и та же подстановка. Альтернативой является указание более одного правила вывода для символа, задав для каждого правила вероятность выполнения. Например, в грамматике примера 2 мы можем заменить правило переписывания «0» с

0 → 1[0]0

на вероятностное правило

0 (0.5) → 1[0]0
0 (0.5) → 0

При этих правилах вывода, когда встречается «0» во входной строке, с вероятностью 50 % поведение будет таким же, как и раньше, а с вероятностью 50 % ничего не меняется. Если используется стохастическая грамматика в контексте эволюции, рекомендуется инкорпорировать генератор случайности в генотип, так что стохастические свойства рисунка остаются постоянными между поколениями.

Контекстно-зависимые грамматики[править | править вики-текст]

Контекстно-зависимое правило вывода просматривает не только на символы, которые он изменяет, но и на символы предшествующие им и следующие за ними. Например, правило вывода:

b < a > c → aa

преобразует "a" в "aa", но только если "a" окажется между "b" и "c" во входной строке:

…bac…

Как и в случае случайного вывода, имеется несколько правил для обработки символы в различных контекстах. Если никакое порождающее правило не найдено для указанного контекста, предполагается тождественное преобразование, и символ не меняется. Если имеются как контекстно-независимые, так и зависимые правила вывода в той же грамматике, контекстно-зависимое правило вывода имеет преимущество (если его можно применить).

Параметрические грамматики[править | править вики-текст]

В параметрической грамматике каждый символ в алфавите имеет список параметров, ассоциированный с символом. Символ вместе с параметрами называется модулем и строка в параметрической грамматике — это последовательность модулей. Примером может служить следующая строка:

a(0,1)[b(0,0)]a(1,2)

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

a(x,y) : x == 0 → a(1, y+1)b(2,3)

Модуль a(x,y) испытывает преобразование по этому правилу, если выполняется x=0. Например, a(0,2) претерпит преобразование, а a(1,2) — нет.

На правой стороне правила вывода (в преемнике) могут быть подвергнуты преобразованию как параметры, так и целые модули. В примере выше модуль b(x,y) добавляется к строке с начальными параметрами (2,3). Параметры же уже существующего модуля преобразуются. При описанных выше правилах вывода,

a(0,2)

Становится

a(1,3)b(2,3)

так как параметр «x» модуля a(x,y) явно преобразуется в «1», а параметр «y» увеличивается на единицу.

Параметрические грамматики позволяют длину отрезка и угол ответвления задать в грамматике, а не в методах интерпретации черепашьей графики. Если возраст также задаётся параметром для модуля, правила могут быть изменены в зависимости от возраста сегмента растения, что позволяет анимацию всего жизненного цикла созданного дерева.

Другие категории L-систем[править | править вики-текст]

  • D0L-системы = детерминированные контекстно-свободные системы (см. выше)
  • Размножающиеся L-системы («Propagative L-systems», «pL-systems») — это системы, в которых хотя бы одно правило имеет в правой части (в выводе) по меньшей мере две буквы. Неразмножающиеся системы имеют в правой части только один символ. Длина слова в этом случае не меняется[3].
  • Скобочные L-системы (см. Пример 2)
  • 0L-системы, 1L-системы, 2L-системы (IL-системы, известные также как (k,l)-системы)[4].
  • Табличные L-системы ( «T0L-системы») — это системы, работающие с несколькими наборами правил. Для выбора набора правил используется внешний механизм контроля. Табличные L-системы были введены и формализованы Розенбергом в 1975 для моделирования влияния среды на рост растений[5] .

Открытые проблемы[править | править вики-текст]

Имеется много открытых проблем, связанных с изучением L-систем. Например:

  • Описание всех детерминированных контекстно-свободных локально катентативных L-систем. (Полное решение известно только для случая трёх переменных) [6].
  • Если задана структура, найти L-систему, которая может воспроизвести эту структуру.
  • Если даны две pL-системы и функция интерполяции, будут ли результирующие рисунки конгруэнтны [4]?
  • Если дана pL-система и функция интерпретации, будет ли результирующая кривая замкнутой? Будет ли она самопересекающейся или древовидной? Будут ли некоторые отрезки нарисованы более одного раза?[4]?

Ответы на эти вопросы интересны не только с теоретической точки зрения, они полезны также при построении pL-систем для создания рисунков с заданными свойствами[4].

Типы L-систем[править | править вики-текст]

L-системы на вещественной оси R:

Общеизвестные L-системы на плоскости R2:

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

Литература[править | править вики-текст]

  • Grzegorz Rozenberg, Arto Salomaa. The mathematical theory of L systems. — New York: Academic Press, 1980. — ISBN 0-12-597140-0.
  • Przemysław Prusinkiewicz, Aristid Lindenmayer. The Algorithmic Beauty of Plants. — Springer, 2004.
  • Grzegorz Rozenberg, Arto Salomaa. Lindenmayer Systems: Impacts on Theoretical Computer Science, Computer Graphics, and Developmental Biology. — Springer-Verlag,, 1992. — ISBN 978-3-540-55320-5.
  • D.S. Ebert, F.K. Musgrave, D. Peachey, K. Perlin. Texturing and Modeling: A Procedural Approach. — Academic Press, 1994. — ISBN 0-12-228730-4.
  • Burry, Jane, Burry Mark. The New Mathematics of Architecture. — New York: Thames and Hudson, 2010.
  • Aristid Lindenmayer Mathematical models for cellular interaction in development // J. Theoret. Biology. — 1968. — Вып. 18. — С. 280—315.
  • P. Prusinkiewicz. Proceedings of Graphics Interface '86 / Vision Interface '86. — 1986. — С. 247−253..
  • Handbook of Formal Languages / G.Rozenberg, A.Salomaa. — Springer, 1997. — Т. 1(Word, Language, Grammar). — С. 253-328. — ISBN 978-3-642-63863-3.
  • Stelios Manousakis. Musical L-Systems. — The Hague: The Royal Conservatory, 2006. — (Master’s Thesis – Sonology).

Ссылки[править | править вики-текст]