Русский
Русский
English
Статистика
Реклама

Деревья

Из песочницы Nested Sets для Javascript

15.09.2020 22:15:12 | Автор: admin
На любом современном сайте (да и на сайтах постарше) встречаются вложенные структуры, иерархия объектов, деревья. Самый распространенный пример каталог.

Сегодня множество проектов разрабатывается с использованием Javascript. Как же хранить древовидные структцры в этом случае? Об этом и хотелось бы поговорить.

Сейчас передо мной стоит задача на основе параметров продукции составить иерархтческую структуру каталога.

Существуют различные алгоритмы для хранения деревьев и примером таких алгоритмов могут послужить Adjacency List, Matherialized Path, Nested Set и Closure Table.

Если посоветуете еще какие-то буду рад услышать и поучиться.

Когда я писал расширения для Joomla я часто использовал Nested Set. Именно в этой CMS я впервые встретил эту модель. Но теперь стек поменялся и сейчас это Javascript. Привычки остались, да и сайты на Joomla тоже. Нужно переносить данные на новые сервисы и проекты.

О Nested Sets довольно много информации в интернете и при желании вы всегда сможете ее найти, но тем не менее пару слов о этой модели данных я должен сказать.

Смысл Nested Set в том, что у каждого узла в иерархии существует пара ключей левый ключ и правый ключ. В зависимости от их значений осуществляется обход дерева. Положительными качествами алгоритма, на мой взгляд, является быстрота выборки данных. В этом алгоритме нет рекурсии. В то же время для изменения структуры дерева, добавления, удаления и переноса узлов, необходимо пересчитывать все ключи.

Чтобы использовать данные из Nested Set в проектах на Javascript нужен модуль который умел бы работать с этой моделью.

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

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

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

Хотя с точки зрения SEO появятся две страницы с разными URL и с одинаковым контентом, но это можно решить каноническими ссылками.

Если это не правильно прошу SEO-специалистов меня поправить.

В итоге я решил написать модуль и опубликовать его на npmjs.com.

Если кому-то пригодится буду очень рад.

Сейчас я продолжаю работать над ним и в планах реализовать перенос узла по дереву.

Вот ссылка на npm, где вы можете скачать пакет.

Вот ссылка на github, где вы можете скачать исходники.

Документация есть и там и там.

Буду рад любым комментариям.

Хороших вам проектов и интересных задач.
Подробнее..

Перевод Текстовый индекс по котировкам в памяти на Go

09.09.2020 14:04:11 | Автор: admin

Недавно понадобилось реализовать поиск по началу строки, по сути WHERE name LIKE 'начало%'. Это был поиск по названию биржевых символов (AAPL, AMZN, EUR/USD и пр.). Хотелось, чтобы поиск работал быстро, и не нагружал лишний раз БД. В итоге пришел к реализации поиска по дереву в памяти, об этом и расскажу.

В моем случае поиск выполняется по примерно 55000 коротким строкам (биржевым символам). То есть индекс по этим данным без проблем полностью ложится в оперативную память. Надо только аккуратно его сформировать, чтобы можно было быстро найти данные по запросу.

Ниже описана реализация поиска. Сразу отмечу, что это не сбалансированное дерево BTree, а простое дерево, где на каждом уровне очередной символ строки. Реализация такого варианта дерева очень проста и достаточно эффективна для многих задач, когда требуется индексировать не длинные строки.

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

Структура дерева

В каждом узле дерева храним дочерние элементы в виде сортированной хеш таблицы и само значение узла в виде списка.

Значение узла хранится именно в виде списка, чтобы проще было обрабатывать случаи, когда в искомых значениях могут встречаться разные данные с одинаковым ключом. В нашем случае это, например, символы на разных финансовых рынках:

  • AAA (BetaShares Australian High Interest Cash ETF, ASX),

  • AAA (All Active Asset Capital LTD, LSE).

Тогда мы запишем в Index.Data одну запись, внутри которой в Index.Data будет список из двух символов AAA.

В SearchIndex.Data можно хранить данные любой структуры. Таким образом, можно индексировать любые данные по строковому ключу.

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

Дерево необходимо построить один раз, далее по этому готовому индексу можно будет выполнять поиск.

Перед построением дерева ключи предварительно обрабатываются следующим образом.

  1. Все разделители заменяются на пробелы.

  2. Двойные пробелы заменяются на одинарные.

  3. Обрезаются пробелы по краям строк.

  4. Строки переводятся в нижний регистр.

  5. Схожие символы приводятся к единому формату, например, a.

  6. Исключаются стоп-слова (опционально).

После этого данные сортируются, по умолчанию по возрастанию ключа, в алфавитном порядке.

Затем отсортированные данные группируются по ключу, чтобы положить в Index.Data готовый список.

Теперь все готово для добавления данных в индекс. Наша задача теперь сформировать Index.Children таким образом, чтобы на каждом уровне дерева лежал очередной кусочек ключа (в нашем случае кусочек ключа это символ индексируемой строки). Например, если мы добавляем в индекс символ AAPL, то мы сформируем такую древовидную структуру (красная линия):

Тут на красной линии расположены на каждой вершине дерева элементы [A], [A], [P], [L]. В квадратных скобках обозначены ключи, которые используются на каждой вершине для индексации. Без скобок обозначены полные ключи, которые получаются при проходе от корня до вершины.

Поскольку мы формируем дерево, то добавление в индекс удобно делать рекурсивно. Добавляем промежуточные узлы, если их нет. И в лист дерева добавляем значение, которое мы индексируем.

Таким же образом последовательно добавляем в индекс все значения.

Поиск по дереву

Когда дерево уже построено, выполнить по нему поиск задача довольно простая. Для этого выполним три шага.

  1. Выполним предварительную обработку искомой строки тем же алгоритмом как обрабатывали ключи перед индексацией (см. выше).

  2. Найдем в дереве элемент, в котором ключ совпадает с искомой строкой.

  3. Далее последовательным перебором дочерних вершин получаем искомый результат.

