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