Aufgabe 1: General Knowledge / Multiple Choice (10 Punkte)

(a) Which domain of science does natural computing usually not draw inspiration from? (1 Punkt)

  • Richtige Antwort: iii History
  • Erklärung: Natural Computing ist stark von Disziplinen wie Physik, Biologie und Chemie inspiriert, da diese oft Prinzipien enthalten, die sich auf natürliche Phänomene beziehen, die für Algorithmen relevant sind. Geschichte hingegen liefert keine direkten technischen Konzepte.

(b) Any computer program can be encoded into an instance of Conway’s game of life that performs an equivalent computation. Thus, Conway’s game of life is…? (1 Punkt)

  • Richtige Antwort: i Turing-complete
  • Erklärung: Conway’s Game of Life ist Turing-vollständig, was bedeutet, dass es in der Lage ist, jede berechenbare Funktion zu simulieren, ähnlich wie bei einem Universalrechner.

(c) As measured by sample efficiency, all optimization algorithms perform the same when averaged over all possible target functions. What is this theorem called? (1 Punkt)

  • Richtige Antwort: ii No Free Lunch Theorem
  • Erklärung: Das „No Free Lunch“-Theorem besagt, dass alle Optimierungsalgorithmen im Durchschnitt gleich gut abschneiden, wenn über alle möglichen Probleme gemittelt wird.

(d) How many functions in the λ-calculus do have a fixpoint? (1 Punkt)

  • Richtige Antwort: iv all of them
  • Erklärung: Im Lambda-Kalkül hat jede Funktion einen Fixpunkt aufgrund des Fixpunkt-Kombinators, der sicherstellt, dass jede Funktion einen Wert findet, der bei erneuter Anwendung der Funktion stabil bleibt.

(e) Assume a soup made of λ-expressions that react by being applied to each other. We observe that certain expressions occur way more often than others and that these expressions are able to copy themselves in a stable manner. Thus, we call them…? (1 Punkt)

  • Richtige Antwort: iii replicators
  • Erklärung: Replicatoren sind λ-Ausdrücke, die sich durch Wiederanwendung selbst stabil kopieren können und somit eine Schlüsselrolle in solch einem System spielen.

Aufgabe 2: Game of Life (12 Punkte)

(a) Give an example of a still life on the grid topology printed below. (2 Punkte)

Ein Beispiel für ein Stillleben im Game of Life ist ein Muster, das nach jedem Schritt unverändert bleibt. In der angegebenen Grafik ist das Beispiel korrekt.

In der gegebenen Grafik wird ein kleines Quadrat aus vier schwarzen Zellen in der Mitte des Gitters angezeigt. Dieses Muster ist ein Stillleben, da es unverändert bleibt, unabhängig davon, wie viele Schritte das Game of Life ausgeführt wird. Es entspricht dem sogenannten “Block”-Muster, einem klassischen Stillleben.

□ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □
□ □ □ □ ■ ■ □ □ □ □
□ □ □ □ ■ ■ □ □ □ □
□ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □

(b) Use Def. 1 to evolve the following initial state for Conway’s game of life on a grid for 3 steps. State if and why this pattern fits the description of an oscillator, space ship, or gun. What can this pattern be used for when trying to encode complex behavior like information processing in Conway’s game of life? (10 Punkte)

  • Das gezeigte Muster ist ein space ship, da es sich nach jedem Schritt bewegt, aber seine Form beibehält. Ein Raumschiff kann verwendet werden, um Information über das Spielfeld zu transportieren, da es sich fortbewegt und seinen Zustand überträgt.

3 Cellular Automata (10pts)

Ein exam cellular automaton wird durch eine Funktion definiert, auf einem initialen Zustand für ein festes . Sei der -te Wert von , d.h. . Außerdem sei und . Gegeben ein Zustand zu Zeit , wird der nächste Zustand wie folgt definiert:

(a) What dimensionality does the exam cellular automaton have? (1pt)

Antwort: 1-dimensional

Erklärung: Ein eindimensionaler zellulärer Automat arbeitet auf einer Linie von Zellen, also einem eindimensionalen Gitter. In der Problemstellung sehen wir, dass jede Zelle ihren Zustand basierend auf ihrem aktuellen Zustand und den Zuständen ihrer direkten Nachbarn ( und ) ändert. Da nur zwei Nachbarn (links und rechts) betrachtet werden, befindet sich das System in einer eindimensionalen Struktur.