Например, если в поиске мы вводим AA, то для описанного выше дерева ожидаем получить в результате такие строки в такой последовательности:

  • АА

  • ААА

  • АAAL

  • AAALF

  • AAAP

  • AAB

  • AAP

  • AAPJ

  • AAPL

  • AAPT

Чтобы получить этот результат, на первом шаге поиска мы перемещаемся в вершину AA. На втором шаге последовательно перебираем все дочерние вершины слева направо сверху вниз.

Поиск подходящего биржевого символа

Вышеперечисленный алгоритм хорошо подходит для поиска аналогичного WHERE name LIKE 'начало%'. Чтобы было удобно искать подходящий символ на финансовых рынках, этого оказалось недостаточно, и понадобилось учесть следующие моменты.

  • Если вводят в поиске EUR, то в выдаче должны быть EUR, EUR/USD, USD/EUR. То есть поиск должен работать не только с начала строки, но и с начала каждого слова в строке.

  • Поиск должен работать не только по названию символа, но также и по названию компании. Например, при вводе в поиске APL, надо выдать в результатах APL, AAPL (Apple).

  • Первыми выдавать в поиске популярные символы.

Чтобы для EUR, в выдачу попали не только EUR, EUR/USD, но и USD/EUR, решил класть в индекс по несколько экземпляров значений с разными ключами: подстроки начиная с каждого слова индексируемой строки. Например, при индексации строки USD/EUR, в индекс попадают следующие ключи: usd eur, eur. При индексации строки Grupo Financiero Galicia SA в индекс попадают ключи Grupo Financiero Galicia SA, Financiero Galicia SA, Galicia SA, SA.

Также чтобы учесть вышеописанные нюансы, понадобилось выполнять поиск в 4 этапа.

  1. Поиск символов по точному совпадению с искомой строкой.

  2. К полученным результатам найти и добавить наиболее популярные символы, у которых начало строки совпадает с введенной для поиска строкой.

  3. Поиск символов по названию компании, добавление результатов к полученным выше.

  4. Поиск символов у которых совпадает с искомой строкой только начало, и добавление этих результатов в итоговый список.

Чтобы получить нужный результат, удалось использовать описанный в предыдущих разделах индекс. Для этого создал три индекса.

  1. Индекс SearchSymbolIndex по символам со всех финансовых рынков.

  2. Индекс SearchPopularIndex только по популярным символам (10% от всех).

  3. Индекс SearchInstrumentIndex по названию компании.

Далее просто последовательный поиск по каждому индексу с небольшой разницей в критерии.

var searchedData []searchindex.SearchDatasearchedData = r.SearchSymbolIndex.Search(searchindex.SearchParams{    Text: key,    OutputSize: outputSize,    Matching: searchsymbol.Strict,})searchedData = r.SearchPopularIndex.Search(searchindex.SearchParams{    Text: key,    OutputSize: outputSize,    Matching: searchsymbol.Beginning,    StartValues: searchedData,})searchedData = r.SearchSymbolIndex.Search(searchindex.SearchParams{    Text: key,    OutputSize: outputSize,    Matching: searchindex.Beginning,    StartValues: searchedData,})searchedData = r.SearchInstrumentIndex.Search(searchindex.SearchParams{    Text: key,    OutputSize: outputSize,    Matching: searchindex.Beginning,    StartValues: searchedData,})

StartValues значения, найденные на предыдущем этапе, они передаются на следующий этап поиска, чтобы в выдачу не добавлялись дубликаты, и не выполнялись лишние итерации поиска, если уже набралось достаточно данных (OutputSize).

searchindex.Strict поиск точных совпадений.

searchindex.Beginning поиск совпадений по началу строки.

Итого

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

Больших бенчмарков по производительности не делал, но на моих данных в 55000 строк создание трех индексов занимает примерно 2 секунды, это с учетом выборки из БД и дополнительных действий. А поиск в 4 последовательные итерации в трех индексах выполняется за 100-200 наносекунд (это если исключить время на обработку http запроса и считать только время поиска), что для моей задачи более чем достаточно.

Код в виде готового пакета: https://github.com/twelvedata/searchindex

Этот поиск сейчас используется в финансовом апи для разработчиков, пример можно посмотреть на этой странице, где его можно попробовать вживую.

Подробнее..

Перевод Почему единственный вид деревьев не победил все остальные?

21.09.2020 10:09:24 | Автор: admin

Лес красив, дремуч, высок, писал Роберт Фрост. Этот ямб вспоминается мне каждый раз, когда я начинаю путь по расположенной недалеко от моего дома лесной тропе. Тропу назвали в честь Фроста, который провёл несколько лет в этой части Массачусетса, обучая мальчиков в блейзерах с медными пуговицами из Амхерстского колледжа. Прогуливался ли поэт среди именно этих деревьев? Такое возможно, хотя тогда, век назад, они были ещё молодняком. Как бы то ни было, если он и останавливался возле этого леса, то ненадолго, ведь ждут меня сегодня в срок, а до ночлега путь далек.

Когда я шёл тропой Фроста, она привела меня к непримечательной лужайке в лесистой местности Северо-запада, зажатой между шоссе, домами и городской свалкой. Она не была ни дремучей, ни высокой, и ощущение близости людей никогда не пропадало. Это не был девственный лес, однако он был достаточно лесистым не только для того, чтобы вспомнить рифмы популярных поэтов, но и задаться сложными вопросами о деревьях и лесах вопросами, которые волновали меня уже многие годы. Почему деревья такие высокие? Почему они не становятся выше? Почему их листья имеют такое разнообразие форм и размеров? Почему деревья являются деревьями (в том смысле, который используется в теории графов), а не имеют какую-то другую структуру? И был ещё один вопрос, который бы я хотел обсудить сегодня:

