Matching (Graphentheorie)

Aus Demo Wiki
(Weitergeleitet von Maximales Matching)
Zur Navigation springenZur Suche springen

Vorlage:Weiterleitungshinweis

Die Theorie um das Finden von Matchings in Graphen ist in der diskreten Mathematik ein umfangreiches Teilgebiet, das in die Graphentheorie eingeordnet wird.

Folgende Situation wird dabei betrachtet: Gegeben sei eine Menge von Dingen und zu diesen Dingen Informationen darüber, welche davon einander zugeordnet werden könnten. Ein Matching (in der Literatur manchmal auch Paarung) ist dann als eine solche Auswahl aus den möglichen Zuordnungen definiert, die kein Ding mehr als einmal zuordnet.

Die am häufigsten gestellten Fragen in dieser Situation sind dann die folgenden:

  1. Wie findet man ein Matching, das eine maximale Anzahl<ref group="A">Beachte den Unterschied zwischen einem maximalen Element und einem Maximum. Bei der Formalisierung wird darauf genauer eingegangen.</ref> an Dingen einander zuordnet?
    Dieses Problem ist das klassische Matchingproblem.
  2. Gibt es ein Matching, das alle Dinge zuordnet? Wenn ja, wie viele?
    Solche Matchings heißen perfektes Matching. Die Anzahl der perfekten Matchings in einem Graphen <math>G</math> wird meistens mit <math>\Phi(G)</math> notiert.
  3. Angenommen, man könnte quantifizieren „wie wichtig“ (oder „teuer“) die einzelnen Zuordnungen wären: Wie findet man dann ein Matching, das eine maximale Zahl von Dingen zuordnet und dabei ein möglichst großes (oder kleines) Gewicht hat?
    Dieses Problem heißt gewichtetes Matchingproblem. Zwischen einer Maximierungs- und einer Minimierungsaufgabe wird hier oftmals nicht unterschieden: Indem man bei allen Gewichten (Kosten) das Vorzeichen vertauscht, kann man beide Probleme ohne nennenswerten Aufwand ineinander überführen.
  4. Angenommen, man hätte genau zwei Klassen von Dingen und angenommen, man wüsste, dass es ausschließlich zwischen diesen Klassen mögliche Zuordnungen gibt. Werden die Probleme 1–3 dadurch einfacher?
    Dieses Problem heißt bipartites (gewichtetes) Matchingproblem und ist ein viel diskutierter Spezialfall.
  5. Kann man anderes Wissen, das man über die Struktur der möglichen Zuordnungen hat, ähnlich wie in 4 geschickt benutzen, um die Probleme 1–3 effizienter zu lösen?

Die Theorie um die Matchings untersucht möglichst effiziente Lösungsverfahren dieser Probleme, klassifiziert diese nach ihrer Laufzeit mit den Methoden der Komplexitätstheorie und stellt Beziehungen dieser Probleme zueinander und zu anderen Problemen in der Mathematik her.

Definitionen

[Bearbeiten]

Das oben beschriebene Problem lässt sich wie folgt formalisieren. Gegeben sei ein endlicher, ungerichteter Graph <math>G=(V,E)</math>. Eine Menge <math>M\subseteq E</math> heißt Matching, wenn keine zwei Kanten aus <math>M</math> einen Knoten gemeinsam haben. Ein Matching heißt

nicht erweiterbar (engl. maximal matching)
falls es keine Kante <math>e\in E\setminus M</math> derart gibt, dass <math>\{e\}\cup M</math> ein Matching ist. Maximale Matchings sind im Vergleich zu den folgenden Begriffen sehr einfach zu berechnen.
größtmöglich (engl. maximum matching)
falls <math>M</math> als Menge eine maximale Kardinalität unter allen Matchings von <math>G</math> hat. Maximum-Matchings sind maximal. Die Mächtigkeit eines Maximum-Matchings wird Matchingzahl genannt und mit <math>\nu(G)</math> notiert.
perfekt
falls <math>2 \cdot | M | = | V |</math> gilt, d. h. wenn jeder Knoten gematcht wurde. Perfekte Matchings sind Maximum-Matchings und damit auch maximal. Perfekte Matchings können als 1-Faktoren eines Graphen, das heißt 1-reguläre aufspannende Teilgraphen, aufgefasst werden. Dieser Auffassung folgend spricht man auch von faktorisierbaren Graphen, wenn sie einen 1-Faktor besitzen.<ref>Yu & Liu 4.</ref>

