Wird geladen ...

Feedback geben

Wenn du deine E-Mail-Adresse angibst (optional), können wir dir bei Fragen antworten.

Feedback geben

Link melden

Deine Meldung wird anonym an uns gesendet.

Freundschaftlich Lernunterlagen tauschen - auf LernBase.de

Algorithmen im Überblick (Uni Köln)

Lineare Optimierung

Fourier-Motzkin

Löst Ungleichungssysteme der Form Ax \le b, bzw. \sum_{j=1}^{n}{a_{ij}x_j \le b_i \ (1 \le i \le m)} oder stellt fest, dass es keine Lösung gibt

Algorithmus

  • wir betrachten das allgemeine Ungleichungssystem Ax \le b
  • wir fassen wie vorher je 2 Ungleichungen zusammen, in denen x_1 unterschiedliche Vorzeichen hat
  • durch Elimination erhalten wir ein Ungleichungssystem A'x \le b'
  • wobei die erste Spalte von A' nur Nullen enthält
  • wir wissen Ax \le b lösbar \gdw A'x \le b' lösbar
  • damit haben wir die Lösung von Ax \le b auf die Lösung von A'x \le b' reduziert

Fourier-Motzkin-Elimination

  1. berechne rekursiv eine Lösung (x_2, ... , x_n) für das System A'x \le b'
  2. wenn keine Lösung existiert: stop
  3. berechne x_1 mittels Rückwärtssubstitution

Dabei sind nur zwei Operationen zulässig:

  1. Multiplikation einer Ungleichung mit einer positiven Zahl
  2. Addition von zwei Ungleichungen

Bäume und Wege

Blau-Rot-Algorithmus

Bestimmt einen minimal aufspannenden Baum. Es werden zwei Färbungsregeln in beliebiger Reihenfolge auf die Kanten des Graphen angewandt. Die zum Schluss mit Blau markierten Kanten bilden den minimal aufspannenden Baum.

Merke: Blau = Schnitt + günstigste Kante, Rot = Kreis + teuerste Kante, Blau bildet MST

Vorgehen

B - Regel blau - Schnitt:

  • wähle einen Schnitt, der keine blaue Kante enthält
  • bestimme darin eine kürzeste ungefärbte Kante und färbe sie blau

R - Regel rot - Kreis:

  • wähle einen Kreis im Graphen, der keine rote Kante enthält
  • bestimme darin eine längste ungefärbte Kante und färbe sie rot

Prim

Greedy-Verfahren; Bestimmt einen MST mit Laufzeit: O(n^2)

Vorgehen:

  1. Setze T = \empty, und wähle einen beliebigen Startknoten s
  2. Füge die günstigste, zu s inzidente Kante zu T hinzu
  3. Füge die günstigste, zu T adjazente Kante zu T hinzu ohne einen Kreis zu erzeugen
  4. Ist kein weiteres Hinzufügen möglich, stellt T einen Baum dar

Hat der Graph mehr als nur eine Zusammenhangskomponente, so muss der Algorithmus für jede Zusammenhangskomponente ausgeführt werden. Die daraus gewonnenen T's bilden einen Wald.

Kruskal

Greedy-Verfahren; Bestimmt einen MST mit Laufzeit: O(|E| \cdot \log (|V|))

Ähnlich Prim, jedoch werden die Kantengewichte vorher sortiert und dann den Gewichten aufsteigend zu T hinzugefügt.

Vorgehen:

  1. Setze T = \empty, und sortiere die Kantengewichte
  2. Füge die nächstgünstigste Kante zu T hinzu ohne einen Kreis zu erzeugen
  3. Ist kein weiteres Hinzufügen möglich, stellt T einen Baum dar

Ford

Bestimmt kürzesten Weg mit Laufzeit ???. Kommt mit negativen Kreisen nicht zurecht.

Alle Kanten so lange optimieren, bis zulässiges Potential erreicht.

Per Hand: Tabelle aufstellen mit dist und pred für jeden Knoten.

Verfahren