Сегодняшний вопрос: почему в смешанном лесу виды деревьев остаются смешанными?

Двигаясь по тропе Фроста, я провёл краткую перепись, зафиксировав тсугу канадскую, сахарный клён и не менее трёх видов дуба (красный, белый и болотный), бук и берёзу, карию яйцевидную, веймутову сосну и ещё два дерева, которые не смог идентифицировать даже с помощью руководства Питерсона и iNaturalist. Ближайшем к моему дому лесу доминирует тсуга канадская, но по склонам холмов несколькими милями дальше по тропе более распространены широколистные виды. На фотографии ниже показан перевал (который местные называют Notch) между двумя пиками хребта Холиок к югу от Амхерста. Я сделал этот снимок 15 октября прошлого года, в то время года, когда благодаря осенним цветам удобнее определять разнообразие видов.


Подобные леса покрывают большую часть восточной половины США. Виды деревьев варьируются со сменой широты и высоты, но любом месте полога леса чаще всего содержится от восьми до десяти видов. Отдельные изолированные участки ещё богаче; в некоторых долинах южных Аппалачей, называемых cove forests, насчитывается до 25 составляющих полог видов. А тропические дождевые леса населены сотней или даже двумястами видами высоких деревьев.

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

Этот принцип впервые был описан Гарретом Хардином. Его математическую формулировку, вероятно, создал Вито Вольтерра.

Экологи называют эту идею принципом конкурентного вытеснения. Он гласит, что два или более вида, конкурирующих за одни ресурсы, не могут постоянно сосуществовать в одной среде обитания. Со временем все, кроме одного конкурента, придут к локальному вымиранию. Кажется, что деревья полога леса конкурируют за одинаковые ресурсы солнечный свет, CO2, воду, различные минеральные питательные вещества, поэтому постоянство смешанных лесов требует объяснения.

Вот небольшое демо конкурентного вытеснения. Два вида деревьев давайте назовём их оливками и апельсинами делят между собой один кусок леса, квадратную площадку, вмещающую 625 деревьев.

Исходный код шести компьютерных симуляций из этой статьи выложен на GitHub.


Изначально каждой точке случайным образом назначается дерево одного или другого вида. При нажатии на кнопку Start (или касании массива деревьев) вы запускаете цикл смертей и обновлений. На каждом этапе времени выбирается одно дерево, совершенно случайно и безотносительно его вида, и попадает под топор. Затем выбирается другое дерево в качестве родителя замены, определяя таким образом его вид. Однако этот выбор не полностью случаен, у него присутствует смещённость. Один из видов лучше приспособлен к среде, использует доступные ресурсы эффективнее, а потому имеет повышенный шанс на воспроизводство и размещении своего отпрыска на свободной точке. В панели управления под массивом деревьев есть ползунок fitness bias; при сдвиге влево он отдаёт предпочтение апельсинам, вправо оливкам.

Результат этого эксперимента не должен вас удивлять. Два вида играют в игру с нулевой суммой: какую бы территорию ни захватили оливки, апельсины должны с неё пропасть, и наоборот. Точка за точкой, более приспособленный вид захватывает всё. Если преимущество очень незначительно, то процесс может занять долгое время, но в конечном итоге менее эффективный организм всегда оказывается уничтоженным. (Что если два вида полностью равны? Чуть позже я вернусь к этому вопросу, а пока давайте просто притворимся, что такого никогда не бывает. И я хитро модифицировал симуляцию, чтобы вы не могли установить смещение на ноль.)

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


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

Смещая ползунок влево или вправо, мы меняем баланс железа и кальция в среде. Соотношение 60:40 в пользу железа сдвинет равновесие между двумя видами деревьев, позволив оливкам занять больше территории. Но пока соотношение ресурсов не становится слишком большим, находящемуся в меньшинстве виду не грозит вымирание. Два вида деревьев придерживаются принципа живи и дай жить остальным.

В терминологии экологии, виды оливковых и апельсиновых деревьев избежали правила конкурентного вытеснения, потому что занимают отдельные ниши (роли) в экосистеме. Они являются специалистами, предпочитающими использовать разные ресурсы. Ниши не обязаны быть совершенно раздельными. В показанной выше симуляции они частично пересекаются: оливкам наряду с железом нужен и кальций, но только 25%; апельсиновые деревья имеют зеркально противоположные требования.

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

Принцип разбиения экосистемы на множество ниш устоявшаяся практика в сфере биологии. Именно так Дарвин объяснял разнообразие вьюрков на Галапагосских островах, где десяток видов различаются по среде обитания (почва, кустарники, деревья) или питанию (насекомые, зёрна и орехи разного размера). Лесные деревья могут быть организованы похожим образом, с различными микросредами, подходящими разным видам. Процесс создания такого разнообразного сообщества называется образованием экологических ниш.

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

Образование экологических ниш особенно ошеломляет в тропиках, где требуются от сотни и больше отдельных ограничивающих ресурсов. Каждый вид деревьев заведует собственной крошечной монополией, заявляя права на какой-нибудь фактор среды, который всем остальным совершенно не важен. В то же время все деревья ожесточённо конкурируют за самые важные ресурсы, а именно солнечный свет и воду. Каждое дерево стремится занять пустоту в пологе леса с прямым доступом к небу, где оно сможет расправить свои листья и ежедневно впитывать фотоны. Учитывая экзистенциальную важность победы в этой конкуренции за свет, кажется странным связывать разнообразие лесных сообществ с борьбой за другие, менее важные ресурсы.

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

Эта идея возвращает нас к тому вопросу, который я обошёл выше: что случится, если два конкурирующих вида имеют совершенно одинаковую приспособленность? Ответ будет одинаковым и для двух, и для десяти видов, поэтому ради визуального разнообразия мы рассмотрим более обширное сообщество.