Definitionen (gewichtetes Matching-Problem)

[Bearbeiten]

Für das gewichtete Matchingproblem spielt eine Kostenfunktion <math>c \colon E\to \mathbb{R}</math> eine Rolle. Ein Matching heißt

maximal
falls <math>c(M) := \sum_{e\in M} c(e)</math> maximal unter allen Matchings von <math>G</math> ist.
minimal maximal
falls <math>c(M)</math> minimal unter allen maximalen Matchings ist.

Eigenschaften

[Bearbeiten]

In jedem Graphen ohne isolierte Knoten ist die Summe der übereinstimmenden Matchingzahl und der Kantenüberdeckungszahl gleich der Anzahl der Knoten. Wenn es ein perfektes Matching gibt, sind sowohl die Matchingzahl als auch die Kantenüberdeckungszahl gleich <math>\tfrac{|V|}{2}</math>.

Wenn <math>A</math> und <math>B</math> zwei nicht erweiterbare Matchings sind, dann gilt <math>|A| \leq 2 \cdot |B|</math> und <math>|B| \leq 2 \cdot |A|</math>. Das liegt daran, dass jede Kante in <math>B \setminus A</math> höchstens mit zwei Kanten in <math>A \setminus B</math> benachbart sein kann, weil <math>A</math> ein Matching ist. Außerdem grenzt jede Kante in <math>A \setminus B</math> an eine Kante in <math>B \setminus A</math>, weil <math>B</math> nicht erweiterbar ist. Daher gilt

<math>|A \setminus B| \leq 2 \cdot |B \setminus A|</math>

Daraus folgt

<math>|A| = |(A \cap B) \cup (A \setminus B)| = |A \cap B| + |A \setminus B| \leq 2 \cdot |A \cap B| + 2 \cdot |B \setminus A| = 2 \cdot (|B \cap A| + |B \setminus A|) = 2 \cdot |(B \cap A) \cup (B \setminus A)| = 2 \cdot |B|</math>

also <math>|A| \leq 2 \cdot |B|</math>.

Wenn der Graph zum Beispiel ein Pfad mit 3 Kanten und 4 Knoten ist, beträgt die Größe eines minimalen maximalen Matchings 1 und die Größe eines perfekten Matchings beträgt 2.

Kombinatorik

[Bearbeiten]

Die Anzahl der Matchings mit <math>k</math> Kanten für bestimmte Graphen zeigt die folgende Tabelle:<ref>Wolfram MathWorld: Matching</ref>

Anzahl der Matchings mit k Kanten
vollständiger Graph <math>K_n</math> <math>\frac{n!}{(2 \cdot k)!! \cdot (n - 2 \cdot k)!} = \frac{n!}{2 ^ k \cdot k! \cdot (n - 2 \cdot k)!}</math>
vollständig bipartiter Graph <math>K_{n,n}</math> <math>k! \cdot \binom{n}{k}^2 = \frac{(n!)^2}{k! \cdot ((n - k)!)^2}</math>
Kreisgraph <math>C_n</math> <math>\frac{n}{n - k} \cdot \binom{n - k}{k} = \frac{n \cdot (n - k - 1)!}{k! \cdot (n - 2 \cdot k)!}</math>
Pfadgraph <math>P_n</math> <math>\binom{n - k}{k} = \frac{(n - k)!}{k! \cdot (n - 2 \cdot k)!}</math>

Historisches

[Bearbeiten]
Datei:Sylvester counter.svg
Sylvester gab für Aussage (2) ein Beispiel an, das zeigt, dass sie für Graphen mit drei oder mehr Brücken nicht mehr stimmt: ein 3-regulärer Graph mit 16 Knoten, drei Brücken und keinem perfekten Matching.

Als eine der frühesten<ref name="ReferenceA">Lovász & Plummer xi.</ref><ref>Yu & Liu 3.</ref> systematischen Untersuchungen von Matchings wird ein Artikel von Julius Petersen angeführt, der 1891 über „Die Theorie der regulären graphs“ schrieb.<ref>Vorlage:Cite journal</ref> Er untersuchte ein Zerlegungsproblem aus der Algebra, das David Hilbert 1889<ref>Vorlage:Cite journal</ref> gestellt hatte, indem er es als Graphenproblem formulierte.<ref name="ReferenceA" /> Letztlich bewies er darin folgendes:

Für alle Zahlen <math>k\in \mathbb{N}</math> kann jeder <math>2k</math>-reguläre Graph in disjunkte <math>2</math>-Faktoren zerlegt werden. (1)
Jeder kubische, zusammenhängende Graph mit weniger als drei Brücken besitzt ein perfektes Matching. (2)

Die Tatsache (2), bekannt als Satz von Petersen, lässt sich auch als eine leichte Verallgemeinerung des Eulerkreisproblems formulieren.<ref group="A">Es ist nicht bekannt, ob Petersen mit den Arbeiten von Euler 1736 zu diesem Problem vertraut war (Lovász & Plummer xi).</ref>

Rückblickend erscheinen Petersens Argumente, mit denen er das Obige bewies, kompliziert und umständlich.<ref name="Diestel">Vorlage:Cite book</ref>Vorlage:Rp Bei der weiteren Untersuchung etwa durch Brahana 1917<ref>Vorlage:Cite journal</ref>, Errera 1922<ref>Vorlage:Cite journal</ref> und Frink 1926<ref>Vorlage:Cite journal</ref> sowie zusammenfassend durch Kőnig 1936<ref>Vorlage:Cite book</ref> wurden aber viele Methoden der modernen Graphentheorie entwickelt oder zuerst systematisch formuliert. Petersens Denkansatz wurde dann von Bäbler 1938<ref>Vorlage:Cite journal</ref> 1952<ref>Vorlage:Cite journal</ref> und 1954<ref>Vorlage:Cite journal</ref> sowie von Gallai 1950<ref>Vorlage:Cite journal</ref>, Belck 1950<ref>Vorlage:Cite journal</ref> und schließlich Tutte auf andere reguläre Graphen übertragen.

In modernen Lehrbüchern und Vorlesungen tauchen Petersens ursprüngliche Resultate, wenn überhaupt, meist nur noch als Folgerungen aus den Resultaten von Tutte oder Hall auf. Im Buch von Diestel folgt die erste Aussage aus dem Heiratssatz von Hall.<ref name="Diestel" />Vorlage:Rp Die zweite Aussage wird auf den Satz von Tutte zurückgeführt.<ref name="Diestel" />Vorlage:Rp

Bipartite Matchings

[Bearbeiten]

Eines dieser frühen Resultate betrifft bipartite Graphen, die sich in der Folge als ein sehr natürlicher und aus heutiger Sicht für die Praxis zentraler Spezialfall herausgestellt haben. Kőnig und Egerváry untersuchten beide unabhängig voneinander das bipartite Matchingproblem und das Knotenüberdeckungsproblem und fanden dabei heraus, dass beide Probleme in dem folgenden Sinn äquivalent sind:

Die Größe einer minimalen Knotenüberdeckung und eines maximum-Matching stimmen auf bipartiten Graphen überein. (3)

Dieser Satz wird meistens Kőnig zugeschrieben oder Min-Max-Theorem bzw. Dualitätssatz genannt. Beide bewiesen die Aussage für endliche Graphen. Aharoni bewies 1984 die Aussage für überabzählbar unendliche Graphen.<ref>Vorlage:Cite journal</ref> Ein elementarer Beweis von (3) findet sich in Lovász & Plummer 43, der von den meisten Lehrbüchern übernommen wurde. Bondy & Murty 200 führt den Satz auf ein Resultat der linearen Programmierung zurück: Ist <math>A</math> die Inzidenzmatrix des Graphen <math>G</math>, dann lassen sich maximum Matchings als Lösungen von folgendem ganzzahligen linearen Programm auffassen:

<math>\max ex \text{ unter } Ax\le 1 \land x\ge 0</math>

Dabei ist <math>e</math> der Einsvektor bestehend aus lauter Einsen. Das Programm des Knotenüberdeckungsproblems hat folgende Gestalt:

<math>\min ye \text{ unter } yA\ge 1 \land y\ge 0</math>

