Ответ 1
Очень интересный вопрос. Меня заинтриговала возможность делать генетическое программирование на двоичном уровне некоторое время. Что касается того, что вы спрашиваете:
Из их документации видно, что LLVM-mutate не может делать то, что вы просите. Тем не менее, я думаю, что это разумно для этого не делать. Мое рассуждение состоит в том, что любая машинная математическая программа неизбежно столкнется с проблемой "Проблема с остановкой" . было бы невозможно узнать, будет ли случайная сгенерированная инструкция полностью разбивать весь компьютер (например, назначая значение OS-зарезервированному указателю), или он может запускаться вечно и принимать все ваши циклы процессора. Теорема Тьюринга говорит нам, что невозможно заранее знать, сможет ли данная программа сделать это. Имейте в виду, что LLVM-mutate может привести к тому, что совершенно безобидная программа все равно будет терпеть крах или работать навсегда, но я думаю, что их подход делает его менее вероятным, только принимая существующие инструкции.
Однако такая вещь, как "невозможность", только сдерживает ученых, а не инженеров: -)...
То, о чем я думал, таково: в природе настоящие мутации работают намного больше, как LLVM-mutate, которые, как и мы, в обычном генетическом программировании. Другими словами, они просто меняют буквы из очень ограниченного набора (A, T, C, G), и из этого вытекает все возможные варианты. У нас может быть программа или набор программ с исходным набором инструкций, а также набор "возможных функций", связанных или определенных в программе. Большинство из этих функций фактически не использовались бы, но они будут там, чтобы обеспечить "сырую ДНК" для мутаций, как в нашей ДНК. Этот набор функций будет иметь полный (или полузаполненный) набор возможных функций для проблемного пространства. Затем мы просто используем базовые операции, подобные тем, которые выполняются в LLVM-mutate.
Некоторые возможные проблемы:
-
Учитывая количество возможной изменчивости, единственный способ приемлемое время выполнения было бы иметь огромное количество вычислительная мощность. Вероятно достижимо в Облаке или с графическими процессорами.
-
Вам все равно придется бороться с проблемой г-на Тьюринга. Однако я думаю, что это можно было бы решить, выполнив решения в "Песочница", которая не подведет вас, если решение взорвется: Что-то вроде одноразовой виртуальной машины или Docker-like контейнер, с ограничением по времени (для выхода из бесконечных циклов). решение, которое приведет к сбоям или сбоям, станет наихудшим пригодности, чтобы программы имели тенденцию отклоняться от тех пути.
Что касается этого, я могу увидеть ряд интересных приложений: программы самовосстановления, программы, которые самооптимизируются для конкретной среды, программы "вакцинации" от уязвимостей, мутации вирусов, обеспечения качества и т.д.
Я думаю, что здесь есть потенциальный проект с открытым исходным кодом. Это было бы безумным, опасным и зависящим от времени вихрем: просто мой проект. Зачислите меня, если кто-то это сделает.