Für jeden Knoten werden zwei Werte gespeichert:

  • dist: Die Entfernung, bzw. Kosten vom Startknoten
  • pred: Der Vorgängerknoten, durch den die Entfernung dist zustandekommt.

Initialisierung: Für alle v: dist(v) = \infty, pred(v) = nil; dist(s) = 0, pred(s) = s
Iteration: Immer wieder alle Kanten durchgehen und dist und pred aktualisieren, falls: dist(v)>dist(u)+c(u,v), also man über den Knoten u günstiger zu v kommt.

Algorithmus

dist (s) = 0, pred (s) = s
for all v \in V \setminus \lbrace s\rbrace do
  dist (v) = \infty
  pred (v) = nil
end do
while exists (u,v) \in E with dist(v) > dist(u) + c(u,v) do
  dist (v) = dist (u) + c(u,v)
  pred (v) = u
end while

Bellman / Ford

Berechnet kürzeste Wege mit Laufzeit O(mn).

Beginnt mit Kantenlänge 1, erhöht diese in jedem Schritt und prüft auf zulässiges Potential. Entdeckt auch negative Kreise. Maximal n=|V| Schritte. Im letzten Schritt wird nur noch geprüft, ob es negative Kreise gibt.

Algorithmus

d_k speichert den bisher kürzesten gefunden Weg der Länge k

d_0(s) = 0, d_0(v) = \infty \ \ \forall v \in V \setminus \{ s\}
for k=1,...,n,  v \in V \setminus \{ s\} do

d_{k+1}(v)=min \{ d_k(v), d_k(u)+c(u,v) : (u,v) \in E \}

end do

Dijkstra

Greedy Algorithmus zur Berechnung eines kürzesten Pfades. Laufzeit: O(n²)

Die Grundidee des Algorithmus ist, ab einem Startknoten die kürzest möglichen Wege weiter zu verfolgen und längere Wege beim Updaten auszuschließen. Er besteht aus diesen Schritten:

  1. Weise allen Knoten die beiden Eigenschaften "Distanz" und "Vorgänger" zu. Initialisiere die Distanz im Startknoten mit 0 und in allen anderen Knoten mit ?.
  2. Solange es noch unbesuchte Knoten gibt, wähle darunter denjenigen mit minimaler Distanz aus und
    1. Speichere, dass dieser Knoten schon besucht wurde
    2. Berechne für alle noch unbesuchten Nachbarknoten die Summe des jeweiligen Kantengewichtes und der Distanz im aktuellen Knoten
    3. Ist dieser Wert für einen Knoten kleiner als die dort gespeicherte Distanz, aktualisiere sie und setze den aktuellen Knoten als Vorgänger.
      Dieser Schritt wird auch als Update bezeichnet und ist die zentrale Idee von Dijkstra.

In dieser Form berechnet der Algorithmus ausgehend von einem Startknoten die kürzesten Wege zu allen anderen Knoten. Ist man dagegen nur an dem Weg zu einem ganz bestimmten Knoten interessiert, so kann man in Schritt (2) schon abbrechen, wenn der gesuchte Knoten der aktive ist.

Matroide

Eine Menge E und eine F \subseteq 2^E eine Familie von Teilmengen bilden ein Matroid (E, F), wenn:

  1. \empty \in F
  2. X \in F, \ Y \subseteq X \Rightarrow Y \in F
  3. zu X, Y \in F mit |X| < |Y| existiert ein y \in Y \setminus X sodass X \cup y \in F (Augmentierungseingeschaft)

Branchings

Ein Branching ist eine Kantenmenge B \subseteq E mit den folgenden Eigenschaften:

  • B (ungerichtet aufgefasst) ist ein Wald
  • für alle (u,v), \ (x,y) \in B : v \neq y

Eine Arboreszenz ist ein aufspannendes Branching.

Branching Algorithmus

  1. kritischen Graphen H mittels Greedy bestimmen
  2. ist H azyklisch, stop, denn H ist ein maximales Branching
  3. schrumpfe die Kreise von H zum Graphen (G', c')
  4. berechne rekursiv ein maximales Branching B' in (G', c')
  5. expandiere B' zu einem maximalen Branching B