Diese Programme haben eine sogenannte primal-dual-Gestalt. Für Programme von dieser Gestalt wird in der Theorie der linearen Programme gezeigt, dass sie in ihren Optima übereinstimmen. Für bipartite Graphen lässt sich außerdem leicht zeigen, dass <math>A</math> total unimodular ist, was in der Theorie der ganzzahligen linearen Programme ein Kriterium für die Existenz einer optimalen Lösung der Programme mit Einträgen nur aus <math>\mathbb{Z}</math> (und damit in diesem speziellen Fall sogar aus <math>\left\{0, 1\right\}</math>) ist, also genau solchen Vektoren, die auch für ein Matching bzw. für eine Knotenüberdeckung stehen können. Dieser Primal-Dual-Ansatz der linearen Programme scheint zunächst wenig mit der Matching-Theorie zu tun zu haben, stellt sich aber als einer der fruchtbarsten Ansätze zur effizienten Berechnung von Matchings, insbesondere im gewichteten Fall, heraus.

Es gibt eine ganze Vielzahl von Sätzen, die zum Satz von König äquivalent sind.<ref>Lovász & Plummer 5-40.</ref><ref>Notizen zu einem Vortrag von Robert D. Borgersen: Equivalence of seven major theorems in combinatorics. (PDF; 66 kB). November 26, 2004.</ref><ref>Vorlage:Cite journal</ref> Darunter der Satz von Birkhoff und von Neumann, der Satz von Dilworth und das Max-Flow-Min-Cut-Theorem für bipartite Graphen. Für die Matchingtheorie am interessantesten ist folgende Bedingung, die Hall 1935<ref>Vorlage:Cite journal</ref> angab, um bipartite Graphen mit perfektem Matching zu charakterisieren. Dieser Charakterisierungssatz ist ebenfalls äquivalent zum Satz von König.

Ein bipartiter Graph mit Knotenpartitionen <math>S\dot{\cup} T</math> und o.B.d.A <math>|S|\ge |T|</math> hat genau dann ein perfektes Matching, wenn für jede Auswahl von Knoten <math>H\subseteq S</math> gilt: <math>|N(H)|\ge |H|</math>. Dabei ist <math>N(H)</math> die Nachbarschaftsmenge von <math>H</math>. (4)

Aus (4) folgt schnell, dass sich unter den bipartiten Graphen genau alle regulären Graphen <math>1</math>-faktorisieren lassen<ref>Jungnickel 216.</ref> und die Aussage (1) von Petersen lässt elegant auf diese Folgerung zurückführen.<ref name="Diestel" />Vorlage:Rp Eine Verallgemeinerung dieses Resultats liefert eine Formel für die Größe eines maximum Matchings, die sogenannte König-Ore Formel:<ref>Yu & Liu 9.</ref><ref>Bondy & Murty 422.</ref>

<math>\nu(G)= |S| - \max_{H\subseteq S}\{|H|-|N(H)|\}</math>

Lösungsverfahren

[Bearbeiten]
Algorithmus (I)
Eingabe <math>G</math> mit einem beliebigen Matching <math>M</math>
1. repeat
2. suche verbessernden Pfad <math>P</math>
3. Falls gefunden: Augmentiere <math>M</math> entlang <math>P</math>.
4. until Suche nach verbesserndem Pfad war erfolglos
Ausgabe <math>G</math> mit maximum Matching <math>M</math>

Viele der folgenden Konzepte spielen in fast allen Lösungsverfahren von Matchingproblemen eine Rolle. Ist ein Graph <math>G</math> mit einem Matching <math>M</math> gegeben, dann heißt ein Knoten von <math>G</math> frei (in der Literatur auch ungepaart, exponiert, verfügbar …), falls er zu keiner Kante in <math>M</math> inzident ist. Andernfalls heißt der Knoten gesättigt. Ein Pfad <math>P</math> in <math>G</math> heißt alternierend, falls dieser abwechselnd Kanten aus <math>M</math> und aus <math>M^c</math> enthält. Falls dieser Pfad in einem freien Knoten beginnt und endet, heißt der Pfad verbessernd oder auch augmentierend. Die letzte Bezeichnung kommt von der Tatsache, dass <math>P</math> durch <math>M\oplus P</math><ref group="A"><math>\oplus</math> notiert die symmetrische Differenz.</ref> ein größeres Matching als <math>M</math> liefert. Folgendes grundlegendes Resultat von Berge 1957<ref>Vorlage:Cite journal</ref> motiviert das Studium von augmentierenden Pfaden.

Ein Matching ist genau dann Maximum, wenn es keinen verbessernden Pfad in <math>G</math> bezüglich <math>M</math> gibt.