(b) Define the neighborhood function that returns all neighboring cells’ indices given a cell index . (3pts)

Antwort:

Erklärung: Die Nachbarschaftsfunktion bestimmt, welche Zellen für die Berechnung des nächsten Zustands von Zelle betrachtet werden müssen. Da der Automat auf einem zyklischen Gitter arbeitet (das heißt, das Gitter ist „kreisförmig“ angeordnet, sodass die Zelle am Ende wieder mit der Zelle am Anfang verbunden ist), wird die Nachbarschaft durch und modulo definiert. Dies sorgt dafür, dass die Zellen „am Rand“ ihre Nachbarn korrekt identifizieren können. Zum Beispiel ist bei der linke Nachbar die Zelle und bei der rechte Nachbar die Zelle .

(c) A cellular automaton’s function is often given as the template below, which shows the inputs to on the top row and the respective output on the bottom row. Give a (possibly concise) definition for according to the template below. (3pts)

Erklärung: Die Funktion legt fest, wie sich der Zustand einer Zelle basierend auf den Zuständen ihrer Nachbarn ändert. In der Vorlage wird beschrieben, dass die Zelle stirbt (also den Zustand „dead“ annimmt), wenn die Kombination der Nachbarn und des aktuellen Zustands entweder oder ist. In allen anderen Fällen bleibt die Zelle am Leben (oder wird lebendig). Diese Regel ist eine vereinfachte Version einer „Regel 110“ oder einer anderen formalen Regel für zelluläre Automaten, bei der bestimmte Muster zum Überleben oder Sterben führen.

(d) With this function you have just defined, evolve this initial configuration by hand for three generations. Use one row per generation. (3pts)

  • Antwort: (Hier musst du die Konfigurationen für die nächsten drei Generationen zeichnen, da diese visuell und nicht als LaTeX/Mathe-Ausdruck dargestellt wird.)

Erklärung: Um die nächsten Generationen zu berechnen, musst du für jede Zelle die Regel anwenden, basierend auf ihrem aktuellen Zustand und den Zuständen der benachbarten Zellen. Die Zellen ändern ihren Zustand entsprechend den von definierten Regeln. Beginne mit dem angegebenen Ausgangsmuster, und wende die Regeln nacheinander für alle Zellen an, um die nächste Generation zu berechnen. Wiederhole diesen Prozess insgesamt dreimal, um die drei Generationen zu erhalten.

Diese drei Generationen sollten als separate Zeilen dargestellt werden, wobei jede Zeile die Zustände der Zellen für eine Generation repräsentiert.


4 Optimization (20pts)

Wir geben eine verkürzte Version der Definition für Optimierungsprozesse aus der Vorlesung und stellen dann einen neuen Optimierungsalgorithmus namens exam search vor.

Definition 2 (Optimization, shortened)

Sei ein beliebiger Raum, der state space genannt wird. Sei eine beliebige Menge, die target space genannt wird, und sei eine totale Ordnung auf . Eine Funktion wird target function genannt. Optimierung oder Minimierung ist das Verfahren, ein zu suchen, sodass optimal oder minimal ist.

Ein Optimierungslauf der Länge ist eine Sequenz von Zuständen , wobei für alle . Sei eine möglicherweise randomisierte oder nicht-deterministische Funktion, sodass der Optimierungslauf erzeugt wird, indem wiederholt aufgerufen wird, d.h., , wobei entweder extern festgelegt wird (z.B. ) oder zufällig gewählt wird (z.B. ). Ein Optimierungsprozess ist ein Tupel .

Erklärung:

Diese Definition beschreibt die Grundlage für einen Optimierungsprozess. Dabei ist der Raum aller möglichen Zustände, und ist eine Zielfunktion, die jedem Zustand einen Wert im Zielraum zuweist. Ziel der Optimierung ist es, einen Zustand zu finden, der den Wert von minimiert oder optimiert.

Die Zustände in einem Optimierungslauf entwickeln sich über die Zeit , wobei der Anfangszustand ist. Die Funktion erzeugt den nächsten Zustand , basierend auf dem bisherigen Verlauf der Zustände und der Zielfunktion . Der gesamte Optimierungsprozess ist die Folge aller Zustände zusammen mit der Zielfunktion und der Regel .


