Вы слышали о нанопруд ? Концепция похожа на вашу. Каждый пиксель получает случайно сгенерированную строку, которая запускается через компилятор. Обычно, это не производит никакой действительной программы. Однако время от времени случайно сгенерированная строка будет каким-то образом идеально отформатирована, чтобы иметь возможность воспроизводить себя в соседний пиксель. Вскоре это становится битвой, для которой программа может воспроизводить лучше, чем другие.
То, о чем вы говорите, это генетический алгоритм, да, но максимизирующий одну вещь: одну способность воспроизводить.
Это существенное происхождение всех естественных негэнтропийных явлений: случайно сформированная сложная сущность обладает способностью размножаться.
Классические генетические алгоритмы устанавливают критерии искусственного размножения - программа, которая делает лучшую работу, искусственно выбрана для воспроизведения.
То, что вы подразумеваете, является своего рода вычислительным естественным отбором . То есть программы будут развиваться в зависимости от их способности воспроизводить себя и ничего более.
Это создаст что-то полезное? Возможно нет. Если, возможно, вы не предоставили своим программам доступ в Интернет или какой-либо другой внешний API, к которому они могут иметь произвольный доступ и могут распространяться по Интернету.
К сожалению, ваша описанная система все еще имеет несколько искусственных критериев воспроизведения: способность компилировать.
Поскольку способность к компиляции = способность к воспроизведению, вы искусственно настроили свои программы в направлении компиляции.
Что компилировать? Это не имеет значения, потому что любая программа, которая компилируется, будет воспроизводиться так же, как и предыдущая. Допустим, вы как-то сгенерировали программу, которая будет выводить последовательность Фибоначчи. Или программа, которая может побить шахматного гроссмейстера. Здорово! К сожалению, это будет воспроизведено? Это будет особенным?
Совсем нет; это будет считаться «пригодным» для воспроизведения как программа print('k')
Я предлагаю, возможно, использовать каркас из случайно работающих строк программ, имеющих доступ к API, которые могут:
- Чтение / запись на жесткий диск, и вдруг у вас есть программы, которые могут сами записывать случайные строки как программы.
- Удалить / изменить другие файлы на жестком диске; это позволяет программам конкурировать друг с другом. Ваш API может быть спроектирован так, чтобы файл мог быть удален только в том случае, если «сила» (произвольное значение ... возможно, длина символа) программы сильнее, чем у файла.
- Запускать другие сценарии на жестком диске ... возможно, даже те, которые они пишут сами
- Доступ к интернету; на веб-сервер? Возможность писать / прикреплять / отправлять / читать электронные письма?
Я думаю, что программа, которая пишет программы, которые могут воспроизводить себя, может дать лучшие результаты, чем программа, которая пишет программы, которые могут компилироваться.
Если только вы не хотите последнее; тогда, возможно, вы могли бы максимизировать длину программы. Но возможность чего-то интересного происходит? Не так много; любая программа, которая «компилирует» с определенной длиной, будет так же вероятна, как и «воспроизведение».