Diese Bezeichnungen entsprechen genau der Sprache, die auch bei der Behandlung von Flüssen in Netzwerken gebraucht wird. Das ist kein Zufall, denn Matchingprobleme lassen sich in der Sprache der Netzwerktheorie formulieren und mit den dort entwickelten Verfahren lösen. Im bipartiten Fall ist diese Zurückführung, wie das folgende Beispiel zeigt, sogar fast trivial. Gegeben ein Graph <math>G</math> mit Knotenmenge <math>V(G)=S\dot{\cup}T</math>. Konstruiere ein Netzwerk <math>N=(G',u,\sigma,\tau)</math>. Dabei ist <math>V(G')=V(G) \cup \{\sigma,\tau \}</math> und <math>E(G')= E(G)\cup\{(\sigma,s) : s\in S\} \cup \{(t,\tau): t\in T\} </math>. Außerdem ist <math>u</math> die Fortsetzung von der Kostenfunktion <math>c</math>, die alle neuen Kanten mit Inf<ref group="A">Programmiersprachen, die das Konzept Inf nicht unterstützen, können die künstlichen Kanten stattdessen mit einer absurd großen Zahl belegen. <math>\textstyle \sum_{e\in E(G)} c(e)</math> genügt in jedem Fall.</ref> belegt.

Mit dem Satz von Berge lässt sich auch gleich ein Algorithmus (I) zum Finden von maximum Matchings angeben.<ref>Aus didaktischen Gründen sehr stark vereinfacht nach Burkard, Dell’Amico & Martello 38. In der Referenz ist die Methode zum Finden eines verbessernden Pfades wesentlich detaillierter angegeben.</ref> Weil jeder verbessernde Pfad zu einem gegebenen Matching einen weiteren Knoten matcht und maximal <math>\tfrac{n}{2}</math> Knoten zu matchen sind, beschränkt sich die Zahl der Schleifendurchläufe asymptotisch durch <math>\mathcal{O}(n)</math>. Eine sehr naive Methode zum Finden verbessernder Pfade stellen sogenannte Graph Scans dar, etwa eine Breitensuche (BFS) mit einer Laufzeit von <math>\mathcal{O}(n+m)</math>. Ferner ist <math>m\in \mathcal{O}(n^2)</math>, weil der Graph bipartit ist und damit ist die angegebene Methode in <math>\mathcal{O}(n^3)</math>.

Einer der frühesten Beiträge zum Berechnen von Maximum-Matchings, der über die oben angeführte naive Methode hinausgeht, war der Algorithmus von Hopcroft und Karp 1973.<ref>Vorlage:Cite journal</ref> Die Grundidee folgt dem Algorithmus von Dinic (mit dem das Problem mit derselben asymptotischen Laufzeit gelöst werden kann<ref>Vorlage:Cite journal</ref>), der in jeder Phase, wo der Algorithmus nach einem verbessernden Pfad sucht (Zeile 2), möglichst kurze Pfade und nach Möglichkeit „mehrere gleichzeitig“ sucht.

Alt, Blum, Mehlhorn & Paul 1991<ref>Vorlage:Cite journal</ref> schlagen eine Verbesserung von Hopcroft & Karp vor, indem sie ein Scanningverfahren für Adjazenzmatrizen nach Cheriyan, Hagerup, and Mehlhorn 1990<ref>Vorlage:Cite book</ref> anwenden. Eine einfache Beschreibung der Methode findet sich auch in Burkard, Dell’Amico & Martello 47 ff. Feder und Motwani 1991<ref>Vorlage:Cite conference</ref> haben eine Methode vorgeschlagen, die auf der Zerlegung von <math>G</math> in bipartite Cliquen beruht und erreichen damit eine asymptotische Laufzeit von <math>\mathcal{O}( \sqrt{n} m \log(n^2 /m)/ \log n)</math>. Eine Methode, die nicht auf der Idee augmentierender Pfade beruht, sondern sogenannte „starke Spannbäume“ benutzt, haben Balinski & Gonzalez 1991<ref>Vorlage:Cite journal</ref> vorgeschlagen und erreichen damit eine Laufzeit von <math>\mathcal{O}(n^3)</math>.

Programmierung

[Bearbeiten]

Das folgende Beispiel in der Programmiersprache C# zeigt ein Programm, das die Matchingzahl für einen bipartiten Graphen bestimmt. Der bipartite Graph wird als zweidimensionales Array vom Datentyp bool (Boolesche Variable) deklariert. Wenn zwei Knoten verbunden sind, wird der Wert true gespeichert, wenn nicht, wird der Wert false gespeichert. Die Methode BipartiteMatching, die feststellt, ob es ein passendes Matching gibt, verwendet einfache Rekursion. Bei der Ausführung des Programms wird die Methode Main verwendet, die die Matchingzahl auf der Konsole ausgibt.<ref>GeeksforGeeks: Maximum Bipartite Matching</ref> <syntaxhighlight lang="c#"> using System;

class Program { // Diese Methode verwendet Tiefensuche und stellt fest, ob es ein Matching mit dem Knoten mit startIndex gibt bool BipartiteMatching(bool[,] bipartiteGraph, int startIndex, bool[] visitedIndexes, int[] matchedIndexes, int n) { for (int targetIndex = 0; targetIndex < n; targetIndex++) // for-Schleife, die alle Indexe der Zielknoten durchläuft { if (bipartiteGraph[startIndex, targetIndex] && !visitedIndexes[targetIndex]) // Wenn die Knoten mit startIndex und targetIndex im bipartiten Graphen verbunden sind und Zielknoten nicht besucht ist { visitedIndexes[targetIndex] = true; // Setzt den Zielknoten auf besucht

// Wenn der Knoten mit targetIndex nicht zugeordnet ist, wird er dem Knoten mit startIndex zugeordnet. Wenn der Knoten mit targetIndex auf besucht gesetzt ist, wird er im rekursiven Aufruf nicht erneut zugeordnet. if (matchedIndexes[targetIndex] == -1 || BipartiteMatching(bipartiteGraph, matchedIndexes[targetIndex], visitedIndexes, matchedIndexes, n)) // Rekursiver Aufruf der Methode mit dem Nachbarknoten als Startknoten { matchedIndexes[targetIndex] = startIndex; return true; } } } return false; }

// Diese Methode gibt die Matchingzahl des bipartiten Graphen zurück int GetMatchingNumber(bool[,] bipartiteGraph, int m, int n) { int[] matchedIndexes = new int[n]; // Array, das die Indexe der zugeordneten Knoten speichert for (int i = 0; i < n; ++i) // for-Schleife, die alle Indexe der Zielknoten durchläuft { matchedIndexes[i] = -1; // Setzt alle Knoten auf nicht zugeordnet } int matchingNumber = 0; // Zählt die Anzahl der Matchings for (int startIndex = 0; startIndex < m; startIndex++) // for-Schleife, die alle Indexe der Startknoten durchläuft { bool[] visitedIndexes = new bool[n]; // Array, das die Indexe der besuchten Knoten speichert for (int i = 0; i < n; ++i) // for-Schleife, die alle Indexe der Zielknoten durchläuft { visitedIndexes[i] = false; // Setzt alle Knoten auf nicht besucht } if (BipartiteMatching(bipartiteGraph, startIndex, visitedIndexes, matchedIndexes, n)) // Untersucht, ob es ein Matching mit dem Knoten mit startIndex gibt { matchingNumber++; } } return matchingNumber; }

// Hauptmethode, die das Programm ausführt public static void Main() { // Erzeugt einen bipartiten Graphen bool[,] bipartiteGraph = new bool[,] {{false, true, true, false, false, false}, {true, false, false, true, false, false}, {false, false, true, false, false, false}, {false, false, true, true, false, false}, {false, false, false, false, false, false}, {false, false, false, false, false, true}}; Program program = new Program(); Console.WriteLine("Die Matchingzahl des bipartiten Graphen ist " + program.GetMatchingNumber(bipartiteGraph, 6, 6) + "."); // Ausgabe auf der Konsole

Console.ReadLine(); } } </syntaxhighlight>