Sei ein Optimierungsprozess. Wir nehmen an, und .

Die Nachbarschaftsfunktion wird gegeben durch:

wobei die logische NOT-Funktion ist, d.h., und . Der Prozess setzt sich durch den exam search fort, wenn gegeben ist durch:


(a) Let target function

Lass den initialen Zustand sein. Wende den exam search auf diese Einstellung für 5 Zeitschritte an, d.h., berechne . Erreicht der exam search das globale Optimum innerhalb dieser fünf Schritte? Welcher Prozentsatz der möglichen Zustände innerhalb wurde während dieses Optimierungslaufs ausgewertet? Wie kann diese Zahl interpretiert werden? (11pts)


Lösung:

  • Initialzustand:
  • Nachbarn von :
  • Erster Schritt:
  • Nachbarn von :
  • Zweiter Schritt:
  • Nachbarn von :
  • Dritter Schritt:
  • Nachbarn von :
  • Vierter Schritt:
  • Nachbarn von :
  • Fünfter Schritt:

Zusammenfassung:

Das globale Optimum wurde gefunden. Der exam search hat 14 von 16 Zuständen ausgewertet, was fast den gesamten Suchraum abdeckt (ähnlich wie eine Brute-Force-Suche).

(b) Give a target function for which exam search never reaches the global optimum when starting from . Briefly explain why. (5pts)

Erklärung:

  • Das Starten bei führt zu einem lokalen Optimum, da ist und alle Nachbarn von den Wert haben. Exam search wählt immer den Zustand mit dem niedrigsten -Wert, daher wird es nicht zu einem Zustand wechseln, dessen -Wert höher ist. Da (das globale Optimum) nur bei erreicht wird und alle Zustände, die zwischen und liegen, den Wert 2 haben, bleibt der Algorithmus bei stecken und erreicht das globale Optimum nicht.

(c) State if exam search is elitist. Briefly explain why. (2pts)

Antwort:
Ja, exam search ist elitist, weil der Algorithmus die beste gefundene Lösung nie verwirft. Das liegt daran, dass der aktuelle Zustand immer in der Menge der möglichen nächsten Zustände enthalten ist, wie in der Definition von gezeigt:

Wenn kein besserer Nachbar gefunden wird, bleibt der Algorithmus einfach beim aktuellen Zustand.

(d) State if exam search is greedy. Briefly explain why. (2pts)

Antwort:
Ja, exam search ist greedy, weil der Algorithmus immer den Nachbarn mit dem niedrigsten -Wert wählt. Die Definition von zeigt, dass der Algorithmus in jeder Iteration sofort zur besten lokalen Option wechselt:

Dies entspricht dem typischen Verhalten eines gierigen Algorithmus, der in jedem Schritt die momentan beste Entscheidung trifft.


6 Artificial Chemistries / Soups (10pts)

Recollect Def. 4, which was used in the lecture. We also introduce a special kind of artificial chemistry called exam artificial chemistry with Def. 5.

Definition 4 (artificial chemistry, soup)

Let be a state space. Let be a set of reaction rules where each is a function . Let be a possibly randomized or non-deterministic function that returns a (multi-)set of reactants and a reaction rule to perform so that the reactants are suitable input to the reaction rule; the input to is a (multi-)set of elements from the state space, i.e., a population. The tuple defines an artificial chemistry. A population of an artificial chemistry is also called soup; each element is also called particle. The evolution of a soup for generations is a sequence so that is given as the initial soup and

where . Reaction rules are usually written in the form for .


Definition 5 (exam artificial chemistry, exam soup)

Let be a state space. Let be a set of reaction rules so that each is a function that is written in the form

for some where . The tuple defines an exam artificial chemistry. A population of an exam artificial chemistry is also called exam soup; each element is also called exam particle. The evolution of an exam soup for generations is a sequence so that is given as the initial exam soup and

where is a reaction rule chosen at random among those reaction rules whose required inputs exist within the exam soup and are said inputs (chosen at random if multiple such sets exist).


(a) What is the main structural difference between Def. 4 and Def. 5? How does the difference affect the evolution of the respective soups? (2pts)