Если вы запустите симуляцию и терпеливо дождётесь её завершения, то увидите монохромный массив деревьев. Я не могу угадать, каким будет единственный цвет, оставшийся на вашем экране или, другими словами, какой вид захватит весь участок леса, но я знаю, что останется только один вид. Остальные девять вымрут. В этом случае такой результат может считаться как минимум довольно неожиданным. Ранее мы выяснили, что если вид имеет даже малейшее преимущество перед соседями, то он захватит всю систему. Теперь мы видим, что не требуется даже преимущество. Даже когда все игроки абсолютно равны, один из них станет царём горы, а все остальные будут уничтожены. Жестоко, правда?

Вот график одного прогона программы, демонстрирующий количество представителей каждого вида как функцию от времени:


Вначале все 10 видов представлены приблизительно равным количеством, сгруппированным рядом со средней численностью, равной $625/10$. После запуска программы сетка начинает быстро и многократно менять цвета. Однако за первые 70 000 шагов времени все, кроме трёх видов, исчезают. Три выживших вида по очереди получают лидерство в процессе распространения контрастных цветов по массиву. Затем, приблизительно спустя 250 000 шагов, вид, представленный ярко-зелёной линией снижается до нулевой популяции, то есть вымирания. Последний этап борьбы один на один очень неравномерный оранжевый вид близок к полному доминированию, а бордовый барахтается рядом с границей вымирания, и всё-же это перетягивание каната длится ещё 100 000 шагов. (Как только система достигает состояния моновида, ничего не может больше измениться, поэтому программа останавливает выполнение.)

Такой перекошенный результат нельзя объяснить каким-нибудь скрытым смещением в алгоритме. В любой момент времени для всех видов вероятность получения нового представителя вида полностью равна вероятности потери представителя. Давайте ненадолго приостановимся, чтобы убедиться в этом факте. Допустим, вид $X$ имеет популяцию $x$, которая должна находиться в интервале $0 \le x \le 625$. Случайно выбранное дерево будет относиться к виду $X$ с вероятностью $x/625$; следовательно, вероятность того, что дерево относится к какому-то другому виду, должна быть $(625 - x)/625$. $X$ получает одного представителя, если это заменяющий вид, но не вид-жертва, такое событие имеет совместную вероятность $x(625 - x)/625$. $X$ теряет одного представителя, если он является жертвой, но не заменой, что имеет ту же вероятность.

Это честная игра, нет никаких шулерских костей. Тем не менее, кто-то срывает джекпот, а остальные игроки каждый раз теряют всё.

Спонтанное угасание разнообразия видов на этом симулируемом участке целиком вызвано случайными флуктуациями. Взглянем на популяцию $x$ как на метку, случайно блуждающую по отрезку прямой, где с одного конца $0$, а с другого $625$. На каждом шаге времени метка с равной вероятностью сдвигается на одну единицу вправо $(+1)$ или влево $(-1)$; при достижении любого из концов отрезка игра завершается. Наиболее фундаментальным фактом о таком блуждании является то, что оно всегда заканчивается. Блуждание, бесконечно колеблющееся между двумя границами, не невозможно, но имеет вероятность $0$; столкновение с одной или другой стеной имеет вероятность $1$.

Какой будет ожидаемая длительность такого случайного блуждания? В простейшем случае с одной меткой ожидаемое количество шагов, начавшихся в позиции $x$, равно $x(625 - x)$. Это выражение имеет максимум, когда блуждание начинается в середине отрезка прямой; максимальная длительность немного меньше $100000$ шагов. В симуляции леса с десятью видами ситуация более сложна, потому что коррелируют, или, скорее, антикоррелируют, несколько блужданий: когда одна метка делает шаг вправо, другая должна сдвинуться влево. Вычислительные эксперименты дают нам понять, что медианное время, необходимое десяти видам для сокращения до одного, приблизительно равно $320000$ шагов.

Из этих вычислительных моделей сложно представить, как нейтральный экологический сдвиг может стать спасителем разнообразия леса. Напротив, он, похоже, гарантирует, что в конечном итоге у нас останется монокультура один вид уничтожит все остальные. Но это ещё не конец истории.

Здесь стоит не забывать о временном масштабе процесса. В симуляции время измеряется подсчётом циклов смертей и замен деревьев леса. Не знаю точно, как преобразовать это в календарные годы, но могу предположить, что 320 тысяч событий смертей и замен для 625 деревьев может занять 50 тысяч и более лет. У нас в Новой Англии это очень долгое время для жизни леса. Весь существующий ландшафт был очищен Лаурентидским ледниковым щитом всего 20 тысяч лет назад. Если местные леса теряют виды со скоростью случайного дрейфа, то у нас ещё не было времени дойти до конца игры.

Проблема в том, что это утверждение подразумевает, что в начале леса разнообразны и постепенно развиваются в сторону монокультуры, что не подтверждается наблюдениями. Скорее наоборот, похоже, разнообразие со временем увеличивается. Cove forests штата Теннесси, которые намного старше лесов Новой Англии, содержат больше, а не меньше видов. А сверхразнообразная экосистема тропических дождевых лесов, предположительно, существует миллионы лет.

Несмотря на эти концептуальные помехи, многие экологи активно защищают идею нейтрального экологического дрейфа. Наиболее примечательным примером является книга Стивена Хаббелла The Unified Neutral Theory of Biodiversity and Biogeography 2001 года. Основным аспектом защиты этой идеи Хаббеллом (если я понял его правильно) является то, что 625 деревьев не составляют лес, и уж точно не образуют всю экосистему планеты.

На теорию нейтрального дрейфа Хаббелла вдохновили предыдущие исследования биогеографии островов, в частности, совместная работа Роберта Макартура и Эдварда Уилсона, проводившаяся в 1960-х. Предположим, что наш небольшой участок из $625$ деревьев растёт на отделённом от континента острове. По большей мере остров эволюционирет в изоляции, но время от времени птица приносит семя из гораздо большего леса на материке. Мы можем симулировать эти редкие события, добавив в модель нейтрального дрейфа возможность иммиграции. В показанном ниже демо ползунок управляет уровнем иммиграции. При взятом по умолчанию значении $1/100$ каждое сотое приходящее на замену дерево берётся не из местного леса, а из стабильного резерва, в котором все $10$ видов имеют равную вероятность выбора.


