Удачи с этим.
Конечно, вы можете написать «мутационную» программу, которая читает программу и случайным образом добавляет, удаляет или изменяет некоторое количество символов. Затем вы можете скомпилировать результат и посмотреть, лучше ли результат, чем оригинальная программа. (Однако мы определяем и измеряем «лучше».) Конечно, в 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. (Хорошо, программа работала бы, если бы вместо «read z» и «+ z» она вставила «read w» и «+ w», но тогда я упрощаю это, предполагая, что она волшебным образом вставляет точно правильное количество символов и всегда вставляет их в нужных местах. Так что я думаю, что эта оценка все еще великодушно.)
1 в 2.0e15 - довольно малая вероятность. Даже если программа запускается тысячу раз в секунду, и вы можете быстро протестировать вывод, шанс все равно составляет всего 1 на 2,0e12 в секунду или 1 на 5,4e8 в час, 1 на 2,3e7 в день. Продолжайте работать в течение года, и шанс на успех по-прежнему составляет только 1 из 62 000.
Даже умеренно компетентный программист должен быть в состоянии сделать такое изменение за десять минут?
Обратите внимание, что изменения должны входить как минимум в "правильные" пакеты. То есть, если мутация генерирует «reax z», это только один символ от «read z», но она все равно будет приводить к ошибкам компиляции и, таким образом, потерпит неудачу.
Аналогично, добавление «read z», но изменение вычисления на «total = x + y + w» не сработает. В зависимости от языка вы либо получите ошибки для неопределенной переменной, либо, в лучшем случае, она будет иметь некоторое значение по умолчанию, например ноль, и даст неверные результаты.
Полагаю, вы могли бы теоретизировать дополнительные решения. Возможно, одна мутация добавляет новый оператор чтения, а будущая мутация обновляет вычисление. Но без расчета, дополнительное чтение ничего не стоит. Как будет оцениваться программа, чтобы определить, что дополнительное чтение является «шагом в правильном направлении»? Единственный способ, которым я это вижу, - это чтобы разумное существо читало код после каждой мутации и проверяло, продвигается ли изменение к желаемой цели. И если у вас есть умный дизайнер, который может это сделать, это должно означать, что он знает, что такое желаемая цель и как ее достичь. В этот момент было бы гораздо эффективнее просто внести желаемое изменение, а не ждать, пока оно произойдет случайно.
И это очень тривиальная программа на очень простом языке. Большинство программ - это сотни или тысячи строк, которые должны работать вместе. Шансы против любого случайного процесса написания работающей программы астрономические.
Могут быть способы сделать что-то похожее на это в каком-то очень специализированном приложении, где вы на самом деле не делаете случайных мутаций, а скорее вносите постепенные изменения в параметры решения.Мол, у нас есть формула с некоторыми константами, значения которых мы не знаем.Мы знаем, каковы правильные результаты для небольшого набора входных данных.Таким образом, мы вносим случайные изменения в константы, и если результат ближе к правильному ответу, измените его, если нет, вернитесь к предыдущему значению.Но даже при этом я думаю, что было бы редко продуктивно вносить случайные изменения.Вероятно, было бы более полезно попытаться изменить константы в соответствии со строгой формулой, например, начать с изменения на 1000, затем на 100, затем на 10 и т. Д.