11

約1年間、プログラムを書くプログラムを書くことを考えていました。これは主に、いくつかの新しい概念を教えてくれる遊び心のある演習になります。私のインスピレーションは、ネゲントロピーと、秩序が混沌から出現し、新しい混沌が無秩序に無限に連続して発生する能力から来ました。

より具体的には、プログラムは短いランダムな文字列を書き込むことから始めます。文字列がコンパイルされると、プログラムは後で比較するためにログに記録します。文字列がコンパイルされない場合、プログラムはコンパイルされるまで書き直そうとします。より多くの文字列 (ミニ「役に立たない」プログラム) がログに記録されると、それらは類似性について解析され、文法の生成に使用されます。次に、この文法を利用して、純粋にランダムな文字列よりもコンパイルの可能性が高いより多くの文字列を書き込むことができます。

これは明らかにばかげたことではありませんが、このようなプログラムを試して成長させるのは楽しいだろうと思いました. そして副産物として、視覚化してアートと呼ぶことができるユニークなプログラムをたくさん手に入れました。

単純な構文と動的コンパイルのため、おそらくこれを Ruby で記述し、その後、ruby-processing を使用して処理で視覚化します。

私が知りたいのは:

  • このタイプのプログラミングに名前はありますか?
  • この分野には現在何が存在しますか?
  • 主な貢献者は誰ですか?
  • ボーナス!- コンパイルを超えて出力プログラムに手続き的に値を割り当てるには、どのような方法がありますか (y/n)?
    このプログラムの機能を拡張して、パラメーターに基づいてプログラムを生成することもできますが、コンパイルするプログラムを実行し、プログラムの出力に意味を割り当てることによって、プログラムにこれらのパラメーターを定義させたいと考えています。この質問は、おまけとして妥当というよりはおそらく複雑ですが、このようなことを 23 行または 1 つのハイパーリンク未満で行う簡単な方法を考えられる場合は、それを回答に追加してください。

私はこれがメタプログラミングではないことを知っています.AIと生成アルゴリズムについて私が知っていることはほとんどありませんが、それらは通常、私が考えているよりも目標指向です. 最適なのは、自分自身を継続的に書き換えて改善するプログラムであり、その必要はありません ^_^

4

6 に答える 6

6

「遺伝子プログラミング」を調べてください。

編集してコメントに応答する:

@chris、@Kasturi: 真。OPで説明されていたのは、ブルートフォース試行によって文法を推測し、具体的な構文をコンパイルしてから、文法から新しい具体的な構文を逆生成するためのシステムです。その説明に非常によく一致するものを持っている場合...私が持っている最善のアドバイスは、非常に最小限の構文を使用して、具体的な構文から隠れマルコフモデルを構築することを検討することです。最小限の組み合わせロジック (精神的に Unlambda 言語に似たもの) を使用することを検討します。

一方、遺伝的プログラミングは、いくつかの実践と文献が開発された技術であり、「決定論的」ではなく、むしろ確率的プロセスです。これはかなり広い用語でもあります。おそらく、OP のシステムは、クロスオーバーが 0% で突然変異が 100% の GP の限定的なケースです。

于 2010-06-15T18:16:00.373 に答える
5

nanopondについて聞いたことがありますか?コンセプトはあなたと似ています。すべてのピクセルには、コンパイラによって実行されるランダムに生成された文字列が与えられます。通常、これは有効なプログラムを生成しません。ただし、ランダムに生成された文字列は、隣接するピクセルに再現できるように、何らかの方法で完全にフォーマットされることがあります。やがて、どちらのプログラムがよりよく再現できるかの戦いになります。

あなたが話しているのは遺伝的アルゴリズムです、はい、しかし1つのことだけを最大化します: 再現する能力.

これは、自然に発生するすべてのネゲントロピック現象の本質的な起源です。ランダムに形成された複雑なエンティティには、再生する能力があります。

従来の遺伝的アルゴリズムは、人工的な複製基準を課しています。つまり、最善の仕事をするプログラムが人工的に選択されて複製されます。

あなたが暗示しているのは、一種の計算上の自然選択です。つまり、プログラムは自分自身を再現する能力に基づいて進化し、それ以上のものはありません。