Antwort:

In Def. 4 gibt es eine zusätzliche Funktion , die bestimmt, welche Reaktanten ausgewählt werden. In Def. 5 werden die Reaktanten und Reaktionen dagegen immer zufällig ausgewählt.

Erklärung:

Der Hauptunterschied ist, dass Def. 4 durch eine gezielte Auswahl der Reaktanten ermöglicht, während in Def. 5 alles zufällig abläuft. Dadurch kann die Evolution der Suppe in Def. 4 mehr kontrolliert werden, während sie in Def. 5 stärker von Zufällen abhängt.

(b) Consider the exam artificial chemistry given by and where

describes the cycle of beavers turning trees into logs (), beavers building dams from multiple logs (), dams turning rivers into lakes (), lakes breaking the dam over time and killing a beaver in doing so (), and trees regrowing over time (). Compute a possible evolution of the soup for as many time steps as necessary until a Dam appears. (Hint: Instead of random choices, you can decide which rules to apply to make the process quicker. Use the table below.) (2pts)

time stepchosen rulecurrent soup
0none{Beaver, Beaver, Log, Log, River}
1{Beaver, Beaver, Log, Log, River, Tree}
2{Beaver, Beaver, Log, Log, River, Log}
3{Beaver, Beaver, River, Dam}
4
5

(c1) When all rules are chosen at random in a fair manner, the soup from task (b) will eventually become unable to perform any reactions but . Briefly explain why.

Antwort:

Eventually, (dam breaking) will remove all beavers from the population, making the remaining rules unusable (except for , which can always be applied).


(c2) Give two new rules and so that any particle that occurs in (either as input or output of the rule) does not appear in (neither as input or output of the rule) and so that both and , i.e., the addition of or to on their own, enable the soup from task (b) to keep on performing at least two different reactions of indefinitely. (3pts)

Antwort:

  • fügt dem System Biber hinzu, sodass nach dem Entfernen der Biber durch neue Reaktionen möglich sind.
  • ermöglicht die Bildung von Dämmen und Flüssen, was neue Reaktionen in Gang hält.
  • Das ganze muss nicht Sinn in der Realität machen

(d) We now assume so that the particle (Beaver, (1.3, 3.7)) represents a beaver at the 2D coordinates (1.3, 3.7), for example. We further assume so that:

for any .

Task:

Give a function so that the artificial chemistry is a topological artificial chemistry. You can assume a given distance function in 2D space. You can also assume that the operation randomly samples a valid pair of reaction material and reaction rule that can be applied to from a soup and a reaction rule set .


Erklärung des Ausdrucks:

Die Funktion entscheidet, ob eine Reaktion stattfinden kann, basierend auf dem Abstand der Teilchen in einer chemischen Suppe . Die Idee ist, dass die Teilchen nicht einfach zufällig interagieren, sondern nur dann reagieren können, wenn sie nah genug beieinander sind.

Detaillierte Erklärung des Ausdrucks:

  1. :

    • ist die Teilmenge von , die die Teilchen enthält, die für die Reaktion ausgewählt wurden.
    • ist die Reaktionsregel, die auf die Teilchen in angewendet werden soll.
  2. Bedingung für die Reaktion:

    • Für alle Paare von Teilchen muss der Abstand zwischen ihren Positionen kleiner als 42 Einheiten sein. Die Funktion misst den Abstand zwischen zwei Punkten und in .
    • Erklärung: Diese Bedingung stellt sicher, dass die Teilchen nahe genug beieinander liegen, um an der Reaktion teilzunehmen. Nur wenn alle Teilchen von diese Bedingung erfüllen, kann die Reaktion stattfinden.
  3. Zufällige Auswahl von und :

    • Der Ausdruck "" bedeutet, dass die Teilchen und die Reaktionsregel zufällig aus der Menge und dem Reaktionsset ausgewählt werden.
    • Dies simuliert die zufällige Natur der chemischen Reaktionen, bei denen sowohl die Reaktanten (Teilchen) als auch die Reaktion zufällig bestimmt werden.
  4. Ergebnis:

    • Wenn die Bedingung erfüllt ist (alle Teilchen liegen nahe genug beieinander), dann wird als Ergebnis zurückgegeben, was bedeutet, dass diese Reaktion stattfinden kann.
    • Andernfalls: Wenn die Bedingung nicht erfüllt ist (die Teilchen sind zu weit auseinander), gibt die Funktion kein Ergebnis zurück, und die Reaktion findet nicht statt.

