Frage

Seit etwa einem Jahr habe ich gedacht habe über ein Programm zu schreiben, die Programme schreibt. Dies würde in erster Linie eine spielerische Übung, die mir ein paar neue Konzepte beibringen könnte. Meine Inspiration kam von Negentropie und der Fähigkeit, für Ordnung aus Chaos und neuem Chaos entstehen entsteht aus um in unendlicher Folge.

Um genauer zu sein, wird das Programm durch das Schreiben eine kurze zufällige Zeichenfolge beginnen würde. Wenn die Zeichenfolge die Programme kompiliert wird es für einen späteren Vergleich anmelden. Wenn die Zeichenfolge nicht kompiliert das Programm wird versuchen, es neu zu schreiben, bis es kompilieren lässt. Da immer mehr Saiten (mini ‚nutzlos‘ Programme) angemeldet sind, können sie nach Ähnlichkeiten und verwendet werden, analysiert eine Grammatik zu erzeugen. Diese Grammatik kann dann auf gezeichnet werden, um mehr Strings zu schreiben, die eine höhere Wahrscheinlichkeit der Zusammenstellung haben als rein zufällige Zeichenfolge.

Das ist natürlich mehr als nur ein wenig albern, aber ich dachte, es würde Spaß machen, ein Programm wie diese zu versuchen und zu wachsen. Und als Neben ich eine Reihe von einzigartigen Programmen bekommen, dass ich visualisieren und Call-Kunst.

Ich werde wahrscheinlich diese in Ruby schreiben aufgrund seiner einfachen Syntax und dynamische Kompilierung und dann werde ich visualisieren bei der Verarbeitung von Rubin-Verarbeitung.

Was möchte ich wissen möchte, ist:

  • Sie haben einen Namen für diese Art der Programmierung?
  • Was gibt es zur Zeit in diesem Bereich?
  • Wer sind die primären Mitwirkenden sind?
  • BONUS! - Auf welche Weise kann ich prozedural assign Wert Ausgabeprogramme über compiliert (y / n)?
    Ich möchte kann die Funktionalität dieses Programms erweitern, ein Programm zu erzeugen, basierend auf Parametern, aber ich möchte das Programm, um diese Parameter zu definieren, durch die Programme, die Kompilierung ausgeführt wird und auf die Programme ausgegeben Bedeutung zuweisen. Diese Frage wird wahrscheinlich mehr beteiligt als angemessen für einen Bonus, aber wenn Sie eine einfache Art und Weise denken kann in weniger als 23 Zeilen oder einen Hyperlink getan, so etwas zu bekommen, ist es in Ihrer Antwort bitte werfen.

Ich weiß, dass dies nicht ganz Meta-Programmierung und aus den klein Ich kenne AI und generative Algorithmen sind sie in der Regel mehr zielorientiert als das, was ich denke bin. Was wäre optimal ist ein Programm, das immer wieder neu geschrieben und verbessert sich so habe ich nicht zu ^ _ ^

War es hilfreich?

Lösung

nachschlagen "genetische Programmierung."

Bearbeiten, um reagieren auf Kommentare:

@ Chris, @Kasturi: true. Was im OP beschrieben wurde, ist ein System für eine Grammatik durch Brute-Force-Versuche Folgern einig konkrete Syntax der Kompilierung zu machen, und dann zurück-Generierung neue konkrete Syntax aus der Grammatik. Wenn Sie verpflichtet sind, etwas zu haben sehr genau, dass die Beschreibung hat ... der beste Rat, den ich habe, ist mit sehr minimaler Syntax in dem Aufbau ein Hidden-Markov-Modells aus konkreter Syntax in einer Sprache zu suchen. Ich halte würde eine minimale kombinatorische Logik (so etwas wie im Geist der unlambda Sprache) verwendet wird.

Auf der anderen Seite, die genetische Programmierung ist eine Technik, mit einiger entwickelten Praxis und Literatur, und nicht „deterministisch“, sondern ein stochastischen Prozess. Es ist auch ein ziemlich weit gefasster Begriff --- wohl das System des OP ist ein Grenzfall GP mit 0% Crossover und 100% Mutation.

Andere Tipps

Haben Sie schon gehört von nanopond ? Das Konzept ist ähnlich wie bei Ihnen. Jedes Pixel wird eine zufällig generierte Zeichenfolge gegeben, der durch einen Compiler ausgeführt wird. Normalerweise ist dies kein gültiges Programm produzieren. jeder einmal in eine Weile, aber eine zufällig generierte Zeichenfolge irgendwie einfach perfekt formatiert werden, um der Lage sein, sich in einem benachbarten Pixel zu reproduzieren. Bald wird es einen Kampf, für das Programm besser als die andere reproduzieren kann.

Was Sie sprechen, ist ein genetischer Algorithmus, ja, aber eine Sache und eine Sache, die Maximierung allein. Die Fähigkeit zur Reproduktion

Dies ist der wesentliche Ursprung alle natürlich vorkommende negentropischen Phänomen: a. Zufällig gebildete Komplex Unternehmen in der Lage zu reproduzieren, hat

