非常に興味深い質問です。私はしばらくの間、バイナリレベルの遺伝的プログラミングを行う可能性に興味をそそられてきました。あなたが尋ねるものに関して:
彼らのドキュメントから、LLVM-mutate があなたが求めていることを実行できないことは明らかです。しかし、私はそうしないのが賢明だと思います。私の推論は、機械語の遺伝的プログラムは必然的に「停止問題」に直面するということです。たとえば、ランダムに生成された命令がコンピューター全体を完全にクラッシュさせるかどうかを知ることは不可能です (たとえば、OS 予約済みの値を割り当てることによって)。ポインター)、または永久に実行され、すべての CPU サイクルが使用される可能性があります。チューリングの定理は、特定のプログラムがそれを行うかどうかを事前に知ることは不可能であることを示しています。LLVM-mutate を使用すると、完全に無害なプログラムがクラッシュしたり、永久に実行されたりする可能性がありますが、既存の命令のみを使用することで、その可能性が低くなると思います。
しかし、「不可能」のようなものは、エンジニアではなく科学者を思いとどまらせるだけです:-)...
私が考えていたことは次のとおりです。実際の突然変異は、通常の遺伝的プログラミングで行うのと同じように、LLVM 突然変異のように機能します。言い換えれば、彼らは非常に限られたセット (A、T、C、G) から文字を交換するだけで、あらゆるバリエーションがこれから生まれます。プログラムまたは一連のプログラムに、最初の命令セットと、プログラム内でリンクまたは定義された一連の「可能な機能」を含めることができます。これらの関数のほとんどは実際には使用されませんが、私たちの DNAと同様に、突然変異のための「生の DNA」を提供するために存在します。この関数セットには、問題空間で可能な関数の完全な (または半完全な) セットが含まれます。次に、LLVM-mutate のような基本的な操作を使用します。
ただし、考えられる問題がいくつかあります。
変動の可能性を考えると、許容可能な実行時間を確保する唯一の方法は、膨大な量の計算能力を持つことです。クラウドまたは GPU で実現できる可能性があります。
チューリング氏の停止問題と闘う必要があります。ただし、これは、ソリューションが失敗しても停止しない「サンドボックス」でソリューションを実行することで解決できると思います: 使い捨ての仮想マシンまたは Docker のようなコンテナーのようなもので、時間制限があります (無限ループから抜け出す)。クラッシュまたはタイムアウトするソリューションは、可能な限り最悪の適合性を得る可能性があるため、プログラムはそれらのパスから分岐する傾向があります。
なぜこれを行うのかについては、いくつかの興味深いアプリケーションを見ることができます: 自己修復プログラム、特定の環境に合わせて自己最適化するプログラム、脆弱性に対するプログラムの「ワクチン接種」、ウイルスの変異、品質保証など。
ここには潜在的なオープンソース プロジェクトがあると思います。それは非常識で、危険で、時間のかかる渦になるでしょう: まさに私の種類のプロジェクトです. 誰かがそれをしているなら、私を数えてください。