В течение первых нескольких тысяч циклов эволюция леса происходит почти так же, как в модели с обычным дрейфом. Сначала краткий период полного хаоса, затем по лесу распространяются волны цветов, он становится то розовым, то бордовым, то ярко-зелёным. Отличие в том, что ни один из этих экспансивных видов никогда не сможет захватить весь массив целиком. Как показано на графике ниже, они никогда сильно не превышают 50% от общей популяции, а потом уходят в тень других видов. Позже ещё один цвет деревьев пытается создать империю, но встречает ту же судьбу. (Так как у этого процесса нет чёткой точки завершения, симуляция останавливается спустя 500 000 циклов.)


Иммиграция, даже при низких уровнях, обеспечивает качественное изменение в поведении модели и судьбе леса. Важное отличие заключается в том, что мы больше не можем сказать, что вымирание происходит навсегда. Вид может исчезнуть из массива с 625 деревьями, но рано или поздно будет заново импортирован из постоянного резерва. Следовательно, вопрос заключается не в том, живёт вид или вымер, а в том, есть он или нет на текущий момент времени. При коэффициенте иммиграции $1/100$ среднее количество существующих видов примерно равно $9,6$, то есть ни один из них не исчезает надолго.

При более высоком уровне иммиграции 10 видов остаются тщательно перемешанными, и ни один из них не делает никаких успехов на пути к мировому доминированию. С другой стороны, они имеют небольшой риск исчезновения, хоть и временного. Перетащите ползунок до конца влево, установив коэффициент иммиграции на $1/10$, и массив леса превратится в случайно мерцающие огоньки. На графике ниже нет ни одного случая вымирания.


Если перетащить ползунок до упора в другую сторону, то менее частая иммиграция позволит распределению видов намного сильнее отдалиться от состояния равенства. На графике, где иммигрант появляется на каждом $1000$-м цикле, в популяции бОльшую часть времени доминируют один-два вида; другие виды часто находятся на грани вымирания или за ним, но рано или поздно возвращаются. Среднее количество живых видов примерно равно $4,3$, а иногда остаётся всего два вида.


При коэффициенте $1/10000$ влияние иммиграции едва заметно. Как и в моделях без иммиграции, один вид захватывает весь участок; в показанном ниже примере для этого потребовалось около $400000$ шагов. После этого возникающие изредка события иммиграции создают небольшие всплески на кривой, но другой вид сможет заменить победителя ещё очень нескоро.


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

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

Хаббелл отвечает на последний вопрос, переворачивая его с ног на голову. Сам факт того, что мы наблюдаем сосуществование, подразумевает равенство:

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

Герберт Спенсер провозгласил выживание наиболее приспособленного. У нас есть следствие из этого девиза: если все они выжили, то все должны быть одинаково приспособлены.

А теперь нечто совершенно иное.

Ещё одна теория разнообразия лесов была разработана специально как ответ на самый сложный вопрос загадку чрезвычайного разнообразия деревьев в тропических экосистемах. В начале 1970-х Джозеф Хёрд Коннелл и Дэниел Хант Дженсен, полевые биологи, работавшие независимо друг от друга в разных частях света, почти одновременно пришли к одинаковой идее. Они предположили, что в тропических лесах деревья применяют социальное дистанцирование как защитную меру против заражений, и это стимулирует разнообразие.

(Фраза социальное дистанцирование не встречается в написанных пятьдесят лет назад работах Коннелла и Дженсена, но сегодня я не могу удержаться от искушения описать их теорию таким образом.)

Выживать в тропическом дождевом лесу непросто. Деревья находятся под давлением частых атак банд мародёров: хищников, паразитов и патогенов. (Коннелл объединил всех этих злодеев общим названием враги.) Многие из врагов являются специалистами, нацеленными на деревья только одного вида. Специализацию можно объяснить конкурентным вытеснением: каждый вид деревьев становится уникальным ресурсом, поддерживающим один тип врага.

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


Ростки, находящиеся на большем расстоянии от родителя, имеют бОльшую вероятность остаться необнаруженными, пока они не вырастут и не станут достаточно устойчивыми, чтобы сопротивляться нападениям. Другими словами, эволюция, вероятно, благоволит тому яблоку, которое упало подальше от яблоньки. Дженсен иллюстрирует эту идею графической моделью, похожей на показанную выше. С увеличением расстояния от родителя вероятность появления и укоренения семени становится меньше (красная кривая), однако вероятность того, что такой росток доживёт до зрелости, становится больше (синяя кривая). Общая вероятность успешной репродукции является произведением этих двух факторов (фиолетовая кривая); её вершина находится на пересечении красной и синей кривых.

Теория Коннелла-Дженсена прогнозирует, что деревья одного вида будут обширно распределены по лесу, оставляя много пространства между собой для деревьев других видов, которые тоже будут иметь столь же рассеянное распределение. Этот процесс приводит к антикластеризации: деревья одного вида в среднем находятся друг от друга дальше, чем они находились бы в совершенно случайной структуре. Этот паттерн был подмечен Альфредом Расселом Уоллесом в 1878 году на основании его долгого опыта работы в тропиках:

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

В моей искусственной модели процесса социального дистанцирования реализовано простое правило. Когда дерево умирает, его не может заменить другое дерево того же вида, и эта замена не может совпадать по виду с любым из восьми ближайших соседей, окружающих освободившееся место. Поэтому между деревьями одного вида должно находиться хотя бы одно другое дерево. Иными словами, каждое дерево имеет вокруг себя зону отчуждения, в которой не могут расти другие деревья того же вида.


