Слепой часовщик. Как эволюция доказывает отсутствие замысла во Вселенной - Докинз Ричард. Страница 19
Принимая это во внимание, мы можем изменить нашу компьютерную модель. Также мы можем приблизить ее к реальности и в других аспектах. Буквы и слова – это проявления сугубо человеческой природы, так что лучше пускай наш компьютер рисует картинки. Возможно, нам даже удастся увидеть, как изображения на экране благодаря накапливающему отбору мутантных форм приобретают очертания, напоминающие животных. Мы не будем предрешать исход дела, вводя в программу изображения животных в качестве стартового материала. Нам хотелось бы, чтобы они возникли сами и исключительно в результате накапливающего отбора случайных мутаций.
В реальной жизни внешний вид животного возникает в процессе эмбрионального развития. Эволюция происходит потому, что в ряду сменяющих друг друга поколений эмбриональное развитие слегка варьирует. Эти небольшие отклонения появляются вследствие изменений в генах, контролирующих развитие (мутации – та самая необходимая крупица случайности, о которой я упоминал). Следовательно, в нашей компьютерной модели должно быть что-то, эквивалентное эмбриональному развитию, и что-то, эквивалентное способным к мутированию генам. Существует немало способов сделать так, чтобы компьютерная модель удовлетворяла этим требованиям. Я выбрал один из них и написал соответствующую программу. А теперь я расскажу про эту компьютерную модель, так как считаю ее очень показательной. Если вы ничего не знаете о компьютерах, просто запомните, что это такие машины, которые делают в точности то, что им говоришь, а результат нередко оказывается неожиданным. Перечень инструкций, отдаваемых компьютеру, называется программой (я пишу program, как это принято в Америке и как рекомендует Оксфордский словарь; альтернативное написание programme, распространенное в Британии, кажется мне офранцуженным и неестественным).
Развитие эмбриона – процесс слишком замысловатый, чтобы можно было реалистично сымитировать его на маленьком компьютере. Поэтому нужно придумать некий упрощенный аналог: найти такое простое правило вычерчивания рисунков, которому компьютер мог бы легко подчиняться и которое могло бы варьировать под влиянием “генов”. Какое же правило мы выберем? В учебниках по информатике часто демонстрируются возможности так называемого рекурсивного программирования на примере простого алгоритма роста деревьев. Компьютер начинает с того, что чертит одиночную вертикальную линию. Затем эта линия разветвляется на две. Затем каждая из получившихся ветвей разделяется на две ветви второго порядка. Затем каждая из этих новых ветвей разделяется на ветви третьего порядка и т. д. Такое программирование называется рекурсивным, потому что в каждой точке всего растущего дерева применяется одно и то же правило (в данном случае правило ветвления). Каким бы большим дерево ни вырастало, каждая его веточка разделяется снова и снова в соответствии все с тем же правилом.
“Глубиной” рекурсии называется такое число веточек n-го порядка, которому позволяется вырасти, прежде чем процесс будет остановлен. На рисунке 2 показано, что будет, если задать компьютеру один и тот же алгоритм черчения, но с разными значениями глубины рекурсии. При высоких степенях рекурсии получается довольно запутанный узор, однако, как ясно видно из рис. 2, достигается он за счет того же самого простейшего правила ветвления. Несомненно, это именно то, что происходит и у настоящих деревьев. Система ветвей дуба или яблони выглядит сложной, но в действительности таковой не является. Правило, лежащее в основе процесса ветвления, элементарно. Просто оно снова и снова применяется в каждой растущей верхушке каждой веточки: ветви дают начало ветвям второго порядка, каждая из которых, в свою очередь, ветвям третьего порядка и так далее. Вот почему все дерево становится в итоге большим и ветвистым.
Рекурсивная бифуркация является также хорошей метафорой эмбрионального развития как растений, так и животных. Я не хочу сказать, будто зародыши животных похожи на ветвящиеся деревья. Они на них не похожи. Но любой эмбрион растет благодаря делению клеток. Каждая клетка всегда делится на две дочерние. А гены в конечном счете всегда осуществляют свои воздействия на организм посредством локального влияния на клетки, которые раздваиваются и раздваиваются. Гены животного ни в коем случае не являются грандиозным чертежом, подробным планом строения целого организма. Как мы дальше увидим, они похожи скорее на рецепт, нежели на чертеж, и более того, на рецепт, которому следует не весь развивающийся зародыш, а каждая клетка или каждое небольшое скопление делящихся клеток. Я не отрицаю того, что любой эмбрион, а впоследствии и взрослая особь имеет некое целостное строение. Но возникает это крупномасштабное строение за счет множества мелких локальных воздействий на клеточном уровне, происходящих повсюду в развивающемся организме. И в первую очередь местные воздействия сказываются на удвоении клеток – то есть на некоей разновидности ветвления. Именно регулируя такие локальные события, гены в конечном итоге влияют и на строение взрослого организма.
Итак, простое правило ветвления выглядит как многообещающий аналог эмбрионального развития. Что ж, превращаем это правило в небольшой компьютерный алгоритм, которому даем название РАЗВИТИЕ, чтобы затем внедрить его в более масштабную программу ЭВОЛЮЦИЯ [2]. При работе над этой большой программой прежде всего следует задуматься о генах.
Рис. 2
Какого рода “гены” могут быть представлены в нашей компьютерной модели? В реальной жизни гены делают две вещи: влияют на индивидуальное развитие и передаются следующим поколениям. У настоящих животных и растений десятки тысяч разных генов, но мы в своей компьютерной имитации скромно ограничимся девятью. Каждый ген из этой девятки будет охарактеризован в компьютере просто неким числом, которое будет называться значением гена. Какой-то отдельно взятый ген может, к примеру, иметь значение 4 или –7.
Как же эти гены будут влиять на развитие? Ну, они могут делать это множеством разных способов. Главное, чтобы они вносили в алгоритм РАЗВИТИЕ какие-то небольшие изменения количественного характера. Например, один ген мог бы влиять на угол ветвления, а другой – на длину какой-нибудь из веточек. Еще одна возможная задача для генов, которая сразу же приходит в голову, – менять глубину рекурсии, число последовательных ветвлений. Ответственным за этот эффект я назначил ген номер 9. Таким образом, вы можете рассматривать рис. 2 как изображение семи близкородственных организмов, идентичных друг другу во всем, за исключением гена 9. Не буду вдаваться в подробности того, что именно делает каждый из восьми других генов. Представление о том, какого рода воздействия они производят, вы можете получить, изучив рис. 3. В центре расположено исходное дерево – одно из тех, что изображены на рис. 2. Вокруг него располагается еще восемь. Они точно такие же, как и то, которое в центре, но только у каждого из них был изменен – “мутировал” – какой-то из этих восьми генов. Например, картинка справа от центрального дерева показывает нам, что происходит, когда ген 5 мутирует и к его значению прибавляется 1. Будь на странице больше места, я бы расположил вокруг центрального дерева кольцо из 18 мутантов. Почему именно из 18? Потому что у нас есть девять генов, и каждый из них может мутировать в сторону как “повышения” (когда к его значению прибавляется 1), так и “понижения” (когда из его значения вычитается 1). Следовательно, 18 изображений хватило бы для того, чтобы показать всех мутантов, каких можно получить из одного центрального дерева путем единичного преобразования.
Рис. 3