Allgemeiner Fall

[Bearbeiten]

Satz von Tutte

[Bearbeiten]

Vorlage:Hauptartikel

Während Charakterisierungen von Matchings und effiziente Algorithmen zum Bestimmen relativ schnell nach der Formulierung von Matchings als Problem gefunden wurden, dauerte es bis 1947 bis Tutte<ref name="tutte">Vorlage:Cite journal</ref> eine Charakterisierung für perfekte Matchings in allgemeinen Graphen formulieren und beweisen konnte. Aus diesem tiefliegenden Resultat lassen sich alle bisher besprochenen vergleichsweise leicht herleiten.<ref>Lovász & Plummer 84.</ref> Tutte benutzt die einfache Tatsache, dass eine Komponente mit ungerader Knotenzahl in einem Graphen kein perfektes Matching haben kann. Wenn also eine Knotenmenge <math>S</math> so gefunden werden kann, dass <math>G-S</math> mehr ungerade Komponenten als <math>S</math> Knoten hat, dann müsste für ein perfektes Matching aus jeder solcher Komponente wenigstens ein Knoten mit einem Knoten aus <math>S</math> gematcht werden und das kann nicht sein. Es stellt sich heraus, dass die Existenz einer solchen Menge <math>S</math> Graphen ohne perfektes Matching nicht nur beschreibt, sondern charakterisiert:

Ein Graph <math>G</math> hat genau dann ein perfektes Matching, wenn für jede Menge <math>T\subseteq V(G)</math> gilt: <math>c(G-T) \le | T |</math>. (<math>c</math> gibt die Anzahl der ungeraden Komponenten eines Graphen an.) (5)

Eine solche Menge <math>T</math> heißt Tutte-Menge und die Bedingung in (5) heißt Tutte-Bedingung. Dass sie notwendig für die Existenz perfekter Matching ist, wurde schon skizziert und es gibt mittlerweile viele Beweise dafür, dass die Bedingung hinreichend ist: Tuttes ursprünglicher Beweis formulierte das Problem als ein Matrix-Problem und benutzte die Idee der pfaffschen Determinante.<ref name="tutte" /> Elementare Abzählargumente wurden relativ rasch danach veröffentlicht, wie in Maunsell 1952,<ref>Vorlage:Cite journal</ref> Tutte 1952,<ref>Vorlage:Cite journal</ref> Gallai 1963,<ref name="gallai">Vorlage:Cite journal</ref> Halton 1966<ref>Vorlage:Cite journal</ref> oder Balinski 1970.<ref>Vorlage:Cite journal</ref> Andere Beweise, wie Gallai 1963,<ref name="gallai" /> Anderson 1971<ref>Vorlage:Cite journal</ref> oder Marder 1973<ref>Vorlage:Cite journal</ref> verallgemeinern den Satz (4) von Hall systematisch. Ferner gibt es Beweise aus der Perspektive der Graphentheorie, die die Struktur von Graphen betrachten, die selbst kein Perfektes Matching besitzen, doch falls eine Kante ergänzt wird, hat der resultierende Graph ein solches. Diesen Ansatz verfolgen etwa Hetyei 1972<ref>Vorlage:Cite journal</ref> oder Lovász 1975.<ref>Vorlage:Cite journal</ref>

Datei:Blossom Counter.svg
Es genügt nicht, erst alle Blüten zu suchen und zu kontrahieren und dann eine Breitensuche zu fahren. Die Priorität der Fallunterscheidungen spielt eine Rolle für die Korrektheit des Algorithmus.<ref>Jungnickel 409.</ref> In diesem Beispiel enthält der kontrahierte Graph keinen augmentierenden Pfad, wohl aber der Ausgangsgraph.

Algorithmus von Edmonds

[Bearbeiten]

Der erste Polynomialzeitalgorithmus für das klassische Matchingproblem stammt von Jack Edmonds (1965).<ref>Vorlage:Cite journal</ref> Die Grundstruktur der Methode entspricht Algorithmus (I): Sie sucht verbessernde Pfade und gibt ein maximum Matching zurück, falls kein solcher gefunden werden kann. Einen verbessernden Pfad zu finden, stellt sich hier aber als schwieriger heraus als im bipartiten Fall, weil einige neue Fälle auftreten können. Edmonds Suchmethode konstruiert nach und nach einen alternierenden Wald. Das ist ein kreisfreier Graph <math>F</math> mit so vielen Zusammenhangskomponenten wie es freie Knoten gibt. Jeder freie Knoten ist Wurzel <math>r_i</math> eines Baumes <math>T\subset F</math> und <math>F</math> ist so konstruiert, dass für alle anderen Knoten <math>v\in F</math> der eindeutig bestimmte <math>r_i</math>-<math>v</math>-Pfad ein alternierender Pfad ist. Ein Knoten in <math>v\in F</math> heißt dann innen oder ungerade, falls <math>\operatorname{d}(r_i,v)\equiv 1\mod 2</math> und andernfalls außen oder gerade. <math>\operatorname{d}</math> sei hier die Distanzfunktion in <math>T</math>, gebe also die Länge des eindeutig bestimmten <math>r_i</math>-<math>v</math>-Pfades an.