Оказывается, социальное дистанцирование довольно эффективный способ сохранения разнообразия. При нажатии на Start модель оживает и начинает лихорадочно работать, мерцая, как передняя панель компьютера из голливудского фильма 50-х годов. Потом она просто продолжает мерцать, больше ничего особого не происходит. Нет ни распространяющихся волн цветов, когда успешные виды захватывают территорию, ни вымирания. Флуктуации размеров популяций даже меньше, чем они были бы в совершенно случайном и равномерном размещении видов в массиве. Эта стабильность очевидна из показанного ниже графика, на котором десять видов держатся близко к средней численности 62,5:


Когда я закончил писать эту программу и впервые нажал на кнопку, то ожидал увидеть совсем не долгосрочное выживание всех десяти видов.


На мои ожидания повлияли карандашные зарисовки. Я убедился, что всего четырёх цветов достаточно для создания паттерна, в котором нет двух деревьев одного цвета, соседствующих друг с другом по горизонтали, вертикали или по обеим диагоналям. Один из таких паттернов показан выше. Я подозревал, что протокол социального дистанцирования может заставить модель конденсироваться в такое кристаллическое состояние с потерей видов, которые не выстроены в повторяющемся узоре. Я ошибался. Хотя четыре это и в самом деле минимальное количество цветов для двухмерной решётки с социальным дистанцированием, в алгоритме нет ничего, что стимулировало бы систему к поиску минимума.

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

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

Коннелл и Дженсен предполагали гораздо более обширные зоны отчуждения, а значит, и больший перечень видов. Для реализации такой модели нужно гораздо больше вычислений. В недавней статье Талла Леви и других авторов рассказывается о такой симуляции. Они выяснили, что количество выживших видов и их пространственное распределение остаются достаточно стабильными в течение долгих периодов времени (200 миллиардов событий смены деревьев).

Может ли механизм Коннелла-Дженсена работать и в лесах зоны умеренного климата? Как и в тропиках, деревья на более высоких широтах имеют специализированных врагов, и некоторые из них печально известны переносчики голландской болезни вяза и эндотиевого рака коры каштана съедобного, ясеневая изумрудная узкотелая златка, гусеницы непарного шелкопряда, уничтожающие листву дубов. Тсуга рядом с моим домом выдерживает яростные атаки высасывающего древесные соки жука хермеса. То есть силы, управляющие ростом разнообразия и антикластеризацией по модели Коннелла-Дженсена, здесь тоже присутствуют. Однако наблюдаемая пространственная структура северных лесов немного отличается. Социальное дистанцирование здесь не сохраняется. Распределение деревьев обычно немного кучкообразное, представители одного вида собираются в небольшие рощицы.

Управляемая заражениями диверсификация это увлекательная идея, однако как и остальные вышеупомянутые теории, она имеет определённые проблемы с правдоподобностью. В случае с образованием экологических ниш нам необходимо находить для каждого вида уникальный ограничивающий ресурс. В случае нейтрального дрейфа нам нужно убедиться, что отбор действительно нейтральный и присваивает равную приспособленность деревьям, которые выглядят очень разными. В модели Коннелла-Дженсена нам нужен для каждого вида специализированный вредитель, достаточно мощный, чтобы подавлять все соседние ростки. Может ли быть правдой, что у каждого дерева есть собственный заклятый враг?

Также существуют основания сомневаться в устойчивости модели, её сопротивлению к разрушению. Предположим, что в тропическом лесу появляется инвазивный вид новое для континента дерево, не имеющее врагов поблизости. Что тогда произойдёт? Показанная ниже программа предлагает нам ответ. Запустите её, а затем нажмите на кнопку Invade.

Можете нажать Invade несколько раз, потому что новоприбывший вид может вымереть ещё до того, как успеет закрепиться. Также обратите внимание на то, что я замедлил эту симуляцию, потому что в противном случае она бы завершилась за мгновение.


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

Ещё одна полусерьёзная мысль о теории Коннелла-Дженсена: в войне между деревьями и их врагами человечество определённо выбрало одну из сторон. Мы бы с радостью уничтожили всех этих насекомых, грибы и других убивающих деревья вредителей, если бы знали, как это сделать. Все были бы рады вернуть вязы и каштаны, спасти восточные тсуги, прежде чем станет слишком поздно. В этом вопросе я разделяю убеждения обнимающих деревья хиппи. Но если Коннелл и Дженсен правы, и их теория применима и к лесам зоны умеренного климата, то уничтожение всех врагов на самом деле приведёт к разрушительному коллапсу разнообразия деревьев. Без давления вредителей за дело возьмётся конкурентное вытеснение, и повсюду у нас останутся леса из одного вида деревьев.

Разнообразие видов в лесах теперь сравнимо с разнообразием теорий в области биологии. В статье я рассмотрел три идеи образование экологических ниш, нейтральный дрейф и социальное дистанцирование; похоже, в сознании экологов все они сосуществуют. И почему бы и нет? Каждая из теорий оказалась успешной в том смысле, что она способна преодолеть конкурентное вытеснение. Кроме того, каждая теория делает чёткие прогнозы. В случае образования ниш каждый вид должен иметь уникальный ограничивающий ресурс. Нейтральный дрейф генерирует необычную динамику популяций, при которой виды постоянно появляются и исчезают, несмотря на то, что общее количество видов остаётся стабильным. Из социального дистанцирования следует пространственная антикластеризация.

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

Было проведено уже довольно много экспериментальных тестов конкурентного вытеснения. Например, Томас Парк с коллегами проводили длившуюся десяток лет серию экспериментов с двумя близкородственными видами мучного хрущака. В конечном итоге всегда преобладал один или другой вид. В 1969 году Франциско Айала написал о похожем эксперименте с фруктовыми мушками, в котором он наблюдал сосуществование при условиях, которые, как считалось, делают его невозможным. Его работа вызвала споры, но в конечном итоге результат привёл не к отказу от теории, а к совершенствованию математического описания того, к чему применимо вытеснение.

