Разумеется, вы разобьёте задачу на подзадачи. Поворот на один заданный угол похож на поворот на любой другой. Поэтому можно написать подпрограмму для поворота, которая возьмёт на себя весь континуум возможных случаев. Готовую подпрограмму можно будет просто вызывать из остальных частей программы при необходимости поворота, и в этих частях знания о том, что именно требуется для поворота, будут излишними. Задав и решив столько таких подзадач, сколько возможно, вы создадите код или язык, весьма хорошо приспособленный для формулирования движений робота при ходьбе. Каждый вызов одной из подпрограмм — это такая формулировка или команда на данном языке.
До этого момента большая часть того, что вы сделали, относится к «вдохновению»: она требовала творческого мышления. Настало время попотеть. Автоматизировав всё, что вы знаете, как автоматизировать, вы столкнётесь с единственной возможностью для достижения дополнительной функциональности: обратиться к методу проб и ошибок. Однако теперь у вас есть преимущество в виде языка, который был вами адаптирован для передачи роботу инструкций по ходьбе. Поэтому можно начать с программы, простой на этом языке, но очень сложной в плане элементарных команд компьютера и означающей, например, «Идти вперёд; при столкновении с препятствием остановиться». Затем можно запустить эту программу и посмотреть, что будет делать робот. (Или проверить её на компьютерной модели робота.) Если робот споткнётся и упадёт или произойдёт ещё что-то нежелательное, программу можно модифицировать — всё на том же уже созданном вами языке высокого уровня, — устраняя недостатки по мере их выявления. Вдохновения для такого метода нужно меньше, а вот попотеть придётся.
Но есть и альтернативный подход: можно переложить вторую фазу на компьютер, но с использованием так называемого эволюционного алгоритма. С помощью одной и той же компьютерной модели запускается множество пробных версий, в каждой из которых самая первая программа случайным образом немного меняется. Эволюционный алгоритм подвергает каждого смоделированного робота набору тестов, задуманных вами: сколько он может пройти, не упав; насколько хорошо он преодолевает препятствия и пересечённую местность и так далее. В конце каждого прогона остаётся программа, показавшая наилучшие результаты, а остальные отбрасываются. Затем создаётся множество вариантов этой выбранной программы, и процесс повторяется. После тысяч итераций такого «эволюционного» процесса может оказаться, что робот согласно установленным вами критериям ходит достаточно хорошо. Теперь можно писать диссертацию. И вы не только сможете утверждать, что сконструированный вами робот ходит с требуемой степенью ловкости, но и что вы на компьютере реализовали эволюцию.
Такая процедура с успехом осуществлялась уже много раз. Это полезная методика. И, безусловно, она представляет собой «эволюцию» в смысле чередования вариации и отбора. Но эволюция ли это в более важном смысле создания знаний путём вариации и отбора? Когда-нибудь мы достигнем и этого, но я сомневаюсь в том, что на данный момент это уже достигнуто, по той же причине, по которой я сомневаюсь в том, что чатботы обладают интеллектом, пусть и небольшим. Просто потому, что их способностям есть гораздо более очевидное объяснение, а именно творческое мышление программиста.
Исключение возможности того, что в случае «искусственной эволюции» знание было создано программистом, логически эквивалентно проверке, является ли программа искусственным интеллектом, только это задача сложнее, потому что объём знаний, якобы создаваемых в ходе «эволюции», гораздо меньше. Даже если вы сами и есть программист, то не можете судить, вы создали этот относительно небольшой объём знаний или нет. С одной стороны, те знания, которые вы заложили в язык за многие месяцы разработки, будут иметь определённую сферу применимости, потому что в них закодированы некоторые общие истины о законах геометрии, механики и так далее. С другой стороны, вы разрабатывали язык, постоянно учитывая, для выражения какого рода способностей он в итоге будет использоваться.
Идея с тестом Тьюринга наводит на мысль о том, что, если заложить в программу «Элиза» достаточно шаблонов стандартных ответов, она сможет автоматически создавать знания; искусственная эволюция наводит на мысль о том, что при наличии вариации и отбора эволюция (адаптаций) станет происходить автоматически. Но ни то, ни другое не обязательно верно. В обоих случаях есть другая возможность, что во время работы программы вообще не будет создаваться знаний, а появляться они будут только во время разработки её программистом.
Кажется, в таких проектах неизменно происходит одно: если по достижении запланированной цели «эволюционная» программа продолжает работать, то дальнейших улучшений уже не происходит. Именно так должно было быть, если все знания, заложенные в удачно сконструированном роботе, на самом деле получены от программиста. Но такая критика неубедительна: в ходе биологической эволюции также часто достигаются «локальные максимумы приспособленности». Кроме того, уже достигнув своей загадочной формы универсальности, она как будто замерла лет так на миллиард, прежде чем создать более или менее значительные новые знания. Но всё же достижение результатов, которые вполне могут быть обусловлены чем-то ещё, не есть доказательство эволюции.
Поэтому я сомневаюсь, что в ходе какой-либо «искусственной эволюции» когда-либо создавались знания. Того же взгляда и по тем же причинам я придерживаюсь относительно немного иного типа «искусственной эволюции», при которой в виртуальной среде развиваются смоделированные организмы, а также когда друг с другом стравливаются различные виртуальные виды.
Чтобы проверить это утверждение, я бы хотел увидеть эксперимент немного другого вида: уберём из проекта аспиранта. Вместо робота, сконструированного так, чтобы он мог развивать свои способности к ходьбе, возьмём робота, который уже применяется в какой-нибудь реальной ситуации и может ходить. Далее, мы не будем создавать специальный язык подпрограмм для выражения гипотез о том, как ходить, а заменим существующую программу в существующем микропроцессоре случайными числами. В качестве мутаций возьмём ошибки того типа, которые всё равно случаются в таких процессорах (хотя при моделировании можно задавать частоту, с которой мы позволим им случаться). Всё это делается, чтобы исключить возможность того, что в конструкцию системы вводятся человеческие знания и привносимые ими новые возможности будут восприниматься как результат эволюции. Затем, как обычно, начнём моделирование этой мутирующей системы — столько раз, сколько угодно. Если робот в конце концов пойдёт лучше, чем было изначально, то я ошибся. Если он продолжит совершенствовать свой навык и после этого, то я ошибся очень сильно.
Одна из главных особенностей описанного эксперимента, отсутствующая при обычном способе осуществления искусственной эволюции, состоит в том, что язык (подпрограмм) должен развиваться вместе с теми адаптациями, которые с его помощью выражаются. Как раз это и происходило в биосфере перед скачком к универсальности, который вылился в генетический код ДНК. Как я говорил, возможно, все предыдущие генетические коды кодировали только небольшое число очень похожих организмов. А та чрезвычайно богатая биосфера, которую мы видим вокруг себя, созданная случайной вариацией генов при неизменном языке, представляет собой нечто, ставшее возможным лишь после этого скачка. Мы даже не знаем, универсальность какого типа была там создана. Так почему мы полагаем, что наша искусственная эволюция сможет обойтись без этого?