Laufzeit: O(m*log(n)) oder O(n²) je nach Implementierung

sei umgekehrt B0 ein Branching in G0 mit Gewichten c0
• sei B die Kantenmenge von G, die durch Expandieren entsteht:
• falls B0 eine Kante e0 = (u,w) enthält:
• sei e(e0) = (u, v ) mit v 2 V(C)
• sei (x, v ) 2 V(C) die Kreiskante mit Endknoten v
• sei B = B0 r (u,w) [ (u, v ) [
`

C r (x, v )
´
• andernfalls:
• sei B = B0 [ (C r a)
• dann ist B ein C-optimales Branching in G

Folie 26

Flüsse

Ford / Fulkerson

Gehe alle möglichen Wege von s nach t durch und erhöhe die Kapazität. Wiederhole, bis Kapazität nicht mehr erhöht werden kann.

  1. setze f(u,v) := 0 für alle (u,v) \in A
  2. konstruiere D_f
  3. falls in D_f kein augmentierender Weg existiert, stop
  4. andernfalls sei P ein augmentierender Weg mit Restkapazität c_f(P)
  5. für jede Kante (u,v) \in P:
  6. ist (u,v) Vorwärtskante, so setzte f(u,v) := f(u,v) + c_f(P)
  7. ist (u,v) Rückwärtskante, so setzte f (v,u) := f (v,u) ? c_f(P)
  8. gehe zu (2)

Edmonds / Karp

Genauso wie Ford / Fulkerson, jedoch mit

4. andernfalls sei P ein kürzester (in Anzahl der Kanten) augmentierender Weg

D.h. die einzelnen Wege nicht zufällig ausprobieren, sondern die kürzesten zuerst.

Preflow-Push

Preflow-Push berechnet den maximalen Fluss von s nach t mittels einem Preflow, der während der Berechnung die Flusserhaltung nicht garantiert. Jeder Knoten v bekommt ein Reservoir e(v), welches unbegrenzt ist und die aktuelle Flussbilanz speichert. h(v) hält dagegen die aktuelle Höhe des Knotens fest.

In jedem Schritt ein gültiger Schnitt (Folie 28) vorhanden. Starke Dualitätsbeziehung.

  1. Initialisierung
    1. h(v), e(v) = 0 \ \ \forall v \in V \setminus \{ s\}
    2. h(s) = |V|, e(s) = -1 \cdot \sum c(s,u) \ \forall (s,u) \in E;
    3. f(s,v) := c(s,v), e(v) = c(s,v) für alle (s,v) \in A
  2. führe push oder lift aus, solange noch eine Prozedur anwendbar ist.

 

Beispiel (Sei |V| = 7):
graph

Die push-Operation heißt saturierend, falls anschließend c_f(u,v)=0. Dem Algorithmus ist egal, ob es sich um Vorwärts- oder Rückwärtskanten handelt. Wenn freie Kapazität vorhanden, dann wird gepusht. Pushen kann man nur von einem höheren auf einen niedrigeren Knoten.

lift
ein Knoten wird auf die Höhe des Nachbarn zu dem eine Kante mit freier Kapazität existiert h(u) + 1 angehoben.
push
Flusswert aus dem Reservoir wird zu einem Nachbarn gepusht. Vorwärtskante: Fluss+, Rückwärtskante: Fluss-.

Matchings

Tutte-Berge Formel

Die Formel hilft zu überprüfen, ob ein gefundenes Matching ein Maximalmatching darstellt.

2 \cdot max \{ |M| : M \ \mbox{Matching in} G \} = min \{ |V| - (o_G(X) - |X|) : X \subseteq V \}

Wobei X eine trennende Knotenmenge ist und o_G die Anzahl der Zusammenhangskomponenten von G \setminus X, die eine ungerade Anzahl von Knoten haben.

 

 

« Zurück zur Liste

Kursinformation

Hochschule:
Universität zu Köln
Veranstaltung:
Effiziente Algorithmen
Semester:
Winter 2009/2010
Leitung:
Prof. Dr. R. Schrader

 

Download:
PDF-Dokument

Teilen

Leite dieses Dokument an Freunde weiter.