頑張ってください。
確かに、プログラムを読み取り、ランダムにいくつかの文字を追加、削除、または変更する「突然変異」プログラムを作成できます。次に、結果をコンパイルして、出力が元のプログラムよりも優れているかどうかを確認できます。もちろん、99.9% の確率でコンパイル エラーが発生します。構文エラー、未定義の変数などです。残りのほとんどは、まったく正しくありません。
非常に簡単な問題をいくつか試してください。たとえば、2 つの数値を読み取り、それらを加算し、合計を出力するプログラムから始めます。目標は、3 つの数値を読み取って合計を計算するプログラムであるとしましょう。もちろん、そのようなプログラムがどれほど長く複雑になるかは、言語によって異なります。たった 1 行のコードで数値を読み書きできる非常に高水準の言語があるとします。その場合、開始プログラムはわずか 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 文字を選択する確率は? 50^9 分の 1 = 2.0e15 分の 1。(プログラムは、「read z」と「+z」の代わりに「read w」と「+w」を挿入しても機能しますが、魔法のように正確な数の文字が挿入されると仮定して簡単にします。常に適切な場所に挿入します. したがって、この見積もりはまだ寛大だと思います.)
2.0e15 分の 1 はかなり小さな確率です。プログラムが 1 秒間に 1000 回実行され、出力をすばやくテストできたとしても、その可能性は 1 秒あたり 2.0e12 に 1 つ、1 時間あたり 5.4e8 に 1 つ、1 日あたり 2.3e7 に 1 つです。1 年間実行し続けても、成功する可能性は 62,000 分の 1 です。
ある程度有能なプログラマーでさえ、10 分でそのような変更を行うことができるはずです。
変更は、少なくとも正しい「パケット」で行われる必要があることに注意してください。つまり、ミューテーションが "reax z" を生成した場合、それは "read z" から 1 文字しか離れていませんが、それでもコンパイル エラーが発生するため、失敗します。
同様に「read z」を追加しますが、計算を「total=x+y+w」に変更してもうまくいきません。言語によっては、未定義の変数に対してエラーが発生するか、せいぜいゼロなどのデフォルト値があり、誤った結果が返されることになります。
増分ソリューションを理論化できると思います。おそらく、1 つのミューテーションが新しい read ステートメントを追加し、その後のミューテーションが計算を更新します。しかし、計算がなければ、追加の読み取りは無意味です。追加の読み取りが「正しい方向への一歩」であると判断するために、プログラムはどのように評価されますか? 私がそれを行う唯一の方法は、各突然変異の後にコードを知的な存在に読み取らせ、変更が望ましい目標に向かって進んでいるかどうかを確認することです. そして、それができるインテリジェントなデザイナーがいる場合、それは、彼が望ましい目標が何であり、それを達成する方法を知っていることを意味するに違いありません. その時点で、変更がランダムに発生するのを待つよりも、目的の変更を行う方がはるかに効率的です。
そして、これは非常に簡単な言語で書かれた非常に単純なプログラムです。ほとんどのプログラムは何百、何千もの行で構成されており、それらすべてが連携して動作する必要があります。ランダムなプロセスが動作するプログラムを作成する可能性は天文学的です。
非常に特殊なアプリケーションでは、実際にはランダムな変更を行うのではなく、ソリューションのパラメーターを段階的に変更する方法で、これに類似したことを行う方法があるかもしれません。同様に、値がわからないいくつかの定数を含む式があります。いくつかの小さな入力セットに対する正しい結果が何であるかはわかっています。そこで定数をランダムに変更し、結果が正解に近ければそこから変更し、そうでなければ元の値に戻します。しかし、それでも、ランダムな変更を行うことはめったに生産的ではないと思います. 1000 から始めて、次に 100 から 10 というように、厳密な式に従って定数を変更してみると、より役立つ可能性があります。