これは何か役に立つものを作成しますか? おそらくそうではありません。おそらく、あなたのプログラムがインターネットやその他の外部 API にアクセスできるようにしない限り、プログラムはランダムにアクセスでき、インターネット上に広がる可能性があります。

残念ながら、あなたが説明したシステムには、コンパイルする能力という人工的な再現基準がまだあります。

コンパイルする能力 = 再現する能力があるため、コンパイルに向かって進化するようにプログラムを人為的に設定しています。

何をコンパイルしますか?コンパイルされるプログラムは、最後のプログラムと同じように再生成される可能性が高いため、問題ではありません。フィボナッチ数列を出力するプログラムを何らかの方法で生成したとしましょう。または、チェスのグランドマスターを打ち負かすことができるプログラム。涼しい!残念ながら、それは再現されますか?特別でしょう?

全くない; プログラムとして複製するのに「適合」として扱われますprint('k')

おそらく、次のことができる API にアクセスできるランダムに実行されるプログラムの文字列のフレームワークを操作することをお勧めします。

  • ハードドライブに読み書きすると、突然、ランダムな文字列をプログラムとして書き込むことができるプログラムができます。
  • ハード ドライブ上の他のファイルを削除/変更します。これにより、プログラムが互いに競合する可能性があります。プログラムの「強度」(任意の値...おそらく文字の長さ)がファイルよりも強力な場合にのみファイルを削除できるように、APIを設計できます。
  • ハードドライブ上で他のスクリプトを実行します...おそらく自分で作成したスクリプトも実行します
  • インターネットへのアクセス; ウェブサーバーに?電子メールを書く/添付する/送信する/読む能力?

自分自身を再現できるプログラムを書いたプログラムは、コンパイルできるプログラムを書いたプログラムよりも良い結果を生み出すことができると思います。

後者だけが必要な場合を除きます。そうすれば、プログラムの長さを最大化できるかもしれません。しかし、何か面白いことが起こる可能性はありますか?それほど多くはありません。特定の長さで「コンパイル」するプログラムは、「再現」するのと同じくらい可能性があります。

于 2010-06-16T01:38:14.030 に答える
1

GrammaticalEvolutionを探してください。

于 2010-06-16T01:54:36.033 に答える
1

あなたができる別のプロジェクトは、特定の単体テストに合格しないことから単体テストに合格するように変化するものに取り組むことです。

たとえば、実装が与えられた場合

def add(a,b)
  a
end

テストを追加できます

assert_equal 3, Foo.new.add(1,2)

ミュータントの 1 つがそのテストと既存のテストに合格するまで、 (たとえば、、、 )a内でメソッドの任意の組み合わせを試すようにプログラムに指示します。adda.-(b)a.to_sa.+(b)

テスト対象のコードを変更する例については、やじ (または Zentest?) を参照してください。

于 2010-06-16T01:01:27.050 に答える
0

これらの線に沿った初期の、しかし非常に興味深い作品は、ダグ・レナートの「AM」(数学者)とEurisko(AMの一般化)でした。

Euriskoは、境界条件が問題の解決にどのように影響するかを調べることにより、一連のヒューリスティックを進化させました。それはそれを試してみるよりもジャンクを生成しませんでした、むしろ、それは弱い問題解決方法を取り、それがはるかに良い仕事をすることができるケースを見つけ、問題解決者のパッチを当てたバージョンを作成しました。

于 2010-06-19T16:58:25.290 に答える
0

最適なのは、自分自身を継続的に書き直して改善するプログラムです。

次の手順を実行します。

  1. 疑似乱数発生器をアセンブリに記述します。(リアルモード)
  2. プログラムを変更して、(たとえば) 64k の乱数を書き出し、最初のバイトに FAR JMP を実行します。
  3. (オプション) 無限ループを防ぐために、ウォッチドッグ タイマーのドライバーを作成します。
  4. デバイスのブートセクタにロードします。
  5. 複数のコンピューターを取得します。トリプル フォールトが発生した場合に再起動し、デバイスのブートセクタから起動するように構成します。
  6. コンピューターを起動し、何か有用なものが生成されるまで数十年 (または数世紀) 待ちます。
  7. 利益!
于 2010-06-16T01:47:42.337 に答える