Разве не было бы прекрасно провести такие эксперименты с деревьями? К сожалению, их не так просто вырастить в пробирке. А проведение исследований множества поколений организмов, живущих дольше нас сложная задача. В случае с мучным хрущаком у Парка было время понаблюдать в течение десятка лет за более 100 поколений. В случае деревьев аналогичный эксперимент мог бы занять 10 000 лет. Но полевые исследователи-биологи изобретательный народ, и я уверен, что они что-нибудь придумают. Тем временем, я бы хотел сказать ещё несколько слов о теоретическом, математическом и вычислительном подходах к этой проблеме.

Экология стала серьёзной математической дисциплиной в 1920-х, после работ Альфреда Джеймса Лотка и Вито Вольтерры. Чтобы объяснить их методику и идеи, можно начать со знакомого нам факта: организмы воспроизводят себя, вызывая рост популяций. В математическом виде это наблюдение превращается в дифференциальное уравнение:

$\frac{d x}{d t} = \alpha x,$


которое гласит, что мгновенная скорость изменения в популяции $x$ пропорциональна самому $x$ чем больше представителей вида, тем больше их появится. Константу пропорциональности $\alpha$ называют собственным коэффициентом воспроизводства; этот коэффициент наблюдается, когда ничто не ограничивает рост популяции и не мешает ему. Уравнение имеет решение, дающее нам $x$ как функцию от $t$:

$x(t) = x_0 e^{\alpha t},$


где $x_0$ исходная популяция. Это рецепт неограниченного экспоненциального роста (если считать, что $\alpha$ положительна). В конечном мире такой рост не может длиться вечно, но это не должно нас сейчас беспокоить.

Давайте введём второй вид $y$, подчиняющийся тому же типу закона роста, но имеющий свой коэффициент воспроизводства $\beta$. Теперь мы можем задаться вопросом, что произойдёт, если эти два вида каким-то образом взаимодействуют. Лотка и Вольтерра (работая независимо друг от друга) ответили на него следующей парой уравнений:

$\begin{align} \frac{d x}{d t} &= \alpha x +\gamma x y\\ \frac{d y}{d t} &= \beta y + \delta x y \end{align}$


Решения этой системы не так просты, как решения для неограниченного роста одного вида. Происходящее зависит от знаков и величин четырёх констант: $\alpha$, $\beta$, $\gamma$ и $\delta$. Во всех случаях мы можем взять $\alpha$ и $\beta$ как положительные, потому что в противном случае вид вымрет. При этом остаётся четыре сочетания для $\gamma$ и $\delta$, коэффициентов перекрёстных членов $xy$:

  • $(\gamma +, \delta -)$: система хищник-жертва, в которой $x$ это хищник; $x$ получает преимущество, а $y$ страдает, когда произведение $xy$ велико (т.е. оба вида находятся в изобилии).
  • $(\gamma -, \delta +)$: система хищник-жертва, где $y$ хищник.
  • $(\gamma +, \delta +)$: симбиотическая или мутуалистическая система, в которой присутствие каждого вида идёт на пользу как другому, так и себе.
  • $(\gamma -, \delta -)$: конкуренция, при которой каждый вид замедляет рост другого.

В любой момент $t$ состояние системы из двух видов можно представить как точку на плоскости $x, y$, координатами которой являются уровни двух популяций. Для некоторых сочетаний параметров $\alpha$, $\beta$, $\gamma$, $\delta$ существует точка стабильного равновесия. Когда система достигает этой точки, она остаётся точкой, и возвращается к этой точек после любых незначительных колебаний. Другие равновесия нестабильны: малейшее отклонение от точек равновесия приводит к значительному сдвигу уровней популяций. А по-настоящему интересные случаи не имеют неподвижной точки; состояние системы описывает замкнутую петлю на плоскости $x, y$, постоянно повторяя весь цикл состояний. Эти циклы соответствуют колебаниям уровней двух популяций. Подобные колебания наблюдались во многих системах хищник-жертва. На самом деле, именно любопытство, вызванное периодическим увеличением и сокращением популяций в канадском пушном промысле и рыболовстве Адриатики, вдохновило Лотка и Вольтерру на работу над этой проблемой.

1960-е и 70-е годы принесли новые открытия. Исследования уравнений, очень похожих на систему Лотка-Вольтерры, раскрыли явление детерминированного хаоса, при котором точка, представляющая состояние системы, движется по чрезвычайно сложной траектории, однако это блуждание не случайно. За этим открытием последовали оживлённые дебаты о сложности и стабильности в экосистемах. Можно ли найти хаос в природных популяциях? Сообщество из множества видов и со множеством взаимосвязей между ними более или менее стабильно, чем более простое?

Если смотреть на это как на абстрактную математику, то в этих уравнениях есть большая красота, но иногда сопоставление математики с биологией происходит с трудом. Например, когда уравнения Лотка-Вольтерры были применены к видам, конкурирующим за ресурсы, в модели сами ресурсы не были представлены. Математическая структура описывает нечто больше похожее на взаимодействие хищник-хищник два вида, которые едят друг друга.

Даже сами организмы представлены в этих моделях всего лишь призрачно. Дифференциальные уравнения определены на множестве вещественных чисел и дают нам уровни или плотности популяций, но не отдельных растений или животных тех дискретных объектов, которые мы считаем как целые числа. Выбор типа чисел не так важен при больших размерах популяций, но приводит к странностям, когда популяция падает, допустим до 0,001 одного миллидерева. Использование уравнений в конечных разностях вместо дифференциальных уравнений позволяет избежать этой проблемы, но вычисления становятся более запутанными.

