Ich beschäftige mich gerade ein wenig mit Genetischen Algorithmen / Evolutionsstrategien. Dabei stellt sich mir jetzt folgende Frage: Gibt es Vererbung/Kreuzung auf Programmebene? Sinngemäß so: Es gibt Programm A und Programm B. Programm A und B finden sich, steigen in die virtuelle Kiste, und raus kommt Programm C mit vererbten Eigenschaften aus Programm A und B. Hat da jemand vielleicht ein, zwei Schlagworte nach denen man in diesem Zusammenhang suchen kann? Grüße
ich kenne genetische algorithmen nur im zusammenhang mit parametrisierten systemen, bei denen in jeder generation die am besten abschneidenden individuen gekreuzt werden. ganze programme, die code an nachkommen vererben, um bessere programmpopulationen zu erzeugen… oh jeh ;)
Kaj G. schrieb: > Sinngemäß so: Es gibt Programm A und Programm B. > Programm A und B finden sich, steigen in die virtuelle Kiste, und raus > kommt Programm C mit vererbten Eigenschaften aus Programm A und B. Das würde voraussetzen, das Programm A und B "genetisch" so weit verwandt sind, dass lebensfähige Nachkommen entstehen können. Das funktioniert auf Parameterebene. Nichtlineare Suchstrategien nutzen das gerne. Das Trainieren von neuronalen Netzen ist eine weitere Anwendung.
Irgendwer schrieb: > https://de.wikipedia.org/wiki/Objektorientierte_Pr... Nicht lesen und nicht verstehen, aber hauptsache irgendeinen Mist posten. Ab in die Ecke mit Dir! OOP hat absolut gar nichts mit meiner Frage zu tun. c. m. schrieb: > ganze programme, die code an nachkommen vererben, um bessere > programmpopulationen zu erzeugen… oh jeh ;) Stell dir vor, du kreuzt Windowsversionen, immer und immer wieder und irgendwann kommt durch die Evolution ein Linux dabei raus :P Wolfgang A. schrieb: > Das würde voraussetzen, das Programm A und B "genetisch" so weit > verwandt sind, dass lebensfähige Nachkommen entstehen können. Das habe ich jetzt implizit vorausgesetzt. Das eine Kreuzung aus MS-Calc und dem MS-Sperrbildschirm nicht sinnvoll ist sollte klar sein :D Ich könnte mir das ganze so vorstellen (und zur vereifnachung nehmen wir jetzt mal eine Scriptsprache als Beispiel, z.B. Python): Man hat 2 Scripte wo Code drin steht. Beide Scripte sind eigenständige Programme. Bestimmte Codeabschnitte markiert man nun als "vererbbar". Jetzt könnte es ein drittes Programm geben (der Paarungsakt sozusagen) das die beiden Scripte nach vererbbaren Eigenschaften durchsucht, und in einer neuen Datei rekombiniert -> Programm C ist geboren. Für compilierte Sprachen wie C köntne ich mir statt der Code-/Scriptdateien Libs vorstellen. Der "Paarungsakt" wäre der "Genetische Algorithmus" und die vererbbaren Eigenschaften von Programm A und B wären die "Parameter" dazu. Könnte man das so stehen lassen? Wie könnte man den "Paarungsakt" bezeichnen? Wäre das so eine Art Linker/Codegenerator? Grüße
Das Hauptproblem ist, dass eine Script-Sprache oder auch jede andere Programmiersprache sehr komplex ist und du durch Zufall + Selektion(=Evolution) keinen lauffähigen Code in einem annehmbaren Zeitfenster erzeugen kannst. Man muss sich also von dieser sehr komplexen Ebene lösen und dafür habe ich vor einiger Zeit mal etwas im Netz gefunden: http://www.millermattson.com/dave/?p=174 Wirklich ein guter Artikel mit tollem Beispiel. Wenn du was Schönes damit bastelst, kannst du es hier ja mal teilen, würde mich nämlich auch sehr interssieren.
Kaj G. schrieb: > Gibt es Vererbung/Kreuzung auf Programmebene? Das nehme ich an, denn meine Mutter konnte noch schlechter programmieren als ich. mfG Paul
Kaj G. schrieb: > > Gibt es Vererbung/Kreuzung auf Programmebene? > Hat da jemand vielleicht ein, zwei Schlagworte nach denen man in diesem > Zusammenhang suchen kann? > > Grüße "Core war" ist eine akademische Spielerei aus den 80igern in der Programme in einer Assemblerähnlichen Sprache gegeneinander "kämpfen". Daraus haben sich auch Ansätze entwickelt Evolution in Pseudo-Assembler nachzuempfinden: http://www.koth.org/info/evolving_warriors.html https://de.wikipedia.org/wiki/Core_War https://de.wikipedia.org/wiki/Avida MfG,
Danke fry und Fpga Kuechle, ich werd mir die Links gleich mal anschauen :)
Das hat sogar mal Jemand mit Hardware gemacht, also ein Fpga mit Zufall konfiguriert und dann jeweils die Bitstreams gemixt und das vererbt was am ehesten das Ziel erfüllt hat. Keine Ahnung ob das auch mit modernen FPGAs noch geht, aber war sehr cool. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.9691
Kaj G. schrieb: > Irgendwer schrieb: >> https://de.wikipedia.org/wiki/Objektorientierte_Pr... > Nicht lesen und nicht verstehen, aber hauptsache irgendeinen Mist > posten. Ab in die Ecke mit Dir! OOP hat absolut gar nichts mit meiner > Frage zu tun. Ich halt halt Fehler begangen anzunehmen deine Frage währe ernst gemeint und nur etwas unglücklich formuliert. Aber Hauptsachen mal irgendeinen beleidigenden mist geantwortet anstatt die Antwort zu ignorieren oder mal drüber nachzudenken ob die eigene Frage vielleicht etwas mehr Erläuterung bedarf? Kaj G. schrieb: > Stell dir vor, du kreuzt Windowsversionen, immer und immer wieder und > irgendwann kommt durch die Evolution ein Linux dabei raus :P Auf so einen wirren Blödsinn kann ja kein normaler kommen...
Gustl B. schrieb: > Das hat sogar mal Jemand mit Hardware gemacht, also ein Fpga mit Zufall > konfiguriert und dann jeweils die Bitstreams gemixt und das vererbt was > am ehesten das Ziel erfüllt hat. Keine Ahnung ob das auch mit modernen > FPGAs noch geht, aber war sehr cool. > http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.9691 Hm, darüber habe ich vor Jahrzehnten in der ct gelesen. Das kam aus dem Bereich Spracherkennung, das System konnte das gesprochene "Ja" von gesprochenen "Nein" unterscheiden. War wohl sehr speziell auf diesen Ur-FPGA XC6200 zugeschnitten: http://web.cecs.pdx.edu/~mperkows/temp/May13/PE014.XC6200Ahmad.pdf Mal schnell nach Adrian Thompson gesucht findet das: https://shop.heise.de/katalog/der-evolution-ihre-tricks-abgucken http://www.damninteresting.com/on-the-origin-of-circuits/ https://en.wikipedia.org/wiki/Evolvable_hardware Das trifft aber IMHO eher auf das Konzept: "Das funktioniert auf Parameterebene." als auf Programm-Code zusammenwürfeln. MfG,
Kaj G. schrieb: > Jetzt könnte es ein drittes Programm geben (der Paarungsakt sozusagen) > das die beiden Scripte nach vererbbaren Eigenschaften durchsucht, und in > einer neuen Datei rekombiniert -> Programm C ist geboren. Das Erscheint mir nicht besonders sinvoll. Was nützt es, wenn ein Programm Funktionen übernimmt, auf welche es nicht zugreift weile es nichts damit anzufangen weiss? Bzw. wie soll das Programm enscheiden, wann es welche Funktionen verwendensoll? Ich habe einmal mit einem fixen Funktionsumfang und Punkten in einem 2D Raum + etwas Zufall experimentiert: https://old.danielabrecht.ch/Projekte/Simulationen/evolutionaererAlgorithmus/ Das Program habe ich geschrieben, als ich noch am C++ lernen war, daher enthält es einige unschönheiten und fehler. Man kann aber dennoch spannende Dinge sehen, z.B. fliehen die Punkte manchmal vor ihren Feinden oder verfolgen sie, oder es entsteht ein schwarm... Am ende sterben aber immer alle oder die Roten aus. Ich habe später mal versucht das selbe in JavaScript zu machen. Ich hatte dort weniger spezifische funktionen, mit der die Punkte mehr machen hätten können. Dabei habe ich etwas wichtiges gelernt: Wenn man zuviel Spielraum lässt werden sinvolle Kombinationen derart unwarscheinlich, dass diese nichtmehr entstehen, und es passiert nichts spannendes mehr.
Also Thompson hat tatsächlich einfach Bitfiles gemixt und damit neu konfiguriert, also kein HDL Code. Auf Sprachebene wie bei C stelle ich mir das sehr schwierig vor weil die Syntax ja stimmen muss und nicht ein einzelnes Bit unabhängig von allen anderen Bits eine Eigenschaft (wie im Bitstream) festlegt. Man könnte das dann höchstens auf größerer Ebene machen, also ein Gen ist das nicht ein Bit sondern bei C eine in sich funktionierende abgeschlossene Anweisung. Oder ein AMS Befehl. Mit FPGAs finde ich das sehr spannend weil heutzutage sind die ja partiell rekonfigurierbar, man könnte also das komplett im FPGA laufen lassen die Evolution. Das Mixen der Bitfiles, die Evaluation der aktuellen Generation und die Konfiguration. So dass man am Ende sehr viele Generationen in sehr kurzer Zeit durchspielen kann und sehr viel schneller zu einem guten Ergebnis kommt wie wenn man das mit dem Computer macht.
Kaj G. schrieb: > Sinngemäß so: Es gibt Programm A und Programm B. > Programm A und B finden sich, steigen in die virtuelle Kiste, und raus > kommt Programm C mit vererbten Eigenschaften aus Programm A und B. Nichts anderes macht dieses Forum hier. Ein Anfänger kommt mit einem Programm A, das nicht tut, was er möchte. Einer der Möchtegernprofis erinnert sich an Programm B, das zwar etwas ganz anderes tut, aber da in beiden das Wort "int" vorkommt, denkt er, dass es geeignet wäre, dem Anfänger zu helfen. Aus beiden Ansätzen friemelt Möchtegernprofi Programm C. Das tut auch nicht, was Anfänger möchte, aber sowas von gar nicht mehr. Das Wort "int" kommt in C noch häufiger vor als in A und B. Also in jeder Hinsicht ein evolutionärer Erfolg.
Vielleicht geht es gar nicht um den evolutionären Erfolg, sondern man möchte möglichst viele ausgefallene Varianten der Kreuzung darstellen, wie in diesen zahlreichen Filmen im Internet, die auch überwiegend* Praktiken zeigen, die zu keinem evolutionären Erfolg führen können. * Meine Enschätzung, ich habe aber nicht alle Filme gesehen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.