Klassische genetische Algorithmen verhängen künstliche Reproduktion Kriterien - das Programm, das einen Job tut die besten künstlich gewählt zu reproduzieren

.

Was Sie impliziert, ist eine Art von Rechen natürliche Selektion . Das heißt, Programme auf ihre Fähigkeit, auf basierend evolve reproduzieren sich , und nichts weiter.

Wird schafft dies etwas Nützliches? Vielleicht nicht. Es sei denn, Sie gab vielleicht, Ihre Programme den Zugang zum Internet oder einem anderen externen API, dass sie zufällig Zugriff können und vielleicht über das Internet zu verbreiten.

Leider ist Ihr beschriebenes System hat immer noch etwas künstliche Reproduktion Kriterien:. Die Fähigkeit zur Kompilierung

Da Fähigkeit zu kompilieren = Fähigkeit zu reproduzieren, haben Sie Ihre Programme künstlich gesetzt entwickeln zu kompilieren.

Das Kompilieren was? Es spielt keine Rolle, weil jedes Programm, das kompiliert so wahrscheinlich ist wie die letzte zu reproduzieren. Angenommen, Sie haben irgendwie ein Programm erzeugt das würde Ausgabe der Fibonacci-Folge. Oder ein Programm, das ein Schachgroßmeister schlagen konnte. Cool! Leider werden, wäre es reproduziert? Wäre es etwas Besonderes sein?

überhaupt nicht; es würde als „fit“ für die Wiedergabe als das Programm print('k') behandelt werden

Ich schlage vor, vielleicht einen Rahmen von zufällig laufenden Strings von Programmen arbeiten, die den Zugriff auf API ist, dass kann:

  • Schreiben / Lesen auf Festplatte, und ganz plötzlich haben Sie Programme, die zufällige Zeichenfolgen als Programme schreiben kann, selbst.
  • Löschen / ändern andere Dateien auf der Festplatte; dies ermöglicht es vielleicht Programme konkurrieren miteinander. Ihre API entwickelt werden könnten, so dass eine Datei nur gelöscht werden, wenn die „Stärke“ (willkürlicher Wert ... vielleicht Zeichenlänge) des Programms ist stärker als die Datei.
  • Ausführen andere Skripte auf der Festplatte ... vielleicht sogar diejenigen, die sie schreiben sich
  • Der Zugang zum Internet; auf einen Web-Server? Die Möglichkeit zum Schreiben / attach / Senden / Lesen von E-Mail?

ich denke, ein Programm, das Programme schreibt, die sich reproduzieren können bessere Ergebnisse als ein Programm produzieren könnten, die Programme schreibt, die zusammenstellen können.

Wenn Sie nicht nur die letztere wollen; dann vielleicht könnten Sie Programmlänge maximieren. Aber die Möglichkeit, etwas Interessantes passiert? Nicht sehr viel; Jedes Programm, das „compiliert“ mit einer bestimmten Länge ebenso wahrscheinlich wie „Reproduktion“.

sein würde

Ein anderes Projekt, das Sie tun können, ist die Arbeit an etwas, das mutiert von nicht eine bestimmte Einheit Test Führen eines Unit-Test übergeben.

Zum Beispiel gegeben eine Implementierung

def add(a,b)
  a
end

Sie können einen Test hinzufügen

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

und Ihr Programm stellen eine beliebige Kombination von Methoden, die auf a innerhalb add versuchen (zB a.-(b), a.to_s, a.+(b)), bis einer der Mutanten geht diesen Test und bestehenden Tests.

Sie können bei heckle aussehen wollen (oder ZenTest?) Für Beispiele von Codeänderungs getestet.

Geben Sie für Grammatical Entwicklung .

  

Was wäre optimal ist ein Programm,   dass immer wieder neu geschrieben und verbessert   sich also muss ich

nicht

Haben Sie diese Schritte:

  1. Schreiben Pseudozufallszahlengenerator in der Montage. (Real-Modus)
  2. Programm ändern, so schreibt es aus (zum Beispiel) 64k von Zufallszahlen und hat eine FAR JMP zum ersten Byte.
  3. (optional) Erstellen Sie einen Treiber für einen Überwachungszeitgeber zu verhindern Endlosschleifen
  4. Laden auf den Boot-Sektor von einem Gerät.
  5. mehrere Computer holen. Konfigurieren Sie so, dass, wenn sie triple fault werden sie neu und booten Sie von dem Boot-Sektor des Geräts
  6. Starten Sie den Computer und warten Sie ein paar Jahrzehnte (oder Jahrhunderte, was auch immer) für sie zu produzieren, etwas Nützliches
  7. Profit!

Frühe, aber sehr interessante Arbeiten in dieser Richtung war Doug Lenat des "AM" (A Mathematikerin) und Eurisko (eine Verallgemeinerung von AM).

entwickelt Eurisko eine Reihe von hueristics durch die Untersuchung, wie Randbedingungen beeinflusst ein Problem zu lösen. Es dauerte nicht Junk erzeugen, als es dann versuchen, besser gesagt, es eine schwache Problemlösung Methode nahm und fand Fälle, in denen es eine viel besseren Arbeit konnte und eine gepatchte Version des Problemlöser hergestellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top