Ещё одна проблема заключается в том, что уравнения строго детерминированы. При одинаковых входящих данных мы всегда будем получать совершенно одинаковые результаты, даже в хаотической модели. Детерминизм исключает возможность моделирования чего-то типа нейтрального экологического дрейфа. Но и эту проблему можно решить при помощи стохастических дифференциальных уравнений, содержащих в себе источник шума или неопределённости. В моделях подобного типа получаемые ответы являются не числами, а распределениями вероятностей. Мы узнаём не популяцию $x$ в момент времени $t$, а вероятность $P(x, t)$ в распределении с определённым средним и дисперсией. Ещё один подход, названный Markov Chain Monte Carlo (MCMC), использует источник случайности для получения выборок из таких распределений. Однако метод MCMC переносит нас в мир вычислительных, а не математических моделей.

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

Шесть небольших моделей, включённых в эту статью, в основном служат в качестве визуализаций; по большей мере их вычислительные затраты заключаются в рисовании на экране цветных точек. Но реализация более масштабных и амбициозных моделей вполне возможна, примером этого стала работа упомянутая выше работа Таала Леви с коллегами.

Однако несмотря на бОльшую простоту создания вычислительных моделей, их может быть сложнее интерпретировать. Если запустить модель один раз и в ней вымрет вид $X$, то много ли информации можно из этого получить? Не особо. В следующем прогоне может оказаться, что $X$ и $Y$ сосуществуют. Чтобы делать правильные выводы, нужно собрать статистику на большом количестве прогонов, то есть ответ снова принимает вид распределения вероятностей.

Конкретность и явность моделей Монте-Карло обычно являются достоинством, но они имеют и тёмную сторону. Если модель дифференциальных уравнений может применяться к любой крупной популяции, то такое туманное описание может и не быть применимо в вычислительном контексте. Числу нужно дать имя, пусть этот выбор будет и произвольным. Размер моих моделей леса (625 деревьев) был выбран только для удобства. В более масштабной сетке, допустим $100 \times 100$, нам потребуется ждать миллионы шагов времени, прежде чем произойдёт что-то интересное. Разумеется, та же проблема возникает с экспериментами в лаборатории и в поле.

Оба типа модели всегда подвержены риску чрезмерного упрощения. Иногда из моделей выбрасываются важные аспекты. В случае моделей леса меня напрягает то, что у деревьев нет истории жизни. Одно дерево умирает, а другое сразу же появляется на его месте, полностью выросшее. Также в моделях нет опыления и распространения семян, а также редких событий (ураганов и пожаров), способных менять форму целого леса. Узнаем ли мы больше, если все эти аспекты жизни в лесу имели место в уравнениях или алгоритмах? Возможно, но где та черта, возле которой нам нужно остановиться?

Моё знакомство с моделями в экологии началось с книги Джона Мейнарда Смита Models in Ecology, опубликованной в 1974 году. Недавно я перечитал её, узнав больше, чем в первый раз. Мейнард Смит указывает на различие между симуляциями, полезными для ответов на вопросы о конкретных задачах или ситуациях, и моделями, полезными для тестирования теорий. Он рекомендует следующее: Хорошая симуляция должна содержать как можно больше подробностей, а хорошая модель как можно меньше.

Дополнительное чтение


Ayala, F. J. 1969. Experimental invalidation of the principle of competitive exclusion. Nature 224:10761079.

Clark, James S. 2010. Individuals and the variation needed for high species diversity in forest trees. Science 327:11291132.

Connell, J. H. 1971. On the role of natural enemies in preventing competitive exclusion in some marine animals and in rain forest trees. In Dynamics of Populations, P. J. Den Boer and G. Gradwell, eds., Wageningen, pp. 298312.

Gilpin, Michael E., and Keith E. Justice. 1972. Reinterpretation of the invalidation of the principle of competitive exclusion. Nature 236:273301.

Hardin, Garrett. 1960. The competitive exclusion principle. Science 131(3409): 12921297. (История первых сорока лет развития экологии. Кому-то нужно описать следующие шестьдесят.)

Hubbell, Stephen P. 2001. The Unified Neutral Theory of Biodiversity and Biogeography. Princeton, NJ: Princeton University Press.

Hutchinson, G. E. 1959. Homage to Santa Rosalia, or why are there so many kinds of animals? The American Naturalist 93:145159.

Janzen, Daniel H. 1970. Herbivores and the number of tree species in tropical forests. The American Naturalist 104(940):501528.

Kricher, John. C. 1988. A Field Guide to Eastern Forests, North America. The Peterson Field Guide Series. Illustrated by Gordon Morrison. Boston: Houghton Mifflin.

Levi, Taal, Michael Barfield, Shane Barrantes, Christopher Sullivan, Robert D. Holt, and John Terborgh. 2019. Tropical forests can maintain hyperdiversity because of enemies. Proceedings of the National Academy of Sciences of the USA 116(2):581586.

Levin, Simon A. 1970. Community equilibria and stability, and an extension of the competitive exclusion principle. The American Naturalist, 104(939):413423.

MacArthur, R. H., and E. O. Wilson. 1967. The Theory of Island Biogeography. Monographs in Population Biology. Princeton University Press, Princeton, NJ.

May, Robert M. 1973. Qualitative stability in model ecosystems. Ecology, 54(3):638641.

Maynard Smith, J. 1974. Models in Ecology. Cambridge: Cambridge University Press.

Richards, Paul W. 1973. The tropical rain forest. Scientific American 229(6):5867.

Schupp, Eugene W. 1992. The Janzen-Connell model for tropical tree diversity: population implications and the importance of spatial scale. The American Naturalist 140(3):526530.

Strobeck, Curtis. 1973. N species competition. Ecology, 54(3):650654.

Tilman, David. 2004. Niche tradeoffs, neutrality, and community structure: A stochastic theory of resource competition, invasion, and community assembly. Proceedings of the National Academy of Sciences of the USA 101(30):1085410861.

Wallace, Alfred R. 1878. Tropical Nature, and Other Essays. London: Macmillan and Company.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru