IEH: Wort mutieren

Hallo,
ich habe ein Wort, welches aus einigen Zeichen eines Alphabets besteht. Das Wort hat eine Länge von 4 Zeichen, jedes Zeichen des Alphabets ist an jeder Stelle des Wortes erlaubt.

Beispiel
a) Alphabet
Wir nutzen folgenden Zeichenvorrat: IDUE

b) Wort
ein Beispielwort wäre IIDI

Konkrete Anwendung ist eine Art Bauplan für eine (abstrakte) Lebensform. Entsprechend der DNS. Repliziert sich diese Lebensform, wird der Bauplan, das Wort, an das neue Objekt, die neue Instanz einer Lebensform, übergeben. Äußere Reize stören nun diese Übergabe und das Wort mutiert zu einem neuen Wort, IIDE. Der Bauplan hat sich bei der Replikation geändert.

Natürlich bewegen wir uns in einem formellen System, und die Auswirkungen der Mutation sind erstmal nicht konkret. Überdies müssen die äußeren Reize erstmal simuliert werden, und zwar nur durch Zufälligkeit (tritt Mutation auf, wenn ja, wie stark).

Nehmen wir nun mal an, der Aussgangsstring ist IIDI. Wie würdet ihr nun vorgehen, wenn folgende Regeln für die Mutation dabei gelten sollten:

  1. der String darf nur zu einer sehr kleinen Wahrscheinlichkeit (b.b. 1%) mutieren.
  2. der String darf nur zu einer sehr kleinen Wahrscheinlichkeit seine Länge ändern, und zwar nur um eine Stelle (3 oder 5)
  3. der String darf nicht einfach zufällig neu gebaut werden, sondern sollte anhand nachvollziebarer Regeln modifiziert werden. Im Detail meine ich damit, wenn Impuls X auf das Wort Y wirkt, tritt IMMER das gleiche Ergebnis ein. Wie genau das passieren bzw. aussehen könnte, das ist nun meine Frage.
  1. Nehmen wir nun mal an, der Aussgangsstring ist IIDI. Wie würdet ihr nun vorgehen, wenn folgende Regeln für die Mutation dabei gelten sollten:

    1. der String darf nur zu einer sehr kleinen Wahrscheinlichkeit (b.b. 1%) mutieren.
    2. der String darf nur zu einer sehr kleinen Wahrscheinlichkeit seine Länge ändern, und zwar nur um eine Stelle (3 oder 5)
    3. der String darf nicht einfach zufällig neu gebaut werden, sondern sollte anhand nachvollziebarer Regeln modifiziert werden. Im Detail meine ich damit, wenn Impuls X auf das Wort Y wirkt, tritt IMMER das gleiche Ergebnis ein. Wie genau das passieren bzw. aussehen könnte, das ist nun meine Frage.

    Z.B. genau so wie Du es beschreibst, Schritt für Schritt.

    1. Prüfen/festlegen ob Mutation auftritt, wenn ja, dann zu 2, sonst abbrechen.
    2. Prüfen/festlegen ob Längenänderung auftritt, wenn ja, dann zu 3, sonst zu 5.
    3. Prüfen/festlegen welche Längenänderung auftritt, dann zu 4.
    4. Prüfen/festlegen wo Längenänderung auftritt, dann zu 5.
    5. ... Was immer Du Dir vorstellst.
    6. Die Mutation könnte beispeilsweise auf der Bit-Ebene mit XOR realisiert werden. Eventuell muß man dazu jedem gültigen Zeichen einen Bit-Wert zuordenen und einen künstlichen Überlauf erzeugen, falls man mit der Mutation außerhalb des Wertebereichs landet.

    1. Hallo Texter,

      Z.B. genau so wie Du es beschreibst, Schritt für Schritt.

      ich meinte das eigentlich gar nicht so. tut mir leid, habe ich falsch beschrieben. Wie ich das programmiere ist klar, ich suche eine Art Übertragungsmatrix oder ähnliches. Mir geht es nur darum, wie ich -möglichst sinnvoll- einen String in einen anderen String mutiert überführen kann.

      die Bitoperation ist schon mal keine schlechte Idee, allerdings ist das noch nicht sehr konkret.

      Ein Beispiel _einer_ Regel für eine einzutretende Mutation:

      liegt ein Zufallswert bei 1 UND
      liegt ein Impulswert zwischen 60 und 70 vor UND
      ist das Zeichen an Position 2 ein I, würde I zu D mutieren

      Ein wenig Pseudocode
      WORT = "IIDE"
      IMPULS = random_value(1,100)
      RANDOM = random_value(1,100)
      if(RANDOM == 1){
      if(IMPULS >= 60 AND IMPULS <= 70) AND
      if(StringPos(WORT, 2) == "I")
      StringVal(WORT,2) = "D" // ändere Zeichen an Pos 2 zu "D"
      }

      Eine derartige Konstruktion ist aber müßig... besser wäre eine Übertragungsmatrix, schliesslich muss es hunderte Möglichkeiten geben und überdies sollte diese Matrix ebenfalls selbst veränderbar sein. Muss ich mir mal heute abend was einfallen lassen, bringt wohl nichts hier, so eine unkonkrete Fragestellung.

      Danke aber trotzdem

      1. die Bitoperation ist schon mal keine schlechte Idee, allerdings ist das noch nicht sehr konkret.

        Ist es nicht? Die Frage ist ja, was man will.

        1010b XOR 0111b ist konkret.
        1010b AND 0111b und 1010b OR 0111b ist es auch, aber da geht die Vielfalt flöten, vor allem bei mehreren Anwendungen.

        Angenommen es geht nur bis 1011b, dann wäre das Ergebnis mit 1101b "zu groß". Das Ergebnis könnte man nun mit einem Überlauf blind und/aber reproduzierbar in den Wertebereich rücken.

        liegt ein Zufallswert bei 1 UND
        liegt ein Impulswert zwischen 60 und 70 vor UND
        ist das Zeichen an Position 2 ein I, würde I zu D mutieren

        Ein wenig Pseudocode
        WORT = "IIDE"
        IMPULS = random_value(1,100)
        RANDOM = random_value(1,100)
        if(RANDOM == 1){
        if(IMPULS >= 60 AND IMPULS <= 70) AND
        if(StringPos(WORT, 2) == "I")
        StringVal(WORT,2) = "D" // ändere Zeichen an Pos 2 zu "D"
        }
        Eine derartige Konstruktion ist aber müßig... besser wäre eine Übertragungsmatrix, schliesslich muss es hunderte Möglichkeiten geben und überdies sollte diese Matrix ebenfalls selbst veränderbar sein. Muss ich mir mal heute abend was einfallen lassen, bringt wohl nichts hier, so eine unkonkrete Fragestellung.

        Ein Impulswert zwischen 60 und 70 ist offenbar _ein_ Zustand. Einem Zustand kann man ein Bitmuster zuordnen. Ein Bitmuster kann man blind verarbeiten, auch in einer Matrix wenn man will.

        Oder willst Du nur defnierte Mutationen zulassen?

        Zum Pseudocode, verschachtelte ifs bieten sich selten an. Automaten könnten auch ein Lösungsweg darstellen. OK, das war jetzt unkonkret.