Es genügt die Betrachtung auf die Konstruktion eines alternierenden Baumes zu reduzieren. Falls diese Konstruktion keinen augmentierenden Pfad findet, wird sie mit einem neuen freien Knoten reinitialisiert und alle bereits betrachteten Kanten werden ignoriert. Existiert kein freier Knoten mehr, dann existiert auch kein augmentierender Pfad. Diesen alternierenden Baum konstruiert Edmonds, indem er ausgehend von einem freien Knoten nach und nach alle Kanten hinzufügt oder ignoriert. Dabei können für eine neue Kante <math>e=uv</math> (<math>u</math> gehöre bereits zum Baum) folgende Fälle auftreten:

  1. Wenn <math>u</math> ein innerer Knoten ist, können nur Kanten <math>e\in M</math> zu <math>T</math> hinzugefügt werden, weil <math>T</math> alternierend werden soll. Diese Kante ist eindeutig durch <math>(u~\operatorname{match}(u))</math> gegeben.
  2. Falls <math>u</math> ein äußerer Knoten ist, dann kann <math>v</math> …
    1. frei sein und noch nicht in <math>T</math>. Dann ist der <math>r</math>-<math>v</math>-Pfad augmentierend.
    2. gepaart sein und weder <math>v</math> noch <math>\operatorname{match}(v)</math> ist in <math>T</math>. Dann können <math>v</math> und <math>\operatorname{match}(v)</math> zu <math>T</math> hinzugefügt werden.
    3. bereits in <math>T</math> als innerer Knoten enthalten sein. Damit schließt <math>e</math> einen geraden Kreis. Diese Kanten können ignoriert werden.<ref>Jungnickel 396.</ref>
    4. bereits in <math>T</math> als ein äußerer Knoten enthalten sein. Dann schließt <math>e</math> einen ungeraden alternierenden Kreis <math>B</math>; eine sogenannte Blüte. Edmonds zieht die Knoten in <math>B</math> zu einem Pseudoknoten <math>b</math> zusammen mit den Inzidenzen aller Knoten aus <math>B</math>. (Diese Operation lässt sich auch beschreiben als „Bildung des Quotientengraphen“ <math>G'=G/B</math>) Er reinitialisiert dann die Suche in <math>G'</math> und gibt ein Verfahren an, einen dort gefundenen augmentierenden Pfad <math>P'</math> zu einem augmentierenden Pfad <math>P</math> in <math>G</math> zu liften.

Blüten können, anders als bei Fall <math>3</math>, nicht ignoriert werden.<ref>Betrachte dieses Beispiel nach Jungnickel 398.</ref> Der Knoten, der die Blüte mit dem Baum verbindet, lässt sich in das Schema der inneren und äußeren Knoten nicht einordnen. Die naheliegende Idee, ihn als „sowohl innen als auch außen“ zu behandeln führt zu einem falschen Algorithmus.<ref>Diese Idee wurde in Oldenbourg Vorlage:Cite book vorgeschlagen. Jungnickel 399 hat ein Gegenbeispiel, das auf Christian Fremuth-Paeger zurückgeht.</ref> Die Behandlung von Blüten mit Kontraktion ist neben dem Ansatz von Berge die zentrale Idee von Edmonds’ Algorithmus und Grundlage vieler späterer Verfahren. Bipartite Graphen enthalten keine ungeraden Kreise und damit auch keine Blüten. Edmonds’ Algorithmus reduziert sich daher im bipartiten Fall auf die Methode von Munkres.

Man kann ablesen, dass die skizzierte Methode von Edmonds einen Aufwand von <math>\mathcal{O}(n^4)</math> hat. In Fall <math>2.4</math> reinitialisiert Edmonds die Suche und verwirft damit den bereits geleisteten Suchaufwand. Gabow 1976<ref>Vorlage:Cite journal</ref> und Lawler haben eine naive Implementierung vorgeschlagen, die den Suchaufwand nicht verwirft und eine Laufzeit von <math>\mathcal{O}(n^3)</math> erreicht. Das Beispiel folgt bereits dieser Methode.

Literatur

[Bearbeiten]

Vorlage:Anker

Historisch
Vorlage:Anker
[Bearbeiten]

Vorlage:Commonscat

Einzelnachweise

[Bearbeiten]

<references />

Anmerkungen

[Bearbeiten]

<references group="A" />

Vorlage:Normdaten