Удачи с этим.
Конечно, вы можете написать программу «мутации», которая читает программу и случайным образом добавляет, удаляет или изменяет некоторое количество символов. Затем вы можете скомпилировать результат и посмотреть, лучше ли результат, чем исходная программа. (Однако мы определяем и измеряем «лучше».) Конечно, в 99,9% случаев результатом будут ошибки компиляции: синтаксические ошибки, неопределенные переменные и т. д. И, конечно же, большая часть остального будет совершенно неправильной.
Попробуйте решить очень простую задачу. Скажем, начнем с программы, которая считывает два числа, складывает их и выводит сумму. Предположим, что целью является программа, которая считывает три числа и вычисляет сумму. Насколько длинной и сложной будет такая программа, конечно же, зависит от языка. Допустим, у нас есть язык очень высокого уровня, который позволяет нам читать или записывать числа всего одной строкой кода. Тогда стартовая программа состоит всего из 4 строк:
read x
read y
total=x+y
write total
Простейшей программой для достижения желаемой цели будет что-то вроде
read x
read y
read z
total=x+y+z
write total
Таким образом, путем случайной мутации мы должны добавить «read z» и «+z», всего 9 символов, включая пробел и новую строку. Давайте упростим нашу программу мутации и скажем, что она всегда вставляет ровно 9 случайных символов, что они гарантированно находятся в нужных местах, и что она выбирает из набора символов всего 26 букв плюс 10 цифр плюс 14 специальных символов = 50 символов. Каковы шансы, что он выберет правильные 9 символов? 1 из 50^9 = 1 из 2,0e15. (Хорошо, программа будет работать, если вместо «прочитать z» и «+z» она вставит «прочитать w» и «+w», но тогда я упрощаю задачу, предполагая, что она волшебным образом вставляет точно нужное количество символов. и всегда вставляет их в нужные места.Так что я думаю, что эта оценка все еще щедра.)
1 из 2.0e15 — довольно маленькая вероятность. Даже если программа запускается тысячу раз в секунду, и вы можете быстро протестировать вывод, вероятность по-прежнему составляет всего 1 из 2,0e12 в секунду, или 1 из 5,4e8 в час, 1 из 2,3e7 в день. Держите его в рабочем состоянии в течение года, и шансы на успех по-прежнему составляют всего 1 к 62 000.
Даже умеренно компетентный программист должен быть в состоянии сделать такое изменение за какие-то десять минут?
Обратите внимание, что изменения должны поступать как минимум в «пакетах», которые являются правильными. То есть, если мутация генерирует «reax z», это всего один символ от «read z», но это все равно приведет к ошибкам компиляции, и поэтому произойдет сбой.
Точно так же добавление «прочитать z», но изменение расчета на «total=x+y+w» не сработает. В зависимости от языка вы либо получите ошибки для неопределенной переменной, либо в лучшем случае она будет иметь какое-то значение по умолчанию, например ноль, и даст неправильные результаты.
Вы могли бы, я полагаю, теоретизировать поэтапные решения. Возможно, одна мутация добавляет новый оператор чтения, а затем будущая мутация обновляет вычисление. Но без расчета дополнительное чтение ничего не стоит. Как будет оцениваться программа, чтобы определить, является ли дополнительное чтение «шагом в правильном направлении»? Я вижу единственный способ сделать это — заставить разумное существо читать код после каждой мутации и смотреть, продвигается ли изменение к желаемой цели. И если у вас есть умный дизайнер, который может это сделать, это должно означать, что он знает, какова желаемая цель и как ее достичь. В этот момент было бы гораздо эффективнее просто внести желаемое изменение, а не ждать, пока оно произойдет случайно.
И это чрезвычайно тривиальная программа на очень простом языке. Большинство программ состоят из сотен или тысяч строк, и все они должны работать вместе. Вероятность того, что любой случайный процесс напишет работающую программу, астрономична.
Могут быть способы сделать что-то похожее на это в каком-то очень специализированном приложении, где вы на самом деле не делаете случайные мутации, а скорее вносите инкрементные изменения в параметры решения. Например, у нас есть формула с некоторыми константами, значения которых нам неизвестны. Мы знаем, каковы правильные результаты для некоторого небольшого набора входных данных. Итак, мы вносим случайные изменения в константы, и если результат ближе к правильному ответу, меняем оттуда, если нет, возвращаемся к предыдущему значению. Но даже при этом я думаю, что внесение случайных изменений редко бывает продуктивным. Вероятно, было бы полезнее попробовать изменить константы в соответствии со строгой формулой, например, начать с изменения на 1000, затем на 100, затем на 10 и т. д.
person
Jay
schedule
20.04.2011