Zusammenfassung:

Die Funktion prüft, ob alle Teilchen, die an einer Reaktion teilnehmen, nah genug (innerhalb von 42 Einheiten) beieinander sind. Wenn das der Fall ist, wird eine zufällige Reaktion ausgewählt und ausgeführt. Wenn die Teilchen jedoch zu weit auseinander liegen, findet keine Reaktion statt. Diese Bedingung macht die Chemie topologisch, da die räumliche Nähe der Teilchen entscheidend ist.

Hier ist eine alternative Lösung in Worten und Pseudocode für die Aufgabe:


7 Evolutionary Computing (13pts)

If necessary, you can recollect the definition for evolutionary algorithms as used in the lecture on this page.

Algorithm 2 (typical evolutionary algorithm)

Let be a population-based optimization process.

  • Let be (possibly randomized or non-deterministic) selection functions that return individuals, i.e., and for all . They may possibly depend on (most commonly ). Let be a special selection function that, given a population , returns a random subset so that . Note that for all .

  • Let mutate : be a (possibly randomized or non-deterministic) single-individual mutation function. We write mutate[] : for the per-individual application of mutate, i.e., mutate[X] = \{ \text{mutate}(x) : x \in X \}.

  • Let recombine : be a (possibly randomized or non-deterministic) two-parent recombination function. We write recombine[] : for the random-pairing application of recombine, i.e., recombine[X] = \{ \text{recombine}(x_1, x_2) \} \text{ where } x_1, x_2 \sim X \text{ and recombine}(x) = \emptyset \text{ for all } x \text{ as well as recombine}[\emptyset] = \emptyset.

  • Let migrate : be a (possibly randomized or non-deterministic) individual creation function. We write migrate_N : with for the iterated application of migrate, i.e., migrate_N() = \{ \text{migrate}() \} \cup \text{migrate}_{N-1}() with migrate_0 = \emptyset.

The process continues via an evolutionary algorithm if has the form:

where is the number of mutants produced per generation, is the number of children produced per generation, and is the number of migrants (sometimes called hypermutants) generated per generation. Especially is often expressed as a rate for random choice within the population, i.e., where is called mutation rate.


(a) Assume you are using an evolutionary algorithm to come up with the answers for this exam. To this end, you are searching the space of all strings but you use a spell checker to convert all words occurring in your arbitrary strings to the closest valid word in the English dictionary. To grade your exam, we assign your solution a number of missing points between 90 and 0. While your algorithm surely wants to minimize the missing points, your overall goal is to minimize the grade you receive (between 1.0 and 4.0). In this scenario, describe what your target function, fitness function, genotype, and phenotype are. How is the relation between your target function and your fitness function and why is it good or bad to use two separate functions here? (4pts)

Lösung:

  • Genotype: arbitrary string
  • Phenotype: spell-checked string
  • Fitness function: missing points (the number of points you missed, between 0 and 90)
  • Target function: grade (between 1.0 and 4.0, which you want to minimize)

Erklärung:

  • Genotype: Repräsentiert eine beliebige Zeichenfolge, die die grundlegenden Daten des Individuums enthält.
  • Phenotype: Ist das Resultat, nachdem die Rechtschreibprüfung auf den Genotyp angewendet wurde, um eine gültige Zeichenfolge zu erhalten.
  • Fitnessfunktion: Misst, wie viele Fehlerpunkte fehlen (zwischen 0 und 90).
  • Ziel- oder Targetfunktion: Die Note (zwischen 1.0 und 4.0), die du minimieren willst.

Die Fitnessfunktion gibt kontinuierliches Feedback und ist “glatter”, was es einfacher macht, eine Lösung zu finden. Die Ziel- oder Targetfunktion ist diskreter (mit festen Werten), und es ist gut, eine separate Fitnessfunktion zu haben, die feiner abgestimmt ist.


