Optimierung
Wertebereich bei uns ausschließlich diskret
- Zielfunktion: soll maximiert werden (Minimierung durch Vorzeichenwechsel)
- Ungleichheitsbedingungen:
- Gleichheitsbedingungen:
Spezialfall heißt constraint satisfaction problem
Approximation:
Greedy-Optimierung
Problemklasse:
- Wir verwenden eine Nachbarschaftsrelation im Raum der Lösungen , die es erlaubt, Lösungen schrittweise aus anderen Lösungen aufzubauen
- Die Zielfunktion und Nebenbedingungen und sind effizient berechenbar für alle Nachbarn einer Lösung
Prinzip:
- Starte bei einer Lösung (muss und nicht unbedingt erfüllen)
- und noch nicht erfüllt wähle welches diese am besten erfüllt
- und erfüllt wähle welches Nebenbedingungen weiterhin erfüllt und weiter maximiert
- Gehe zu 1. mit oder stoppe, wenn keine bessere Lösung in gefunden
Beispiele:
- Prim’s Algorithmus für minimale Spannbäume
- Dijkstra’s Algorithmus für Kürzeste-Pfade-Bäume
Achtung
Greedy-Algorithmen führen nur zu lokalen Optima, haben aber gute Laufzeit
Heuristische Optimierung
Greedy Best-First Search
Idee: Schätze die Nähe zu für jeden Knoten basierend auf einer problemspezifischen Heuristik
- Euklidische Distanz, Länge eines bekannte Pfades, etc.
Problem: Oft schnell, aber bei Irrwegen auch beliebig schlecht
A*-Algorithmus
Idee: Dijkstras Algortihmus mit Heuristik kombinieren Startknoten , Zielknoten
Dijkstra: Es werden die kürzesten Pfade von 𝑠 zu allen anderen Knoten berechnet (SPT), indem alle Nachbarn des Knoten, der am nähesten an ist, relaxiert
A*-Algorithmus: Es wird der kürzeste Pfad von 𝑠 zu 𝑡 berechnet, indem alle Nachbarn des Knoten, der geschätzt am nähesten an ist, relaxiert (verwendet ebenfalls Prioritätswarteschlange)
Ablauf:
- Initialisiere alle kürzesten Distanzen vom Startknoten zu alle Knoten mit und
- Füge mit der Priorität in die Warteschlange ein
- Entferne den nächsten Knoten aus der Prioritätswarteschlange
- Wenn der Zielknoten ist, gebe den kürzesten Pfad zurück
- Ansonsten relaxiere alle Kanten :
Wenn dann
- Füge mit der Priorität in die Warteschlange ein
- Wiederhole Schritt 3, 4 und 5
Unterschied zu Dijkstra: Wir kennen einen Zielknoten, während Dijkstra einen SPT generiert
- Dijkstra als Spezialfall
- Unterschied im Algorithmus / Code: Prioritäten beim Einfügen in Warteschlange mit Heuristik berechnen
Heuristik
Optimalität der Pfade wird durch zwei Eigenschaften der Heuristik garantiert:
- Die Heuristik muss zulässig sein: Sie darf die Kosten (minimale Pfadlänge) nie Überschätzen, ansonsten leidet die Laufzeit massiv.
- Die Heuristik soll konsistent sein: Für jeden Knoten und jeden Nachfolgeknoten von gilt .
- es kann sonst passieren, dass Knoten “übersehen” werden
Dynamische Programmierung
Anwendung bei Optimierungsproblemen mit rekursiver Struktur, bei der Lösung aus Kombination von Optimierungsproblemen berechenbar ist
Idee: Berechne optimale Lösung für die kleinsten Teilprobleme und speichere diese (memorize). Benutze die gespeicherten Ergebnisse, um das nächstgrößere Teilproblem zu lösen
Beispiel: Fibonacci-Berechnung
Bellmann-Gleichung
- System im Urzustand (z.B. Position in einem Labyrinth)
- Wir haben in jedem Zeitschritt die Möglichkeit eine von Aktionen auszuführen (z.B. nach vorn / rechts / links / hinten gehen)
- Dafür gibt es eine Belohnung (auch als Strafe einsetzbar)
- Es gibt eine Dynamik, die den Zustand aufgrund der Aktion verändert:
Ziel: Finde diejenige Sequenz an Aktionen welche die Summe maximiert.
Bellmann-Gleichung: Wenn wir die Wertefunktion definieren als
dann gilt

Optimale Matrixmultiplikation
Wenn wir mehr als zwei Matrizen multiplizieren, gibt es mehrere Möglichkeiten, die Multiplikation durchzuführen, welche deutlich unterschiedlichen Aufwand haben können
Lösung mit dynamischer Programmierung
Idee: Gegeben die Matrizen berechnen wir die minimale Anzahl von Multiplikationen um die Matrizen zu multiplizieren
Bellman-Gleichung (leicht abgewandelt):
- berechnet über Kosten für
- hierbei: Value-Funktion + Value-Funktion + Kosten (reward)
- speichert den Index an dem die Multiplikation in zwei Produkte zerlegt wird
- Initialisierung mit
- Iteration über die Länge von