Warum meine Lösung falsch war:

  • Genotype: {1.0, 1.3, 1.7…} war falsch. Der Genotyp ist kein Zahlenwert, sondern eine beliebige Zeichenfolge. Die Optimierung sucht nach Text, nicht nach Zahlen.
  • Phenotype: 1.0 war falsch. Der Phänotyp ist kein Zahlenwert, sondern die erzeugte Zeichenfolge nach der Rechtschreibprüfung. Du optimierst Text und erhältst einen validen Text als Phänotyp, nicht eine Note direkt.

(b) We assume an evolutionary algorithm implemented in Python is optimizing individuals that are simply lists of four integers. Note that the Python function random.random() returns a random float between 0.0 and 1.0. Consider the following snippet of Python code.

Code-Analyse:

import random
 
def unknown_operator(individual_a, individual_b):
    new_individual = []
    for i, value_a in enumerate(individual_a):
        value_b = individual_b[i]
        if random.random() < 0.5:
            new_individual.append(value_a)
        else:
            new_individual.append(value_b)
    return new_individual
 
print(unknown_operator([0, 0, 0, 1], [1, 0, 0, 0]))

Funktionsweise des Codes:

  1. Zufallswert-Generierung:

    • Der Code verwendet die Funktion random.random(), die einen zufälligen Float zwischen 0.0 und 1.0 zurückgibt. Diese Zufallswerte bestimmen, von welchem Elternteil das jeweilige Gen (Wert) in das neue Individuum übernommen wird.
  2. Durchlaufen der Gene:

    • Die Funktion unknown_operator nimmt zwei Eltern-Individuen (individual_a und individual_b) entgegen, die Listen von vier Ganzzahlen sind. Die Funktion iteriert über die Indizes und Werte von individual_a mithilfe von enumerate.
  3. Gene-Kombination:

    • Für jede Position in der Liste entscheidet die Funktion basierend auf dem Zufallswert:
      • Wenn der Wert kleiner als 0.5 ist, wird das Gen von individual_a (value_a) in new_individual aufgenommen.
      • Andernfalls wird das Gen von individual_b (value_b) verwendet.

Mögliche Ausgaben:

Die Funktion kann die folgenden Kombinationen zurückgeben, abhängig von den generierten Zufallswerten:

  • [0, 0, 0, 1]: Alle Gene stammen von individual_a.
  • [0, 0, 0, 0]: Das vierte Gen stammt von individual_b, die ersten drei von individual_a.
  • [1, 0, 0, 0]: Das erste Gen stammt von individual_b, die letzten drei von individual_a.
  • [1, 0, 0, 1]: Das erste Gen stammt von individual_b, das vierte von individual_a, die zweiten und dritten von individual_a.

Erklärung der Lösung:

  • Kombination der Eltern: Der Code implementiert eine Zwei-Eltern-Kombination, bei der das neue Individuum nur aus den Werten der beiden gegebenen Eltern erstellt wird. Die Gene werden nicht basierend auf einer vollständigen Bit-Kombination (von 0000 bis 1111) erstellt, sondern sind das Ergebnis einer selektiven Rekombination der beiden Eltern-Individuen.
  • Korrektur der Sichtweise: Meine vorherige Lösung war falsch, da ich alle möglichen Kombinationen von 0000 bis 1111 aufgelistet hast. Es ist wichtig zu beachten, dass die Ausgaben des Codes ausschließlich von den Werten in den Eltern-Individuen abhängen. Nur Kombinationen der Werte [0, 0, 0, 1] und [1, 0, 0, 0] sind zulässig.

Fazit:

Die Funktion unknown_operator erzeugt durch die zufällige Auswahl von Werten aus zwei Eltern-Individuen eine neue Individuenliste. Dies zeigt, wie Rekombination in evolutionären Algorithmen funktioniert, indem sie gezielt Merkmale von bestehenden Lösungen kombiniert, um neue potenzielle Lösungen zu schaffen.

(c) We still consider an evolutionary algorithm optimizing individuals that are lists of four integers, i.e., . In a suitable formalism (Python, pseudo-code, mathematics, …) give a viable mutation function for these kinds of individuals. Said mutation function must be able to reach any arbitrary individual in the state space — when given any arbitrary individual as a starting point and infinite time — but should also not change the mutated individual completely. (4pts)

def mutate(individual):
    # Wähle einen zufälligen Index in der Liste
    index = round(random.random() * len(individual))
 
    # Entscheide zufällig, ob der Wert an diesem Index erhöht oder verringert wird
    if random.random() < 0.5:
        individual[index] += 1  # Erhöhe den Wert an dem ausgewählten Index
    else:
        individual[index] -= 1  # Verringere den Wert an dem ausgewählten Index
 
    return individual
 

Erklärung:

Die Mutation in einem evolutionären Algorithmus soll kleine, zufällige Veränderungen in den Individuen bewirken, um neue mögliche Lösungen zu erzeugen. Diese Mutation muss in der Lage sein, jeden möglichen Zustand im Suchraum zu erreichen, sollte aber auch nicht die Struktur des Individuums vollständig verändern.

  • Index auswählen: Zuerst wird eine zufällige Position im Individuum ausgewählt (index), an der die Mutation durchgeführt wird. Dies wird durch random.random() und round() erreicht, um eine Zufallszahl zwischen 0 und der Länge des Individuums zu erzeugen.
  • Wert ändern: Danach entscheidet ein weiterer Zufallswert (random.random() < 0.5), ob der Wert an der ausgewählten Position um 1 erhöht oder um 1 verringert wird. Dies sorgt für eine kleine, aber zufällige Änderung am Individuum.
  • Viabilität: Durch dieses Vorgehen können theoretisch alle möglichen Individuen im Suchraum erreicht werden (infinite time), aber die Mutation ändert immer nur einen kleinen Teil des Individuums, sodass die Struktur nicht völlig zerstört wird.

Beispiel-Durchlauf:

Angenommen, das Ausgangsindividuum ist:

individual = [2, 5, 3, 7]

Schritt 1: Wähle einen zufälligen Index

Ein Zufallswert wird generiert, um den Index zu bestimmen. Angenommen, random.random() gibt 0.6 zurück. Da die Länge des Individuums 4 ist:

index = round(0.6 * 4)  # round(2.4) = 2

Der zufällig ausgewählte Index ist also 2, was bedeutet, dass die Position 3 im Individuum (3) verändert wird.

Schritt 2: Wert ändern

Ein weiterer Zufallswert entscheidet, ob der Wert an der ausgewählten Position um 1 erhöht oder verringert wird. Angenommen, random.random() ergibt 0.3:

if random.random() < 0.5:
    individual[2] += 1  # individual[2] war 3, wird nun 4

Der Wert an der Position 2 wird um 1 erhöht.

Endergebnis:

Das mutierte Individuum ist nun:

individual = [2, 5, 4, 7]

Zusammenfassung:

  • Das Ausgangsindividuum war [2, 5, 3, 7].
  • Der Zufallsindex, an dem die Mutation stattfand, war 2.
  • Der Wert an dieser Position wurde um 1 erhöht.
  • Das mutierte Individuum ist nun [2, 5, 4, 7].

Die Mutation sorgt dafür, dass nur kleine Änderungen vorgenommen werden, die das Individuum nicht komplett verändern, aber im Laufe der Zeit theoretisch alle möglichen Zustände erreichen können.

(d) What is a memetic algorithm and how does it deviate from the standard evolutionary algorithm? When might it be advantageous to use one? (2pts)

Lösung:

A memetic algorithm uses a second evolution, most commonly to adjust hyperparameters of the first evolution. That might be advantageous when the target function might change unexpectedly, for example.


Erklärung:

Ein memetischer Algorithmus kombiniert die Idee der klassischen evolutionären Algorithmen mit einer zusätzlichen lokalen Optimierung. Nach dem Standardprozess der Selektion, Mutation und Rekombination wird eine lokale Optimierung auf die erzeugten Individuen angewendet, um die Ergebnisse weiter zu verbessern.

  • Abweichung von Standard-Evolution: In einem klassischen evolutionären Algorithmus erfolgt keine lokale Optimierung. Ein memetischer Algorithmus führt jedoch eine zusätzliche, oft deterministische Optimierung nach jedem Schritt der Evolution durch.
  • Vorteile: Memetische Algorithmen sind besonders nützlich, wenn die Zielfunktion komplex ist oder sich während des Optimierungsprozesses ändern kann. Dadurch kann der Algorithmus schneller zu einer besseren Lösung finden, da lokale Verbesserungen parallel zur evolutionären Suche erfolgen.