So, guten Morgen. Wir haben am Montag
das Thema maximaler Fluss abgeschlossen. Zumindest habe ich Ihnen das
so angekündigt. Das stimmt noch nicht so ganz,
wie wir gleich sehen werden, weil wir bei der nächsten Problemklasse,
die wir uns anschauen, sehen werden,
dass wir eine einfache Variante dieses Problems wiederum mit Flüssen lösen können.
Deswegen schauen wir gleich nochmal auf die Flüsse drauf.
Aber das Problem, mit dem wir uns jetzt beschäftigen,
ist erstmal
ein neues
Was wir machen wollen, ist,
wir wollen uns jetzt in den nächsten, ja,
wahrscheinlich zwei Vorlesungen mit Matching beschäftigen.
Und Matching ist ein, ja, sehr schwieriges Thema.
Das ist algorithmisch in den Griff zu kriegen.
Es kommt leider auch im Kormen nicht vor.
Die haben das da so irgendwie ausgeklammert. Das heißt,
wenn sie die Sachen nachlesen, müssten sie auf andere Literatur ausweichen.
Ich werde Ihnen gleich auch ein Buch sagen, wo ich immer reingucke.
Das ist nicht so ganz so einfach für dieses Thema.
Das kann man sich natürlich fragen, ja,
warum kommt denn das jetzt überhaupt in der Vorlesung vor,
wenn das in dem Buch
nicht vorkommt und so
Also der Grund ist, ich habe das schon in der
einen oder anderen Stelle gesagt, dass ich die Algorithmen,
die ich hier in die Vorlesung reinnehme, immer danach auswähle,
was ich für die Praxis halt als sehr relevant empfinde.
Und Matching kommt unheimlich häufig vor. Also wir haben ganz viele Anwendungsfragestellungen,
wo wir am Ende so ein Zuordnungsproblem haben und entscheiden müssen,
wie wir etwas zuordnen, um irgendwelche Kostenfunktionen zu optimieren.
Und das sind immer Matching-Fragestellungen. Und für Matching-Fragestellungen gibt es,
wie wir sehen werden, für spezielle Bereiche,
die eben auch die hochrelevanten sind,
die immer wieder vorkommen,
sehr gute Algorithmen,
die sind halt
nur nicht ganz so trivial
Und deswegen ist es mir halt wichtig, die hier vorzustellen.
Okay, so, was ist das Problem? Das Problem ist,
wir starten wieder mit einem Graphen und wir haben, ja, gegebenenfalls Kantengewichte.
Das Problem gibt es mit Gewichte und ohne Gewichte.
Und was wir suchen, ist ein sogenanntes Matching.
Ein Matching ist nichts weiter, ist eine Auswahl von Kanten,
also eine Teilmenge der Kantenmenge. Und die Einschränkung,
die gelten, muss es,
dass für jeden Knoten die Anzahl der Kanten aus dem Matching,
zu dem dieser Knoteninzident ist,
durch eins beschränkt ist
Also anders gesprochen, wir wählen eine Menge von Kanten aus.
Und zwar ist es dann so, dass jeder Knoten nur zu
einer ausgewählten Kante oder vielleicht auch zu keiner ausgewählten Kante,
das geht natürlich auch, benachbart ist.
Also das ist quasi unser Ziel, so eine Teilmenge hier entsprechend zu bestimmen.
Wir unterscheiden quasi vier Problem-Varianten. Das eine Kriterium ist,
ob wir Gewichte haben oder nicht. Da können Sie sich
schon vorstellen, dass das ein gravierender Unterschied ist,
ob wir es mitgewichten oder ohne Gewichte machen
Und das ist so ähnlich wie bei den kürzesten Faden,
also ohne Gewichte kann man einfach eine Breitensuche machen und hat dann das Ergebnis und Nichtgewichten,
wird es dann schon ein bisschen schwieriger, braucht man einen Dikestra-Algorithmus.
Hier ist es ähnlich, das Problem ist, ohne Gewichte
halt deutlich einfacher als Mitgewichte. Leider ist es so,
dass in der Praxis wir in der Regel Gewichte haben,
genauso wie wir kürzeste Wege, Probleme fast nie auf ungewichteten Grafen haben,
haben wir auch Matching-Probleme in der Regel,
nicht auf Ungewichteten, sondern eher auf ungewichteten Grafen.
Ja, und dann unterscheiden wir noch den Graft-Typ und
zwar insbesondere differenzieren wir zwischen einem sogenannten B-Partieten-Matching und dem Matching
auf einem allgemeinen Graf
Auch das hat wieder, kommt wieder aus der Anwendung heraus,
ein bipartites Matching ist einfach nur ein Matching auf einem bipartiten Graf.
Und ein bipartiter Graf ist ein Graf, der die Eigenschaft hat,
dass wir die Knoten in zwei Mengen unterteilen können,
in eine linke und eine rechte Menge.
Und alle Kanten verlaufen immer nur zwischen der linken und der rechten Menge.
Und wenn wir jetzt in diesem Grafen ein Matching suchen,
dann ist es klar,
dass wir immer mit jeder Kante ein Element der linken Menge
mit einem Element der rechten Menge kombinieren.
Und das ist dann
eine eins zu eins Zuordnung hier
Ja. Ja, warum guckt man sich Matching gerade auf B-Partiengraphen an?
Das liegt daran, weil es eben so ein klassisches Zuordnungsproblem beschreibt.
Wir haben, keine Ahnung, die Tanzschülerinnen und die Tanzschüler,
ja, die hier irgendwelche Präferenzen haben,
mit wem sie denn gerne den nächsten Walzer tanzen wollen.
Und wenn sie die jetzt alle glücklich machen wollen,
dann müssten sie quasi ein Matching finden, was diese Präferenzen maximiert.
Natürlich ist das etwas, was man nicht algorithmisch lösen wird,
aber es gibt Fragestellungen dieser Art en masse, ja,
wenn sie zum Beispiel Aufgaben auf Prozessoren aufteilen wollen oder irgendwelche Dinge platzieren wollen.
Auch Platzierungsprobleme sind manchmal so, dass sie sagen,
hier sind Objekte, hier sind Orte, wo sie die platzieren können.
Wie wollen sie das zuordnen? Hier sind vielleicht Teile,
die sie produzieren wollen. Hier sind Fabrikteile, wo man
das herstellen könnte. Immer gibt es solche Zuordnungsprobleme in der Praxis.
Und viele von denen sind eben bipatit. Also,
dass wir zwei so Mengen haben und wir wollen immer
das eine auf das andere zuordnen.
Deswegen gerade die bipatiten Grafen. Und das werden wir
auch primär jetzt machen. Wir werden uns das B-Partitel-Matching,
mitgewichten und ohne Gewichte, intensiv anschauen. Und am Ende
werde ich Ihnen noch ein bisschen was erzählen über das Matching in allgemeinen Grafen.
Das werden wir aber nicht mehr so detailliert machen,
weil da muss man schon eher mal überlegen, wie die Anwendung genau sein könnten.
Für die chemisch Interessierten unter Ihnen, das Matching im Allgemeinen Grafen,
spielt eine Rolle, wenn Sie konjugierte Systeme beschreiben wollen.
Da haben Sie nämlich alternierende Einfach- und Doppelbindung. Und wenn Sie wissen,
dass Sie einen Teil an Graf, das ist ein Molekül,
Und das ist ein konjugiertes System,
dann müssen sie die einfachen Doppelbindungen so verteilen,
dass die alternierend sind.
Also kein Atom darf zwei Doppelbindungen haben. Das ist ein
klassisches Matching-Problem auf Molekülgrafen, um mal für die Naturwissenschaftler
ein Beispiel zu nennen, wo das vorkommt.
Ja, okay, also wie gesagt, primär gucken wir uns Bi-Partitis-Matching an.
Okay, so, wir beginnen mit einem,
mit dem einfachen Fall, nämlich wir wollen das maximale Bi-Partite-Matching berechnen,
auf einem Grafen, der keine Gewichte hat.
Also wir haben, also hier sind Knoten, linke und rechte.
Und da gibt es so ein paar Kanten. Und wir
suchen jetzt also diese eine Menge von solchen von Kanten,
die gerade diese Matching-Eigenschaft erfüllen. Das heißt,
jede Kante oder jeder Knoten ist nur zu einer der ausgewählten Kanten benachbart.
Und da die keine Gewichte haben, ist das einzige,
was wir machen müssen, die Anzahl der Kanten zu maximieren, die wir in der Menge dran ist.
Das ist also unser Ziel, das zu machen. So,
die erste Idee, die einen da kommen kann, ist,
dass man dann sagt, naja, es ist ja ungefähr so,
wenn wir jetzt also viele Kanten hier auswählen, dann,
wir haben jetzt so viel mit Flüssen beschäftigt, dann wäre das ja so,
als wenn wir vielleicht viel Fluss von der linken Seite auf die Rechte transportieren können.
Das heißt, man könnte jetzt zu dem Schluss kommen,
und das ist auch keine schlechte Idee, zu sagen,
dieses Matching-Problem, das hat irgendwas mit einem Flussproblem zu tun,
weil wir möglichst viele Kanten von links nach rechts hier mit Fluss sättigen wollen.
Und dann würde man dieses Netzwerk überführen in ein Flussnetzwerk,
in dem man einfach sagt, okay,
wir nehmen mal eine Quelle,
und die Quelle verbinden wir mit allen Knoten auf der linken Seite,
und dann nehmen wir einen Zielknoten, eine Senke,
und die verbinden wir mit allen Knoten auf der rechten Seite.
Und dann würden wir dieses Netzwerk hier erhalten,
Und hier könnten wir jetzt einen Fluss beschreiben.
Der würde zum Beispiel hier irgendwie so lang gehen, ja.
Und dann könnten wir sagen, okay,
dann nehmen wir doch die Kanten,
wo der Fluss drüber geht und sagen mal, das wäre unser Matching.
Also natürlich nicht die von der Quelle und die zur Senke gehen,
die interessieren uns dann nicht, aber die hier zwischen L und E. Ja,
also zwischen den beiden Knotenmengen.
Und da stellt sich die Frage, kann man das so modellieren?
Funktioniert das und kommt da auch auf alle Fälle das richtige Ergebnis raus.
Es gibt einen ganz zentralen Unterschied zwischen den Flüssen und
diesem Matching
Unterschied ist, dass wir bei einem Matching, müssen wir
uns entscheiden, ob wir die Kante reinnehmen oder nicht.
Also ganz oder gar nicht, wenn sie so wollen.
Also das ist die Wahl, die sie haben.
Bei einem Fluss ist es nicht so,
bei einem Fluss könnten sie auch sagen, ja,
sie pumpen 50 Prozent der Kapazität, die diese Kante hat über diese,
über die Kante drüber oder 60 Prozent der Kapazität.
Das heißt, sie können quasi so ein Anteil,
anteilig diese Kante hier nehmen. Also es ist ungefähr so,
sie haben also keine diskrete Entscheidung bei den Flüssen,
die sie fällen müssen, sondern sie können hier entsprechend so Teile machen.
Wenn wir das jetzt so modellieren, wie ich das gerade beschrieben habe,
dann haben wir potenziell ein Problem, wenn sich der Fluss,
wenn der Fluss hier nicht ganz zeitig ist,
sondern sich hier irgendwie so aufspalten würde.
Also wenn hier eine Einheit hier langgeht und dann würden 0,54
dann gehen und 0,54 lang.
Das wäre blöd. Dann hätten wir diese beiden Kanten zwar ausgewählt,
da würde über beide Fluss gehen.
Das wäre auch bezüglich der Modellierung des Flusses korrekt.
Also eine Flusseinheit geht rein und eine geht auch wieder raus.
Sie ist nur aufgeteilt auf zwei Kanten. Ja,
das wäre insofern in Ordnung. Aber wir könnten das
nicht mehr so ohne weiteres in ein Matching überführen,
weil wir dann ja beide Kanten auswählen müssen.
Da geht ja über beiden Fluss drüber
Und dann wäre diese Matching-Eigenschaft, dass kein Knoten zu Zweikanten benachbart ist,
ja verletzt. Das würde so nicht gehen. Das heißt,
es gibt durchaus Unterschiede und unserer Größe,
der größte Unterschied ist zwischen Matching und Fluss ist,
diese ganze Zahligkeit,
die wir beim Matching brauchen und bei den Flüssen eben nicht brauchen.
Okay, also hier nochmal zusammengefasst,
wie modellieren wir das bi-partiete Matching-Problem als Flussflussproblem?
Wir richten alle Kanten von links nach rechts. Die kriegen jetzt
alle Pfeile hier, die sind ja gerichtet beim Matching-Problem.
Wir fügen eine Quelle, essen hinzu und Kanten hinzu,
die essen mit allen Knoten
Auf der linken Seite verbinden, dann fügen wir eine Senke Tee
hinzu und verbinden alle Knoten der rechten Seite mit Tee.
Und wir setzen alle Kantenkapazitäten auf eins. Ja,
und dann hätten wir so Einflussnetzwerk konstruiert. So,
das ist jetzt also das sogenannte Korrespondierende Flussnetzwerk, also das
zu dem Matching-Problem korrespondierende Flussnetzwerk, was genauso definiert ist.
Also G ist jetzt also ein bipathiter Graf mit L und R. Das
ist also die Knotenmenge aufgeteilt in die Linke und die rechte Seite.
Und hingenommen, könnten sie ja sogar noch so einen Plus
reinmalen als Zeichen, dass es wirklich eine leere Schnittmenge hat.
Könnte man machen. Also es kommt, da verwende ich
gleich auch noch. Das wird als Mengensymbol häufig verwendet,
um anzudeuten, dass der Schnitt leer ist zwischen den beiden.
Okay, so, das ist also der bipatite Graf und
wir bauen jetzt den Graf G-Strich, der sieht wie folgt aus.
Das habe ich gerade schon beschrieben. Also wir nehmen die Knotenmenge.
Wir nehmen nur Knoten mit einem Grad größer als Null aus der ursprünglichen Menge.
Ja, weil wenn der Grad Null wäre, dann könnten wir darüber eh keinen
Ich könnte das eh, könnt der Knut eh nicht an
dem Matching beteiligt sein und dann spielt er auch keine Rolle.
Und beim Flussnetzwerk wollen wir ja keine Knoten haben,
die nicht auf dem Pfad von der Quelle zur Senke liegen.
Ja, also insofern nehmen wir nur diese Knoten und wir
nehmen zwei Knoten hinzu, die Quelle und die Senke.
Die Kantenmenge ist so, wie ich die gerade beschrieben habe,
wir nehmen alle Kanten hinzu von S zu U und U
ist aus der linken Menge mit einem Knotengrad größer als null.
Also bevor wir die Kante dazu nehmen.
Dann haben wir die Kanten von U nach V,
wenn U in der linken Menge ist und UV eine ursprüngliche Kante,
also eine Kante im ursprünglichen Graf war
Und dann haben wir hier die Kanten,
die von den Knoten der rechten Menge zurück zur Senke gehen.
Ja, oder zur Senke. Alle Kartenkapazitäten sind eins.
So, das ist das Korrespondierende Flussnetzwerk. Okay,
wenn wir jetzt das Flussproblem auf dem Flussnetzwerk lösen,
ist natürlich die erste Frage, wie groß ist denn das Flussnetzwerk?
Weil wenn das größer wäre, dann müssen wir aufpassen mit dem O-Kalkül,
wenn wir über die Kanten und die Knoten reden.
Aber es ist, glaube ich, ganz offensichtlich,
dass das hier bezüglich des O-Kalküls nicht dramatisch wächst.
Und das ist das erste Lämmer.
Wie groß ist dieses Korrespondierende Flussnetzwerk
Was wir zeigen können, ist, dass die Anzahl der Kanten Kleiner
gleich dreimal die Anzahl der Kanten des ursprünglichen Grafen ist.
Und dass die Anzahl der Knoten maximal die Anzahl der Knoten plus zwei bzw. E
ist, also zwei Knoten fügen wir hinzu zur Knotenmenge.
Und es ist auch beschränkt durch E, weil wir natürlich
die Knoten hier herauswerfen, die kann an keiner Kante beteiligt sind.
Okay, ja, das kann man jetzt noch ausrechnen,
aber das ist, glaube ich, klar.
Also für die Kantenmenge gilt,
wir haben eine Kante für jeden Knoten auf der linken Seite,
auf der rechten Seite plus die Kanten, die wir vorher hatten.
Und das können wir entsprechend hier ausrechnen und dann kommt da 3E raus.
Aber das ist, glaube ich, auch klar.
Also kleiner gleich 3E. Okay, so,
was wir jetzt erreichen müssen, ist, dass der Fluss,
den wir berechnen, ganz zahlig ist.
Weil nur wenn der ganz zahlig ist, haben wir eine Chance,
den Fluss wieder zurückzuführen auf ein Matchen.
Das ist das erst mal das Ziel.
Und deswegen müssen wir erst mal gucken, geht das überhaupt?
Also gibt es überhaupt immer einen ganz zahligen Fluss?
Und das zeigt das nächste Lämmer
Partites Matching und ganz zeitiger Fluss. Wenn wir also so
ein V-Partieten Graf haben und ein korrespondierendes Flussnetzwerk,
dann gilt, wenn wir ein Matching haben in G,
dann existiert ein ganz zahliger Fluss, F mit der Eigenschaft,
dass die Größe des Matchings der Größe des Flusses entspricht.
Und das zweite ist, wenn wir einen ganz zahligen Fluss haben,
dann existiert ein Matching M in dem ursprünglichen Grafen,
sodass die Größe des Matchings der Größe des Flusses entspricht.
Ja, können Sie das Bild angucken? Ich glaube,
das ist relativ klar, wenn wir ein Matching haben
wie hier, Dann hätten wir hier drei Kanten ausgewählt.
Alle Kanten haben ja Kapazität 1. Dann haben wir in diesem Graf
auf der rechten Seite natürlich einen entsprechenden Fluss mit Fluss,
mit Flusswehr 3, weil wir genau immer als für jeden,
für jeden Knoten der linken Seite haben wir eine Kante,
die die Quelle mit diesem Knoten verbindet.
Dann wissen wir, dass es,
weil es ein Matching ist, hier nur eine Kante rausgeht.
Das heißt, wir können das hier, die Kante saturieren,
eine Einheit, die geht an eine Einheit hier weiter.
Und dann müssen wir wiederum, weil es ein Matching ist,
das an diesem Knoten auf der rechten Seite jeweils nur eine Kante ankommt.
Und dementsprechend können wir das dann hier über diese Kante mit
dem Zielknoten verbinden und haben dann hier immer einsamen Pfad,
wo dann eine Flusseinheit rüber geht.
Und dann haben wir hier gezeigt, dass wir natürlich einen Fluss haben,
der genauso groß ist wie das Matching. Andersherum können wir auch überlegen,
also wenn alle Kantenkapazitäten hier eins sind, dann können wir uns,
dann bedeutet das für einen ganzzahligen Fluss natürlich,
dass entweder es fließtlos über eine Kante oder nicht,
weil es ist wieder null oder eins, was anderes geht nicht,
weil die Kapazität ist ja beschränkt durch null und eins und es ist ganz zahlig.
Und das bedeutet automatisch, wenn dem so ist,
dass der Fluss über vollständig getrennte Also Kantendesjungte Pfade geführt werden muss,
weil der kann nicht an einer Stelle zusammenfließen oder hier sich trennen,
weil das der Ganzzahligkeit ja widersprechen würde.
Und dementsprechend können wir aus dem Fluss,
wenn der aus solchen Kanten des jungen Faden besteht,
auch immer wieder ein Matching machen, also in die umgekehrte Richtung.
Okay, das steht hier nur nochmal aufgeschrieben,
wenn ein Matching in G ist,
dann können wir auf der Basis von M den Fluss definieren.
Das machen wir befolgt. Wir setzen den Fluss für
die Kante von S nach U auf 1, UV,
Teil des Matchings ist, ja, sonst auf null.
Wir setzen den Fluss von U nach V auf 1,
wenn UV Teil des Matchings ist und sonst auf null.
Und wir setzen den Fluss von V nach T auf 1,
wenn UV Teil des Matchings ist und sonst auf null.
Wenn sie sich, dass die Folien ausgedruckt haben,
dann steht hier noch eine Zeile darunter,
wo der Fluss in umgekehrter Richtung mit negativen Werten steht,
das können sie ersatzlos streichen.
Das kommt noch aus der alten Korman-Variante mit der Antiparallelität. Ja,
ich habe das an fast allen Stellen schon rausgestrichen und hier
hatte ich es übersehen, weil es nicht mehr das Flusskapitel war.
Das hat es mir heute Morgen aufgefallen.
Also müssen sie nicht mehr
Berücksichtigen und dann steht hier unten in ihrem ausgedruckten Skript potenziell
auch, hier steht antiparallel in dieser Zeile.
Also F ist ganzzahlig kapazitätsbeschränkt und flusserhaltend. Da steht bei
Ihnen noch antiparallel, das können Sie auch streichen,
weil diese Modellierung der Antiparallelität so heute nicht mehr gemacht gibt.
Okay, also wir haben also einen Fluss definiert,
der erfüllt die uns bekannten Flusseigenschaften. Also er ist kapazitätsbeschränkt,
weil der Fluss ist ja maximal eins und die Kapazitäten waren alle eins.
Er ist flusserhaltend, weil ein Matching ist und die Matching-Kanten,
die Eigenschaft haben, dass keiner der Knoten mehrfach vorkommt.
Und er ist ganz zahlig, wie wir sofort an den Zahlen werden sehen können.
Also dann haben wir einen ganz teiligen Fluss gefunden und offensichtlich ist er auch genauso groß. Wie wir zum Beispiel an dem Schnitt sehen können,
wenn wir auf der einen Seite die linken Knoten nehmen und auf der anderen Seite die rechten Knoten,
also hier mit der Quelle, da mit der Senke,
dann schneiden wir sozusagen genau zwischen den beiden Knotenmengen des Inbi-Partietengrafen durch und dann gucken wir,
welcher Fluss geht da drüber und dann sehen wir,
naja, wie jede Kante, die hier Fluss hat,
hat eine Einheit,
die da drüber gepumpt wird und dann entspricht der Flusswert natürlich
gerade der Wert,
den Wert des Menschen
So, und in der anderen Richtung,
also wenn wir jetzt einen ganz zahligen Fluss haben,
dann können wir ein Matching definieren,
in dem wir einfach sagen,
wir nehmen eine Kante UV aus der Menge E heraus und die gehört zum Matching,
genau dann,
wenn U auf zur linken Seite gehört und V gehört zur rechten Seite und der Fluss über diese Kante ist großer als Nutten.
Ja, um jetzt zu zeigen,
dass das wirklich ein gültiges Matching ist,
da müssen wir ja nachweisen,
dass es keinen Knoten gibt,
wo zwei Kanten aus dem Matching
Inzidenz sind
Und das machen wir mit einem Widerspruchsbeweis. Wir gehen mal
davon aus, es ist kein Matching und wir nehmen uns
einen x-beliebigen Knoten aus der linken Menge mal heraus.
Wir müssen das nachher noch analog für die rechte Seite machen und sagen,
okay, mal angenommen,
wir hätten jetzt so einen Knoten auf der linken Seite hier.
Das ist der Knoten-U. Der ist ja hier offensichtlich mit der
Quelle S verbunden. Und dann hat er hier Kanten und
mal angenommen die Eigenschaft des Matchings wäre verletzt.
Und es gäbe halt zwei Knoten,
V und W über die Fluss gepumpt würde
Fluss daraus und daraus. Und dann sehen wir sofort,
das kann natürlich gar nicht sein,
weil der Fluss ist ja ganz zahlig,
dann würde also hier eine Einheit rüberfließen und hier würde eine
Einheit rüberfließen und dann müssen wir das für den Knoten U,
die Flusserhaltung gelten muss, das würde ja bedeuten,
zwei Einheiten gehen raus.
Das heißt, wir müssten zwei Einheiten über diese Kante in den Knoten hineingehen.
Kann nicht sein, weil diese, die Kapazität dieser Kante hier,
die ist gleich eins und dann hätten wir die Kapazität verlässt.
Also der Fluss von UNAV und von UNAV ist gleich eins,
F ist ganz zahlig, deswegen kannst du 0 oder 1 sein,
von dem Wein ist eins.
Also deswegen steht da eine Eins. U hat nur eine
eintretende Kante. Das ist die, die von der Quelle
zur U geht. Und der Fluss von S nach U,
der muss mindestens so groß sein,
wie der Fluss von U nach V plus der Fluss von U nach W. Also das,
was hier raustritt, das könnten ja noch mehr Kanten hier sein.
Deswegen größer gleich. Und die Summe dieser beiden Flüsse ist zwei
und das ist größer als eins, was die Kapazität dieser Kante entspricht.
Okay, auf der rechten Seite geht es einfach genauso.
Es ist analog, können Sie es auf der rechten Seite beweisen.
Ich denke, das ist noch, ist relativ klar und
die für die Größe des Matchings folgt auch sofort, naja,
wir haben alle Kanten auf ausgewählt zwischen L und R mit Fluss 1.
Und das entspricht gerade dem Fluss über den Schnitt von links nach rechts.
Und das ist gerade der Fluss wert. Okay,
also ich glaube, bis hier ist es alles relativ einfach.
Gut, jetzt müssen wir unsere Flussalgorithmen anschauen. Also nur,
weil es einen ganzzahligen Fluss gibt und der immer mit einem Matching korrespondiert,
heißt das ja noch nicht,
dass unsere Algorithmen wirklich einen ganz zahligen Fluss berechnen.
Also es könnte ja so sein,
dass unser Algorithmus jetzt doch irgendwie auf die Idee kommt,
zu sagen, naja,
warum nicht?
Ich tue hier für 0,5
und hier
Keiner wachen. Also dem Flussalgorithmus können wir ja jetzt,
haben wir ja erstmal nicht vorgeschrieben, dass er ganzzahlige Flüsse berechnet.
Insbesondere wissen wir auch noch nicht hundertprozentig, ob der maximale
Fluss wirklich ganz zahlig ist. Es könnte ja sein,
dass es zwar diese Korrespondenz gibt zwischen ganzzahligen Flüssen und Matching,
aber dass der maximale Fluss irgendwie durch das Aufteilen,
das noch anders optimieren kann und dann einfach nicht mehr ganz zahlig ist.
Das wird nicht so sein, aber könnte ja noch so sein. Okay,
um zu sehen, dass wir tatsächlich mit Flüssen,
also dass der ganzsaalige, nein,
das ist der Maximalfluss ganzsaalig ist und dass wir den berechnen können mit unseren Methoden,
schauen wir uns nochmal die ursprünglichste Methode an,
die Ford Fulkason-Methode und zeigen, dass wir,
wenn wir diese Methode anwenden, wir auf alle Fälle einen ganzzahligen Fluss erhalten.
Und damit haben wir schon gezeigt,
dass der maximale Fluss ganz zahlig sein muss, weil wir wissen ja,
dass die Ford Fulkason-Methode korrekt ist und die berechneten maximalen Fluss und wenn wir zeigen,
da kommt ein ganzsaaliger Fluss raus,
dann ist der maximale Fluss automatisch auch ganz zeitig.
Okay, Also, wir haben unser Flussnetzwerk mit ganz heiligen Kapazitäten.
F ist ein maximaler Fluss. Dann gilt auch F ist ganz zahlig.
Wird F mit der Ford-Full-Kassen-Methode berechnet. So ist der Fluss
von UNAV für alle Kanten zwischen Knoten-UV auch ganz zahlig.
Okay, wie kann man das sehen? Wie kann man
sehen, dass der Fluss ganz zahlig ist? Also,
wir wissen ja, wir kennen das Max Flow mit Katheorie.
Und das besagt ja, dass wir irgendwo unseren Startknoten
haben und irgendwo unseren Ziel knoten
Irgendwo das ganze Netzwerk dazwischen. Und wir haben ja
unseren Schnitt zwischen der Menge S und Tee und Tee.
Und wir wissen ja schon,
dass der maximale Fluss der Kapazität über einen Schnitt entspricht.
Und die Kapazität über einen Schnitt ist ja nichts weiter,
als die Summe der Kapazitäten, der kannten die über diesen Schnitt gehen.
So, die Kantenkapazitäten sind aber alle ganz zahlig.
Das heißt, dass die Kapazität des Schnitts automatisch ganz zahlig ist.
Und deswegen ist der maximale Fluss natürlich auch
ganz zahlig
Okay, der ist also der Flusswert, ist tatsächlich
ganz seilig. Das heißt übrigens noch nicht automatisch,
dass der Fluss über jede einzelne Kante ganz zahlig ist.
Wir haben nur gezeigt, dass der Flusswert die Summe über
alle Kanten erstmal ganz zahlig ist, der rauskommt.
So, jetzt nehmen wir die Ford Fulkasen-Methode,
Default Fulkasen-Methode geht ja so vor, sie startet mit Fluss null,
auf allen Kanten fließt keinen Fluss lang,
dann suchen sie so ein Augmentierenden Pfad.
Und dann suchen sie sich die Restkapazität über diesem Pfad heraus
Das ist also die minimale, resituale Kapazität, über all diese Kanten.
Dann erhöhen sie den Fluss entlang dieses Pfades um diese resituale Kapazität.
So, da sieht man jetzt schon, dass das ganz
zahlig sein muss. Warum muss das so sein? Naja,
die Kapazitäten sind ganz zahlig, die wir hier haben.
Deswegen ist es so, wenn wir jetzt das erste Mal argumentieren,
dann wird die Restkapazität über dem Pfad ganz zahlig sein.
Und dann ist das resituale Netzwerk, was wir enthalten,
erhalten, wieder ganz zahlig,
weil wir ja nur ganz zahlige Werte von ganz zahligen Werten
Und damit ist der nächste argumentierende Pfad auch wieder ganz zahlig.
Und so geht es immer weiter, bis wir dann irgendwann fertig sind.
Und wenn dich jeden Augmentierungsschritt ein ganz zahliger Flusserhöhung erfolgt,
sind die Flüsse über allen Kanten ganz zahlig.
Das ist ja die Idee und etwas formaler aufgeschrieben,
kann man das durch eine Induktion beweisen.
Wir machen eine Induktion über diese Augmentierungsschritte, einer nach den anderen.
Die Induktionsannahme ist, nach der Iden-Augumentierung ist der Fluss ganz zahlig.
Induktionsanfang ist, zu Beginn sind alle Flüsse null,
die sind dann offensichtlich
ganz zahlig
Und jetzt kommt der Induktionsschritt. Ja,
wo wir einen nach dem anderen jetzt argumentieren,
also im Ford Fulkasen-Algorithmus ist jetzt der Induktionsschritt, entspricht quasi ein Schleifendurchlauf.
Wir suchen also im Pfad und argumentieren.
Wir bezeichnen mal mit dem Fluss nach der Iten-Augmentierung hier,
die bezeichnen wir mal mit F-Open-I von UV.
Das ist also der Fluss über die Kante von ONAV
nach I-Augmentierungsschritten. Und wir gehen jetzt nach Induktionsannahme,
davon aus, dass nach I-Schritten dieser Flusswert hier
ganz saalig ist
Und dann haben wir eine ganzteilige Kapazität. Und dann wissen wir,
dass die Restkapazitäten, das ist ja nichts weiter als Kapazität
minus Flusswert, die müssen dann auch ganz zeitig sein.
Weil die Differenz von zwei ganz zahligen Werten,
das ist ganz zahlig. So, das heißt,
die Restkapazität des Iplus ersten Augmentierungspfades oder Erweiterungspfades,
der geht ja jetzt von irgendeinem Startknow, also von der Quelle,
V.0 über so eine Kette von Knoten bis zum Zielknoten.
Und wir wissen, die Restkapazität ist ja nur das Minimum
über die Restkapazitäten aller Kanten entlang dieses Pfades.
Ist natürlich auch ganz zahlig,
weil wir ein Minimum bilden von ganz zahligen werden
So, und das bedeutet,
wir brechen jetzt den Fluss in der IPlus ersten Schritt,
indem wir die Restkapazität auf alle Kanten auf die Flüsse,
über jede der Kanten drauf addieren, die entlang des Pfades läuft.
Und das bleibt dann entsprechend auch ganz zahlig.
So, hier können Sie wieder was streichen.
Hier ist wieder die Anti-Parallelität noch drin. Diese Zeile hier,
das sind die wieder anti-parallele Kanten,
die jetzt nicht mehr vorkommen, die können Sie mal streichen.
Wir haben ja den Fluss immer nur auf der einen Seite.
Okay, also die zweite kommt dann weg,
die würde sozusagen noch
Fluss in die andere Richtung. Minimi, das kommt jetzt,
wie gesagt, so nicht mehr vor.
Okay, gut. Was folgt daraus? Es gibt
eine Beziehung zwischen ganzhaltigem Fluss und bipert dieses Matching.
Wenn ein maximales Matching in einem bipartieten Graphen ist,
dann gibt es einen maximalen Fluss im zugehörigen Flussnetzwerk,
sodass die Größe des Matchings gleich dem Flusswert entspricht.
Das Volk direkt aus dem, was wir gerade gesehen haben.
Denn wir wissen, dass die Ford Volkerson-Methode korrekt ist und
ein maximalen Fluss berechnet. Die Frage nur, ich glaube,
die mittlere Zeit nehmen, ist das echt die Anti-Parallelität?
Wir hatten doch auch unanti-Parallelen bekannt in dem Fall, dass wir Rückwärtskanten haben,
die noch Fluss überall im Mund haben und in dem wir dann weggehen.
Ja, das stimmt. Das haben wir gemacht,
wenn wir die Restkapazität berechnen. Also die Modellierung,
so wie sie jetzt aussieht, ist, wir haben diese eine Kante von U nach V.
Und hier haben wir den Fluss, der von U nach V führt.
Und wenn wir zwischen U und V dann im resiluralen Netzwerk die Restkapazität berechnen,
dann haben wir beide Kanten und dann haben wir auf dieser
hier den Fluss von U nach V,
Die Kapazität von U nach Frau minus den Fluss,
das ist noch das, was übrig bleibt.
Und in der umgekehrten Richtung haben wir als Restkapazität den Fluss von U nach
V. Also hier geht es nur um das resituale Netzwerk. Und wie gesagt,
das ist die alte Modellierung mit den Antiparallelen Kanten,
die dann entsprechend den Fluss beschreiben,
dass wir haben es jetzt die ganzen Vorlesungen nicht gesehen,
das ist auch recht verwirrend, wenn man da stolpert man enorm drüber,
wenn man das so modelliert.
Also insofern ist es nur ein Überbleibsel aus dem alten Kormen
, können sie einfach streichen
Okay. So, die nächste Frage, die sich jetzt stellt,
ist, wie lange dauert denn das? Wir wissen,
wie lange die, naja, die Ford-Fullcast-Methode,
haben wir nicht so genau abgeschätzt, aber wir wissen natürlich,
wenn wir bei der Ford-Fullcast-Methode über die Breitensuche,
die kürzesten Pfade berechnen, dann geht das,
dann haben wir den Edmunds Carb-Algorithmus und dann haben wir eine Laufzeitabschätzung gehabt.
Die können wir ja sogar nochmal verbessern. Ja,
also Edmunds Carb hatte ja V mal eh Quadrat und die
können wir hier nochmal verbessern und wir können sagen,
zeigen,
dass in diesem speziellen Fall hier die Laufzeit durch O von V
mal eh beschränkt ist
Und als erstes kann man vielleicht denken, ja, ja,
das liegt daran, weil diese Pfade alle so kurz sind.
Wir haben einen Staatenknoten S und dann hier diese Kanten zu
der linken Menge und dann hier die Rechte.
Und dann geht das hier so weiter. Die Pfade sind
nicht automatisch kurz. Sie sind natürlich am Anfang kurz,
aber in dem Augenblick, wo sie irgendwie so ein Netzwerk,
in dem Augenblick, wo sie anfangen über erste Pfade zu argumentieren,
kriegen sie ja Kanten im resitualen Netzwerk in die Gegenrichtung
Das heißt, es kann dann sein,
dass sie ihre argumentierenden Pfade im späteren Schritten quasi hier hin und her
laufen zwischen diesen beiden Mengen und dann erst zurück zum Zielknoten-Tee gehen.
Sie wissen ja, die Pfad,
die Pfade zwischen Quelle und Senke verlängern sich im Laufe der Augmentierungsschritte,
weil sie die Kanten in der Richtung von S-NATD tendenziell sättigen.
Das war hier natürlich auch so. Also die Pfade werden
auch hier länger mit der Zeit, wie sie suchen müssen.
Trotzdem ist die Laufzeit wesentlich kürzer und der Grund,
warum die kürzer ist, ist,
dass wir diese Ganzzahllichkeit ausnutzen können und wir wissen,
dass wenn wir den Flusswert F haben, das Ganze,
also der ganze Fluss nur aus Betrag von F vielen argumentierenden Faden bestehen können.
Also für jedem auch mit jedem Pfad erhöhen wir den Fluss um eins.
Und naja, das machen wir so lange, bis wir
den maximalen Flusswert erreicht haben. Und wir können sofort sagen,
wie groß der maximale Flusswert überhaupt maximal sein kann.
Weil im besten Fall können sie jeden Knoten der linken Seite
mit jedem Knoten der rechten Seite verbinden.
Mehr Fluss würde ja nicht gehen,
weil das entspricht ja quasi dem, was hier rübergehen kann.
Also hier ist quasi der Fluss betragsmäßig schon beschränkt durch
Betrag von L. Mehr können sie sicherlich.
Und hier ist der Fluss beschränkt durch mit dem Betrag von R. Weil
mehr kriegen sie gar nicht hier zur Senke oder hier aus der Quelle heraus.
So, und das ist beides kleiner als V, wenn sie so wollen.
Wenn es aufgeteilt ist gleichmäßig, dann wären es auch V-halbe.
Und dementsprechend wissen sie, ihr Fluss ist beschränkt durch V-halbe.
Also der betragsmäßige Flusswert. Hier ist kleiner gleich V-halbe.
Und dann haben sie nur V-halbe,
viele argumentierende Pfade
Ja, und dadurch haben sie sofort eine wesentlich effizientere Schranke.
Also der Beweis ist, wir haben also das korrespondierende Flussnetzwerk mit Knoten,
V-Strich, Kanten, E-Strich. Wir haben eben schon gezeigt,
dass die Anzahl der Kanten und Knoten nicht wesentlich steigt.
Also das heißt, die Kanten sind in Tetter von der ursprünglichen Kantenmenge.
Und die Kantenmenge hier ist auf alle Fälle größer als die Knotenmenge,
ist auf alle Fälle größer als die ursprüngliche Kantenmenge, die wir hatten.
So, und dann können wir zeigen, dass wir denen
euer korrespondierende Flussnetzwerk, gehstrich in linearer Zeit konstruieren können.
Das ist, glaube ich, klar, dass das geht.
Wie lange dauert die Suche nach einem augmentierenden Pfad?
Das können wir einfach aus dem Edmonds Carb übernehmen.
Das war einfach eine Breitensuche, macht also O von E-Zeit.
Ja, und da eigentlich ja O von E-Strich,
weil wir im korrespondierenden Netzwerk suchen, aber wir haben gesehen,
dass es sich die beiden hier von der Größe nicht groß unterscheiden.
Also einen konstanten Faktor auseinander. Jede Argumentierung vergrößert den Fluss
um mindestens eins, ja,
wegen der Ganzzahligkeit
Das maximale Matching ist höchstens V-halbe, groß. Das wäre der Fall,
links und rechts sind die Hälfte der Knoten und jeder ist
mit jedem irgendwie verbindbar, sodass das Matching maximal wird.
Also ein größeres Matching als V-Halbe kann es gar nicht geben.
Und deswegen wissen wir, wir haben einen Betrag von V-Halbe,
viele Augmentierungsschritte maximal und für jeden Augmentierungsschritt müssen wir einmal eine Breitensuche machen.
Das heißt, die Gesamtlaufzeit ist V-Plus E zum Erzeugen,
für das Erzeugen des Korrespondierenden Flussnetzwerks.
Plus V-Halbe für die Anzahl der Augmentierungsschritte mal die Breitensuche für
jeden der Augmentierungsschritte.
Mal E,
macht V mal
Ja. Also das heißt, der Graf ist so einfach
durch seine Struktur, dass also die Laufzeit auch deutlich geringer wird.
Es geht auch noch besser. Und zwar haben wir ja
den Deenage-Algorithmus uns genau angeschaut. Und vielleicht erinnern Sie sich,
am Ende des Deenage-Kapitels haben wir uns die Laufzeit des Deenage-Algorithmus angeguckt für ein,
wie hieß es noch, wie hieß das noch, Einheitsnetzwerk.
Also es war ein Netzwerk mit der Eigenschaft,
dass in jedem Knoten entweder nur eine Kante reingeht oder in einen Knoten,
aus einem Knoten geht nur eine Kante raus, der aus.
Und diese eine eindeutige Kante musste Kapazität einzahlen.
Das war die Einschränkung. Und dann haben wir die Laufzeit
des DINICH-Algorithmus analysiert für diese Einheitsnetzwerke. Die Bibatitengraphen,
wenn wir die als Flussnetzwerke modellieren, da sind das genau solche Netzwerke.
Die haben nämlich auf der linken Seite, haben die die Knoten,
wo nur eine Kante reingeht mit Kapazität 1. Das ist die,
die von der Quelle hier so hochläuft und dann auf der rechten Seite,
da haben die die Knoten,
wo nur eine Kante rausgeht mit Kapazität 1. Das sind die,
die dann zur Senke gehen
Das heißt, wenn wir das B-Partitel-Matching als Flussnetzwerk modellieren,
als durch das korrespondierende Flussnetzwerk, kriegen wir genau so
ein Einheitsnetzwerk und für dieses Netzwerk haben wir gezeigt,
dass der Deenage-Algorithmus, sonst ist irgendwas verrutscht,
dass der DINES-Algorithmus dann die Laufzeit O von Wurzel-V mal E hat.
Und das liefert uns eines der schnellsten Verfahren,
die wir heute kennen, zur Lösung des maximalen B-Partiten-Matchings
auf ungewichteten Grafen
Also wenn man das Problem heute löst, dann tendenziell so.
Und das ist schon ziemlich gut, ja, weil Betrag von E,
also O von oder Omega von E wäre eine untere Schranke,
die sie auf alle Fälle benötigen,
weil sie müssen ja alle Kanten einmal angucken.
Und da haben sie jetzt einfach nur noch so einen Faktor,
Wurzel V da drauf, ja, um das Problem so zu lösen.
Okay, also das ist quasi zunächst einmal
eine Lösung für den einfachsten Fall und zwar,
dass wir es maximale V-Partite Matching berechnen auf einen ungewichteten Grafen.
So, das war zum Warm-Up.
Ja, das war der einfache Teil
Jetzt kommen wir zu dem eigentlichen Problem, zu dem schwierigen.
Nämlich dann, wenn wir Kantengewichte haben.
Das Problem wird als maximales, gewichtetes B-Partiet das Matching-Problem bezeichnet.
Und ist relativ legendär, weil es, wie gesagt,
in vielen Problemen vorkommt. Und weil es tatsächlich auch effizient
lösbar ist, also im Polynomie der Zeit lösbar ist.
Und das Problem lässt sich wie folgt formulieren.
Wir haben also einen bibatiten Graphen als Eingabe.
Jetzt heißen die nicht mehr L und R,
sondern A und
Und die beiden Mengen sind es jung.
Wie plötzlich der Graf keine Kante innerhalb von A und We
, dem müssen die also das jugend aufteilen können.
Und wir haben entsprechende Kantenkosten C. Gesucht wird ein Matching,
Matching-Eigenschaft ist, dass die Menge, das für jeden Knoten gilt,
dass die Menge aller Kanten aus dem Matching,
zu dem die Kante inzident ist, kleiner gleich eins ist.
Also so wie eben auch. Also jeder Knoten darf
nur eine zugeordnete Kante haben
Allerdings sehen wir jetzt nicht die Anzahl der Kanten,
sondern die Summe der Gewichte. Mit der Eigenschaft,
dass die Summe über alle Kanten, die zum Matching gehört,
Gewicht, C von E oder Kosten von E, maximal ist.
Dieses maximale, gewichtete B-Partite-Matching-Problem gibt es mit einer
ganz leichten Variante unter einem anderen Namen.
Unter dem ist es eigentlich noch fast noch berühmter.
Und dann ist es das Assignment-Problem. Und das steht hier beim Assignment-Problem,
haben wir zwei endliche Mengen, A und B,
die betragsmäßig gleich sind,
also genauso viele Elemente enthalten
Und wir haben eine Kostenfunktion, C, die definiert ist auf diesen beiden Mengen.
Also jedes beliebige Paar von Knoten kriegen einen Kostenwert zugeordnet.
Und dann suchen wir eine bieektive Funktion F,
das ist diese eindeutige Zuordnung, die Elemente aus A,
den Elementen aus B zuordnet, mit der Eigenschaft,
dass die Summe über A, die Kosten,
der Kostenwert, wenn wir A mit F&A,
also FSDB aktive Funktion,
Paaren,
wenn wir das alles hier addieren,
dann wollen wir
einen maximalen Kostenwert haben
Das bezeichnen wir als Assignment-Problem. Und der Unterschied ist relativ gering.
Das erste, was unterschiedlich ist, ist beim Assignment-Problem,
haben wir auf der linken Seite, das ist die Menge A,
und auf der rechten Seite gleich viele Knoten.
Das ist der erste Unterschied, weil beim Bipa-Titagraph muss das nicht so sein.
Da können hier Links mehr oder weniger Knoten sein als rechts.
Die zweite Eigenschaft ist, wir haben Kostenwerte für jede beliebige Paarung von Knoten.
Das heißt, der livatite Graph, den wir uns hier angucken,
werde ich jetzt nicht vollständig aufmalen, aber ist vollständig.
Das heißt, jeder Knoten ist mit jedem anderen über eine Kante
verbunden und jeder hat einen Kostenwert. Und der dritte Unterschied ist,
wir suchen nicht ein Matching, sondern diese bioaktive Funktion.
Und das bedeutet, dass wir auf alle Fälle jeden Knoten aus A
genau einem Knoten aus B zuordnen müssen.
Wir dürfen nicht Kanten weglassen. Das sind die drei
feinen Unterschiede zwischen gewichteten bipartiten Matching und dem Assignment-Problem.
Diese Unterschiede sind aber nahezu marginal, weil, naja gut,
also wenn sie diese Mengen nicht haben, dann können sie,
dann haben sie so ein Auswahlproblem noch, was sie da reinschalten müssen.
Aber die Tatsache, dass sie hier alle Kanten nehmen und sozusagen in vollständige Zuordnung haben,
ja, das sind eigentlich so kleine Modellierungsunterschiede zwischen diesen beiden Varianten, ja.
Wenn wir mal davon ausgehen,
dass die Kosten hier alle positiv sind, ja,
das steht hier ja noch nicht, aber wenn die alle positiv sind,
dann ist es sowieso so,
dass sie im Fall des Assignment-Problems ein vollständiges Matching.
Also jeder Knoten wird einem Knoten hier zubauen jetzt bekommen.
Weil wenn die positiv sind, dann können sie ja mit
jeder Kante hier diese Summe weiter maximieren.
Und dann werden sie natürlich jeden Knoten aus A zuholen.
Okay, also Assignment-Problem entspricht weitestgehend dem maximalen gewichteten B-Partiten-Matching-Problem auf vollständigen B-Partitengrafen.
Beim Assignment-Problem ist nur ein perfektes Matching erlaubt,
perfektes Matching bedeutet, jeder Knoten aus A
hat einen Partner in
So, der Algorithmus, den ich Ihnen präsentieren werde,
trägt den Namen ungarische Methode. Und das liegt daran,
weil er nicht von jemandem entwickelt wurde, der aus Ungarn kommt,
sondern der wurde entwickelt von dem Herrn Kuhn hier.
Aber es gibt zwei ungarische Mathematiker,
die hießen König und Egawari und die beiden,
die haben sozusagen die theoretischen Grundlagen,
die wir hier zum Teil auch berühren werden,
gemacht.
Die haben sich das ausgedacht
Und der Herr Kuhn hat darauf den Algorithmus entworfen und hat das dann nach den beiden hier,
der hat es nicht deren Namen verwendet,
aber hat es dann ungarische Methode genannt,
weil die beiden hier aus Ungarn kamen.
Okay, die Variante, die ich Ihnen zeigen werde,
ist eine Variante der ungarischen Methode, die von zwei Herren entwickelt wurde,
die Sie schon kennen von Edmonds und Carb. Und also die,
eine gute Beschreibung der ungarischen Methode in der Literatur zu finden,
ist nicht so einfach, weil das kommt,
das ist die Beschreibungsform,
die Sie so kriegen,
wenn Sie diese Originalsachen lesen,
ist sehr mathematisch und nicht so algorithmisch
Es ist dann immer nicht so leicht,
das zu übersetzen in vielleicht einen Pseudo-Code, der das Ganze beschreibt.
Und also ich habe es aus diesem Buch hier,
aus dem Lederbuch, da kann man das auch nochmal nachlesen.
Ich sage Ihnen nur gleich schon mal, dieses Lederbuch ist quasi,
Leder ist eine Softwarebibliothek für effiziente Algorithmen.
Das ist jetzt didaktisch nicht so vollständig aufgebaut,
wie das der Fall ist beim Cormen. Da finden Sie
nicht ganz viele Beispiele, an denen man das so nachvollziehen kann.
Also das ist ein bisschen schwieriger, das da zu lesen.
Okay, aber ich habe Ihnen ja ein paar Beispiele konstruiert
So, also, wir wollen dieses Problem lösen.
Wir beginnen mal, indem wir ein paar Begriffe definieren,
die wir im Folgenden brauchen.
Und zwar schauen wir uns mal so ein Matching an.
Sie sehen, hier sind doch gar keine Kantengewichte dran.
Und wenn wir so ein Matching haben,
das sind wieder diese roten Kanten, die sind hier Teil eines Matchings,
dann können wir die Knoten unterscheiden in zwei Arten.
Wir haben einen Knoten, wie zum Beispiel diesen hier,
an dem hängt schon einige matchte Kante dran.
Den bezeichnen wir als saturiert. Der ist also gesättigt,
da können wir keine weitere Kante dranbauen.
Und dann gibt es aber auch Knoten,
wie zum Beispiel diesen hier oder diesen oder diesen
An dem hängt noch keine Kante aus dem Matching dran.
Da hängt zwar Kanten dran, aber keine, die im Matching ausgewählt werden.
Die bezeichnen wir als frei. Ja, also die könnten
wir jetzt eigentlich noch in das Matching integrieren. Okay,
also wenn wir einen Grafen haben und ein Matching,
dann können wir die Knoten einteilen in saturierte und freie Knoten,
die saturierten, sind die Knoten, die die Eigenschaft haben.
Das ist eine Kante im Matching gibt, die an, wie zu diesem Knoteninzident ist.
Und wenn es das nicht gibt, dann ist es ein freier Knoten. Okay,
wenn wir so eine Definition haben von freien und saturierten Noten,
dann können wir uns als nächstes einen sogenannten alternierenden Pfad raussuchen und ein alternierender Pfad ist erst mal umgangssprachlich an Pfad,
wo immer abwechselnd eine freie Kante, also eine,
die nicht zum Matching gehört und eine gematchte Kante kommt.
So, hier ist ein Beispiel für so einen alternierenden Pfad,
das beginnt mit einem freien Knoten,
dann geht die zu einem saturierten Knoten,
dann folgen wir der Matching-Kante, dann kommt wieder eine,
also jetzt kommt nur noch saturierte Knoten und wir haben immer eine Kante,
die nicht zum Matching gehört,
eine Kante,
die zum Matching gehört,
die gehört nicht zum Matching,
die gehört wieder zum Matching
und dann endet das sie irgendwo wieder
Das ist jetzt ein Pfad und der ist alternierend. Das Alternieren,
weil jede zweite Kante gehört zum Matching oder nicht zum Matching.
Und dann müssen wir noch gucken, dass hier die Anfangsbedingungen stimmen.
Also was wir jetzt nämlich nicht machen dürfen, ist,
dass wir, also wir müssen darauf achten,
dass wir entweder an einem freien Knoten aufhören oder hier an so einem saturierten,
wir dürfen nicht quasi aufhören an einem saturierten Knoten,
wo dann hier eine gematchte Kante kommt.
Das dürfen wir nicht. Also das ist die einzige Bedingung,
auf die wir noch achten müssen
So, also formal habe ich darüber gesprochen. Wir haben also einen einfachen Pfad,
der fängt an, ein V0V1 bis zur VK.
Und den bezeichnen wir als alternierend bezüglich des Matchings, falls gilt. Erstens,
wenn die Kante von VI minus 1 nach VI im Matching ist,
also zum Matching gehört, dann ist die Kante von VI zu VI plus 1 nicht im Matching.
Oder umgekehrt. Das ist das Alternierende. Also jede
zweite Bindung gehört dazu, gehört nicht dazu.
Die erste Kante von V0 nach V1 ist im Matching oder V0
ist frei. Also und für die letzte Kante gilt,
die letzte Kante ist im Matching oder VK ist frei.
Also das, was nicht erlaubt, ist es wie gesagt,
wie könnte ich jetzt hier so ein Beispiel? Also mal angenommen,
also wenn wir den Pfad hier enden lassen würden,
also bei diesem Knoten hier,
also wir würden nur die ersten drei Kanten nehmen,
ja, das wäre nicht erlaubt.
Das wäre kein alternierender Pfad, weil die letzte Kante dieses Pfades,
die gehört nicht zum Matching,
aber dieser Knoten ist nicht frei, der ist saturiert.
Das ist nicht erlaubt. Das ist das Einzige, worauf wir noch achten müssen.
Ansonsten haben wir immer so einen Pfad mit Alternieren in Kanten.
Warum ist der so ein Pfad interessant? Warum definiert man
sich den, braucht den? Wenn sie sich diesem Pfad anschauen,
dann können sie das Matching über diesem Pfad verändern,
indem sie genau entlang dieses Pfades alle Kanten austauschen.
Die kannten, die noch nicht im Matching war,
die nehmen sie jetzt in das Matching auf und die kannten,
die vorher im Matching war, die nehmen sie raus.
Und dann kriegen sie wieder ein gültiges Matching.
Hast hier dargestellt auf der rechten Seite, sehen Sie,
was passiert, wenn wir diesen Pfad hier auf das Matching addieren.
Dann kommt diese Kante, kommt rein,
die Kante geht raus, die kommt rein,
die geht raus und dann haben wir ein neues Matching.
In diesem Fall hat das nicht viel gebracht.
Wir haben hier drei Kanten in dem Matching gehabt,
hier haben wir auch drei Kanten in dem Matching gehabt
Aber man kann sich sofort vorstellen, mal angenommen,
hier wäre noch eine Erkannte dabei gewesen,
die auch zu einem freien Knoten geführt hätte.
Sonst wäre das ja nicht erlaubt gewesen. Der letzte Knoten
muss ja dann frei sein. Dann hätten wir entlang dieses
Pfades jetzt eins, zwei, drei Kanten rausgenommen.
Oder reingenommen in das Matching. Und zwei Kanten rausgenommen.
Das heißt, die Anzahl der Kanten hätte sich hier erhöht.
Aber selbst wenn die Anzahl der Karte sich nicht erhöht,
dann kann es ja sein, dass vielleicht diese Kanten,
die noch nicht zum Matching gehören, selbst wenn das jetzt genauso viele sind,
vielleicht sogar weniger sind, vom Gewicht her höher sind,
als die, die im Matching drin sind.
Also selbst dann könnte es sein, dass der Augmentierende Pfad
die Summe der Gewichte in dem Matching erhöht. So,
und das ist unsere Strategie,
die wir verfolgen werden oder die eine ganz entscheidende Komponente in der ungarischen Methode ist,
nämlich diese augmentierenden Pfade zu suchen und damit das Matching zu erweitern.
So, und jetzt kommt ihr vielleicht das erste Mal die Idee,
warum man sich das Matching besser nach den Flüssen anguckt,
weil Augmentieren, haben wir schon viel gemacht.
Wir haben in den Flüssen bei den Flussalgorithmen auch Pfade augmentiert.
Das heißt, der Gedanke ist hier der gleiche.
Wir fangen an mit einem einfachen Szenario, was gültig ist,
also ein gültiges Matching, was aber nicht maximal ist,
noch nicht maximal.
Und dann suchen wir solche Pfade und mit den Faden
können wir schrittweise das Matching verbessern, vergrößern.
Und genauso haben wir das bei den Flüssen auch gemacht.
Wir sind mit Fluss 0 angefangen und haben dann Pfade gesucht,
augmentierende Pfade und haben damit den Fluss verbessert, erhöht.
Gut, was passiert jetzt genau,
wenn wir über so einen alternierenden Pfad augmentieren
Wir haben also jetzt unseren Grafen und wir haben ein Matching und
wir haben so einen alternierenden Pfad, der geht hier drüber,
dann müssen wir erst mal sagen, wie das neue Matching aussieht.
Wir definieren uns jetzt so eine Operation zum Augmentieren,
das ist ja so ein Plus mit so einem Kreis drumherum und wir sagen,
das neue Matching am Strich ist also M plus P,
P ist der Pfad und das bedeutet nichts weiter,
als wir nehmen das Matching M und wir betrachten das als eine Menge von Kanten,
dem Pfad auch als Menge von Kanten und dann rechnen nehmen wir M ohne P,
also wir nehmen die Kanten aus dem Pfad heraus
und vereinigen das mit P ohne
Also P ohne M sind, die Kanten des Pfades,
die nicht im Matching sind. Und M ohne P sind
die Kanten des Matchings, die nicht im Pfad sind.
Und das, was wir dann kriegen, ist wieder ein neues Matching.
Und hier rechts sehen Sie das an dem Beispiel,
das ist natürlich immer so ist.
Ja, wir haben genau die alternierenden Pfade so beschrieben,
dass sie diese Eigenschaft haben. Und wir können auch sofort sehen,
wie sich so ein Alternierungsschritt auf das Gewicht des Matchings auswirkt,
indem wir sagen, naja, wir können jetzt genau sehen,
welche Kanten gehen raus und welche Kanten kommen hinzu.
Ja, hier gehen welche raus und hier kommen welche dazu
Das können wir entsprechend beschreiben, indem wir sagen, okay,
wir nehmen unsere Kostenfunktion und dann haben wir, können wir diesem Pfad einen Gewinn zuordnen.
Wir können sagen, wie stark wächst das Matching von seinem Gewicht, wenn wir diesem Pfad augmentieren. Und das ist ganz einfach,
wir nehmen einfach die Kanten, die hinzukommen,
das sind die hier hinten, also P ohne M,
die gehen rein, ja, und die kannten hier vorne,
ja, das ist hier unten, ist es als Schnittmenge beschrieben,
das geht natürlich auch, also P geschnitten M,
die im Matching drin waren und dann und MP sind,
die müssen wir aus der Menge herausnehmen.
Die müssen wir wieder subtrahieren. Und die Differenz dieser Kosten
ist das, was uns das Augmentieren dieses Pfades bringt.
Wenn es positiv ist, wenn es negativ ist,
wäre es natürlich nicht so gut, dann wären die Kosten kleiner gewesen,
könnten natürlich auch sein, wenn man im falschen Pfad wäre.
Okay, das ist also unsere Strategie. Wir wollen also
solche Pfade finden. Ja, Jetzt kommt der schwierigste Teil der ganzen Geschichte,
der Algorithmus nachher ist dann gar nicht mehr so wild.
Aber wir brauchen ein Optimalitätskriterium. Und bei den Flüssen haben wir das gefunden,
mit einem recht intuitiven Modell, nämlich mit den Schnitten.
In den Flüssen, das habe ich jetzt nicht mehr hier,
wissen wir, der maximale Fluss wird begrenzt durch den minimalen Schnitt.
Und wir brauchen irgendein Kriterium bei dem gewichteten Matching,
was uns sagt, dass das Matching jetzt auch maximal ist,
was wir da gefunden haben.
Das ist hier ein bisschen schwieriger und dieses Kriterium ist jetzt
auch nicht so intuitiv zu erfassen.
Es ist nicht so etwas, was man einfach in
dem Grafen reinmalen kann wie ein Schnitt
Und es fällt jetzt auch so ein bisschen vom Himmel und
ich kann es in diesem Augenblick auch nicht gut erklären,
intuitiv, warum man das als Schranke nimmt.
Das müssen Sie jetzt einfach mal so hinnehmen.
Ich werde Ihnen am Ende noch was dazu sagen,
wie die überhaupt darauf gekommen sind, das so zu machen.
Das hat einfach Gründe, die aus Analogien aus der Mathematik kommen,
die wir hier jetzt momentan einfach noch nicht sehen können.
Also, die ungarische Methode geht wie folgt vor. Ach so,
eine ganz wichtige Einschränkung, habe ich noch nicht gesagt.
Der Algorithmus funktioniert nur auf Kostenfunktionen mit nicht negativen Kantengewichten.
Also wir haben die Einschränkungen, die wir auch vom Dixtra-Algorithmus bei kürzesten Faden erkennen.
Die gilt ja auch. Ist in der Regel okay,
weil auch in der Praxis haben wir da,
das ist ähnlich wie bei kürzestem Faden,
da gibt es auch ganz wenig Anwendungen, wo man mal negative Kantenlängen hat.
Hier ist es ähnlich. Also auch beim Matching hat man typischerweise ganze positive Kantengewichten.
Gewichte. Okay, das ist die Einschränkung. Die Idee unserer Methode ist jetzt,
wir addieren sukzessive, alternierende Pfade, immer, immer,
wenn der Pfad einen positiven von P-Wert hat,
also die Kostendifferenz positiv ist, dann addieren wir denen zu,
unserem Matching dazu, mit unserer entsprechend modellierten Plus-Funktion hier.
Und das machen wir einfach iterativ, wie bei der Ford-Fullkassen-Methode.
Ich könnte hier auch einen Pseudo-Code schreiben,
so lange ist noch so ein alternierender Pfad mit D von P. Größer Null gibt,
addiere den darauf und dann müssen wir gucken,
terminiert das irgendwann und ist es dann irgendwann maximal.
Also alles sehr ähnlich. So, jetzt kommt der Schritt,
wie wir die Maximalität erkennen. Dafür brauchen wir als erstes
mal eine Potenzialfunktion. Wie beschreibt quasi diese Optimalität und Sehen
tun wir das über sogenannte reduzierte Kosten.
Also, was machen wir? Wir haben also einen Grafen,
wir haben Kantenkosten, die jeder kannte halt einen Kostenwert zuordnen.
Hier müsste eigentlich ein Air Plus stehen. Also, wir
Kantenkosten müssen positiv sein. Eine Funktion Pi bezeichnen wir als Potenzialfunktion.
Also, jedem Wert, jedem Knoten wird ein entsprechender Wert zugeordnet.
Und welche Eigenschaften diese Potenzialfunktion haben, werden wir jetzt gleich sehen.
So, wenn wir so eine Potenzialfunktion haben, dann betrachten wir eine beliebige Kante
Und für diese Kante können wir sogenannte reduzierte Kosten definieren,
indem wir einfach sagen, wir addieren die Potenzialwerte der beiden Knoten und subtrahieren die Kantenkosten.
Das muss jetzt für sie noch nicht intuitiv sein,
das müssen sie jetzt erstmal einfach so glauben,
dass wir das jetzt immer so machen.
Das sind die reduzierten Kosten von der Kante.de. Dann bezeichnen wir
eine Kante als dicht, genau dann, wenn diese reduzierten Kosten null sind.
Also man kann sich das so ein bisschen vorstellen,
als ob wir diese Kantenkapazität oder diese Kantenkosten,
die wir haben, irgendwie auf die beiden Knoten aufteilen.
Ein Teil dieser Kosten schieben wir auf den einen Knoten und
einen Teil dieser Kosten auf den anderen.
Und wenn wir die gesamten Kosten dieser Kante aufgeteilt haben auf die beiden Knoten,
dann wäre ja das, was noch übrig bleibt,
also die reduzierten Kosten, das, was wir noch nicht aufgeteilt haben,
wäre dann null.
Also das ist ein ganz gutes Modell,
was man sich so im Kopf bemerken kann.
So, jetzt verlangen wir folgende Eigenschaften von der Potenzialfunktion.
Die stehen hier vier Eigenschaften, Wünsche hätten wir gerne.
Erstens, nicht Negativität der reduzierten Kosten.
Das heißt C-Strich von E muss immer größer gleich null sein.
C-Strich von E war ja Summe der Potenzialwerte. Minus die Das heißt,
die Summe der beiden Potenzialwerte an den beiden Knoten muss immer
größer sein, als die Kosten der Kante.
Das ist die erste Bedingung, die gelten muss.
Die zweite Bedingung ist, wenn eine Kante zu einem Matching
gehört, dann muss sie dicht sein.
Für die anderen nicht unbedingt, aber die müssen dicht sein.
Das bedeutet, wenn die Kante zum Matching gehört,
müssen die reduzierten Kosten null sein.
Das heißt, wenn sie zum Matching gehört, ist,
dass das Potenzial der beiden Knoten gerade genauso groß wie das
Kantengewicht,
wie die Kantenkosten
Drittes Kriterium ist nicht Negativität der Potenziale. Das heißt,
für alle Knoten muss der Potenzial nicht größer, gleich null sein.
Wir dürfen keine negativen Potenziale zuordnen. Und vierte Bedingung ist,
dass alle Knoten, die frei sind,
also die nicht an einem Matching beteiligt sind,
für die gilt, dass das Potenzial null sein muss.
Das heißt, hier verwenden wir wieder den Begriff der Dichtigkeit,
also freie Knoten sind dicht, da fließt nichts raus.
Das heißt, das Potenzial für diesen Knoten muss null sein.
So,
das sind vier Bedingungen
Die wir jetzt einfach definieren auf dieser Potenzialfunktion. Okay,
wenn diese vier Bedingungen gelten, dann können wir zeigen,
dass die Potenzialfunktion eine obere Schranke definiert für das Matching,
das gewichtete Matching.
Okay, und das ist genau das, was Herr Kuhn gezeigt hat.
Ja, das ist genau das, seinen Beitrag hier,
der ganz wichtig war. Also, wir haben einen Graf G,
das ist ein gewichteter Graf, M ist ein Matching,
F ist die Menge der freien Knoten bezüglich des
Matching Ms,
Piece eine Potenzialfunktion
So, was gilt? Wenn für alle Kanten eh gilt,
dass die reduzierten Kosten hier, wenn das erste Kriterium gilt,
wenn für alle Kanten Eagles die reduzierten Kosten sind größer gleich null,
dann sind die Kosten des Matchings kleiner gleich.
Der Potenzial mit aller Knoten, minus der Potenzial,
wert der freien Knoten. Und hier sehen wir die Schranke.
Hier sehen wir die Schranke. Das Matching wird beschränkt durch
die Summe der Potenzialwerte aller Knoten
Wenn zudem gilt, dass für alle Knoten die Potenzialwerte größer gleich null ist,
sind, dann ist es die Summe der Kosten,
das sind die Kosten des Matchings kleiner gleich,
der Summe der Potenzialwerte aller Knoten. Wenn drittens gilt,
dass alle Kanten reduzierte Kosten größer gleich null haben und für die Kanten des Matchings gilt,
dass sie dicht sind, das heißt,
dass die reduzierten Kosten null sind, dann ist sogar so,
dass die Kosten des Matchings gleich dem Potenzialwert aller Knoten,
minus dem Potenzialwert aller freien Knoten ist, also gleich.
Und wenn viertens gilt, dass für alle freien Knoten der Potenzialwert null ist,
dann sind die Kosten des Matchings gleich der Summe der Potenzialwerte der Knoten.
Okay, das hier ist quasi, wenn Sie wieder auf die Flüsse schauen,
in Analogie das, was das Max Flowman-Kategorium uns liefert.
Es sagt eine Beziehung zwischen der Potenzialfunktion, das ist das,
was die Schnitte sind in den Flüssen und den Kosten des Matchings.
Das ist das, was aus den Flüssen entspricht.
Und es sagt erstens, dass das eine immer kleiner gleich
dem anderen ist, hier, wenn wir unsere Regeln einhalten.
Und es zeigt zweitens sogar, wann wir die Optimalität erreichen können,
nämlich genau dann, wenn diese beiden Bedingungen gelten,
wenn die gematchten Kanten dicht sind und wenn die freien Knoten dicht sind.
Wenn das gilt, dann wissen wir,
Kosten des Matchings sind gleich der Summe der Potenzialwerte der Knoten.
Jetzt erwartet man vielleicht einen riesig komplizierten langen Beweis,
das ist aber gar nicht so,
mit der Definition dieser Potenzialfunktion ergibt sich das quasi sofort,
dass das so sein muss
Also, woran sieht man, dass die Kosten des Matchings
kleiner gleiche Potenzial werden, der Knoten minus der freien Knoten sind?
Ja, wir wissen ja genau, was die Kosten des Matchings sind.
Die Kosten des Matchings ist nichts weiter als die Summe über alle Kanten,
die zum Matching gehören, die Kosten der Kante.
So, und jetzt wissen wir, die reduzierten Kosten sind immer größer, gleich null.
Und wenn wir das umformen, dann steht dann da,
dass die Kosten der Kante kleiner gleich der Summe der Potenzialwerte ist.
Der beiden benachbarten Knoten, ja. Okay,
deswegen können wir da für die Kosten der Kante die Summe
der beiden Potenzialwerte reinsetzen. Wir haben ein Matching,
ein Matching bedeutet, jeder Knoten darf nur einmal vorkommen,
Also in der gematchten Kantenmenge. Deswegen ist das hier natürlich
das Gleiche wie die Summe über alle Knoten,
ohne die freien Knoten, weil die spielen ja im Matching keine Rolle.
Und dann nehmen wir die Potenzialwerte. In dieser Gleichheit steckt
das Matching. Also von da nach da kommt das Matching
vor. Weil jede Kante nur einen Knoten hat,
oder jeder Knoten nur eine Kante hat.
Ja, und das können wir aufschreiben.
Das ist die Summe der Potenzialwerte aller Knoten,
minus die Summe der Potenzialwerte aller freien Knoten
Da ist sie. So, und die anderen Sachen,
die ergeben sich jetzt sofort. Ja,
wenn jetzt also die Potenzialwerte alle größer gleich null sind,
dann ist natürlich, sind die Potenzialwerte für die freien Knoten
in der Summe natürlich auch größer gleich null.
Und die werden ja hier subtrahiert. Und wenn wir was subtrahieren,
was größer als null ist, dann können wir das auch abschätzen.
Und dann sind die Summe, dann sind die Kosten
des Matchings gerade kleiner gleich die Summe der Potenzialwerte.
Ja. Hier kommt es mit der Gleichheit rein. Ja,
und das sehen wir auch sofort,
weil in dieser Herleitung zu Teil 1 ist dann nur an einer Stelle eine Ein kleiner gleich,
und zwar hier, und das Kleine gleich kommt dadurch rein,
dass wir sagen, dass die reduzierten Kosten größer gleich null sind.
Deswegen sind die realen Kosten nur kleiner, gleich die Summe
der Potenzialwerte. Wenn die reduzierten Kosten gleich null sind,
dann wären die realen Kosten gleich der Summe der Potenzialwerte.
Und wenn wir hier das gleich einsetzen,
kriegen sie ja sofort den dritten Teil, das hier.
So, und wenn jetzt noch gilt,
dass für alle freien Knoten das Potenzial null ist,
dann ist natürlich diese hintere Summe null.
Und wenn die hintere Summe null ist, dann folgt sofort,
dass die Kosten des Matchings gleich die Summe der Potenzialwerte der Knoten sind.
Also diese Potenzialfunktion mit diesen Eigenschaften gibt uns die obere Schranke und sagt uns,
wie groß das gewichtete Matching maximal werden darf.
Und das einzige, was hier so ein bisschen unschön ist,
ist, dass ich ihnen nicht so ein einfaches Bild malen kann,
wie beim Schnitt. Deswegen ist es ein bisschen komplizierter.
Man kann nicht einfach das einzeichnen in den Grafen.
Und deswegen, da fehlt es auch ein bisschen diese Analogie.
Aber ansonsten ist es relativ leicht nachvollziehbar, dass das so sein muss.
Okay, damit haben wir ein Kriterium gefunden,
Wann unsere, an unserem Matching optimal ist?
Ja, wann ist maximal alles? Und es ist dann optimal,
wenn wir eine dichte Potenzialfunktion gefunden haben,
so eine dichte Potenzialfunktion ist eine Potenzialfunktion,
die die üblichen wie eigenschaffen hat, die wir schon gesehen haben.
Also, die Potenzialfunktion Pi ist nicht negativ, das heißt,
für alle Knoten gilt Pi von V ist größer gleich null.
Die Potenzialfunktion Pi ist dicht, wenn, erstens,
für alle Kanten gilt, reduzierte Kosten größer gleich null.
Zweitens, für alle Kanten des Matchings gilt reduzierte Kosten.
Gleich null, Kanten des Matchings sind dicht. Drittens,
für alle Knoten V gilt, die freien Knoten haben Potenzial null.
Also Pi von V gleich null. Wenn diese Eigenschaften gelten,
dann haben wir eine dichte Potenzialfunktion, wenn die Potenzialfunktion dicht ist,
dann wissen wir direkt aus diesem Lämmer hier,
dass wir ein maximales gewichtetes Matching gefunden haben.
Also wenn wir einen Grafen G haben im ein Matching,
wenn eine nicht negative,
dichte Potenzialfunktion Pi existiert,
ist M
ein maximales gewichtetes Menschen
Okay, so, jetzt muss ich mal ein Beispiel aufmalen,
damit sie mir das, dass sie das jetzt noch glauben
und mal sehen, wie das jetzt so verteilt ist.
Ich habe ihnen hier mal so einen einfachen bipartieten Grafen hingemalt.
Es gibt zwei Mengen mit jeweils drei Knoten.
Und die Kantenstärke gibt die Kosten an. Also es gibt,
das ist ja so eine Kante hier,
der Stärke 1, hat also Kosten 1,
die kosten 2 und so eine dicke Linie hier, die Erdkosten 3.
Die ist vielleicht nicht ganz dick genug,
aber es steht ja auch nochmal die Zahl herein.
Okay, so, wir können mal
ein beliebiges Matching nehmen
Und zum Beispiel die roten Kanten. Also die,
die, die. Dieses Matching hat einen Kostenwert,
der ist sechs, also drei plus zwei plus eins.
Diesen Kostenwert wollen wir ja maximieren. Und hier oben und unten
stehen die Potenzialwerte der Knoten, die stehen oberhalb und unterhalb.
Und jetzt können Sie sehen,
dass dieses Potenzial genau so ist,
dass das für alle Kanten gilt,
dass die Summe dieser beiden Potenzialwerte immer gleich größer oder
gleich der Kosten der entsprechenden Kante sind
Trotzdem ist dieser Wert nicht maximal. Und es ist nicht
das maximale Matching. Und das bedeutet ja,
wenn das Corola da richtig ist, dass diese Potenzialfunktion,
die wir sehen, also diese sechs Zahlen bilden ja die Potenzialfunktion,
dass die nicht dicht ist.
So, was bedeutet denn, dass sie nicht dicht ist?
Also irgendwas stimmt nicht. Alle Kosten hier sind größer,
gleich null. Die reduzierten Kosten, das können sie nachrechnen.
Das kommt hoffentlich hin. Wir haben keine freien Knoten,
also an diesem Kriterium kann es nicht liegen.
Also muss es
eine Kante geben
Wo die reduzierten Kosten nicht null sind. Die Teil des Matchings ist,
die gibt es tatsächlich, es ist nicht diese hier,
weil hier haben wir zwei plus eins, es entspricht drei,
also genau dem Kostenwert, der gematchten Kante.
Wir haben wir eins plus eins, das entspricht zwei,
sind auch der Kostenwert, der gematchten Kante.
Und hier haben wir zwei plus eins und das entspricht nicht
dem Kostenwert der gematchten Kante hier. Da hätten wir drei,
aber hier die Kante hat ja nur eins. Das heißt,
diese Kante des Matchings ist, da ist die Potenzialfunktion nicht dicht.
Also an der Stelle geht das momentan hier schief. So,
der Grund, warum ich Ihnen das Beispiel hier mal so hingemalt habe,
ist, weil man jetzt irgendwie so das Gefühl hat,
wahrscheinlich haben sie das, ja, das kann ich jetzt aber hinschieben,
dann schreibe ich doch halt hier eine Eins hin, ja,
und dann fangen sie an und schieben sozusagen die Potenziale hin und her.
Und das ist natürlich auch das, was unser Algorithmus nachher machen wird.
Er wird sozusagen die Potenziale kalibrieren, einstellen, ja,
und sich versuchen so sozusagen die Schranke von oben zu definieren. So,
jetzt könnten sie sagen, ja, dann schreibe ich doch hier,
also hier haben wir ja nur eins,
da müsste ich ja hier mal eine Null hinschreiben,
wenn sie dann eine Null hinschreiben, dann könnten sie natürlich machen,
dann haben sie natürlich ein Problem,
weil hier haben sie ja eine Kante mit Größe drei
Dann müssen sie, damit das alles noch funktioniert,
hier ja mindestens mal eine 3 hinschreiben, ja,
weil für jede Kante ja die reduzierten Kosten größer gleich 0 sein muss.
Also die Summe der Weinwertung muss immer größer sein,
dass es Kanten gibt. So, dann schreiben sie hier
eine 3 hin. Also wenn sie hier eine 3 schreiben,
dann müssten sie jetzt aber hier eine Null hinschreiben, ne?
Und jetzt haben sie ein Problem,
weil wenn sie hier eine Null hinschreiben,
dann steht hier eine Null und hier eine 1,
aber hier haben sie eine Kante, der stärkt wieder 3,
die ist dann wiederum, die erfüllt dann wieder nicht diese Nicht-Negativitätsbedingung.
Das heißt, es gibt hier irgendwie so zyklische Abhängigkeiten,
was da auch nicht erstaunlich ist, dass es die gibt.
Und die führt dazu, sie können das nicht weiter kalibrieren.
Wir haben es ja auch schon gezeigt,
dass es nicht geht
Weil die Potenzialfunktion ja eine obere Schranke ist. Das heißt,
das ist nicht optimal. Und die einzige Art und Weise
ist zu reparieren, ist ein anderes Macching zu wählen.
Zum Beispiel das hier. Dieses Matching hier, diese Kante,
diese Kante, Lisekante, hat insgesamt Kosten acht.
Und jetzt sehen wir, dass die Potenzialfunktion tatsächlich dicht ist.
Wir sehen für jede, der gematcht kannten,
ist die Summe der beiden Potenzialwerte entspricht gerade den entsprechenden Kantengewicht.
Also hier drei, hier drei,
hier zwei
Es hätte auch sein können, also für die Optimalität müssen wir
ja nur zeigen, dass eine dichte Potenzialfunktion existiert. Das heißt,
in einem Szenario wie diesem haben wir immer zwei Möglichkeiten,
dass die eine Möglichkeit ist, wir ändern das Matching,
das haben wir jetzt hier gemacht, die andere Möglichkeit ist natürlich auch,
wir ändern die Potenzialfunktion.
Und das ist wieder genauso wie bei den Flüssen.
Da ist es auch so, wenn wir einen Fluss sehen und
einen Schnitt sehen und die sind nicht gleich, dann haben wir zwei Möglichkeiten.
Entweder wir erhöhen den Fluss oder wir wählen einen anderen Schnitt.
Ja, hier ist es genauso. Entweder wir ändern das
Matching oder wir ändern die Potenzialfunktion. Und wenn die beiden übereinstimmen,
Ja, wenn die beiden übereinstimmen, zwei, drei,
vier, fünf, sechs, sieben, acht,
ja, die Summe der Potenzialwerte entspricht dem Matching,
dann wissen wir, dass wir das Optimum gefunden haben.
Okay, das ist das Optimalitätskriterium. Und jetzt brauchen wir
den Algorithmus, ja, die ungarische Methode.
Okay, wie gehen wir vor? Wir machen das jetzt
wie folgt. Hier ist jetzt eine Strategie,
die ist anders als beim, als bei den Flüssen.
Und zwar nehmen wir die Menge A und wir werden jetzt
schrittweise unseren Graphen größern. Wir beginnen mit einem ganz kleinen Graphen
und werden dann für den kleinen Graphen erstmal das Matching-Problem lösen.
Und dann werden wir nach und nach Knoten dazufügen. Und zwar,
was wir machen ist, wir haben also die eigentliche Eingabe,
also hier haben wir die Knotenmenge A und hier hätten wir
die Knotenmenge B. Hier haben wir irgendwie diese Kanten,
die dazwischen verlaufen.
So, und irgendwie. Ja, und Was wir jetzt machen,
ist, wir sagen, wir nehmen mal aus der,
wir verändern jetzt den Grafen.
Und zwar reduzieren wir die Knotenmenge A. Wir machen die kleiner.
Wir sagen nämlich jetzt, wir nehmen nur noch einen Knoten aus A.
Das andere Laschen lassen wir einfach mal weg.
Das lassen wir mal weg. So, dann bleibt nur
der eine Knoten über. Und wenn wir das,
der eine Knoten bleibt über, dann sieht der Grab plötzlich so aus.
Ja. Und ich glaube, hier ist es einfach,
das maximale Matching zu berechnen, ja.
Also es ist immer gut, auf einen trivialen Fall
zu gehen am Anfang
Dann hat man schon mal ein erstes Erfolgserlebnis. Also hier
ist es einfach, so maximale Mädchen können wir übernehmen.
Selbst wenn das jetzt ein Knoten wäre, der mehrere Kanten hat,
wäre das auch einfach, weil sie wissen ja,
dass sie von diesen Kanten nur eine Kante wählen können,
weil die ja alle an diesem einen Knoten hier A1 anfangen.
Da brauchen sie dann also nur den nehmen, der das maximale Gewicht hat.
So, und was machen wir dann? Dann haben wir
ja das maximale Matching berechnet und die ungarische Methode hat jetzt
die Technik, dass sie nach und nach Knoten hinzufügt.
Die berechnet das maximale Matching auf der Menge und dann kommt
der Knoten A2 dazu, der hat dann wieder
ein paar Kanten
Und wir berechnen als nächstes,
ausgehend von den maximalen Matching, was wir schon haben,
das maximale Matching mit A1 und A2. Und dann kommt A3 dazu,
A4, so lange, bis wir die komplette Menge A haben.
Das heißt, das Entscheidende wird ein Schritt sein,
wie wir ein maximales Matching für eine Teilmenge der Knoten A,
um einen weiteren Knoten vergrößern können.
Und dann wieder ein korrektes maximales Matching bekommen.
Gut, also, das ist unsere Eingabe.
Die Knotenmenge ist eben in A und B aufgeteilt und
für die eine Seite haben wir jetzt die Knoten durchnummeriert,
A1 bis AN
Und was wir machen, ist,
wir sagen ganz am Anfang, besteht die Knotenmenge nur aus B.
Das ist der noch trivialere Fall. Da haben wir nämlich
das maximale Matching, was keine Kante hat.
Wir berechnen eine initiale, dichte Potenzialfunktion.
Das ist auch ganz einfach für den Fall. Und ein
maximales gewichtetes Matching ist auch ganz einfach für den Fall.
Dann haben wir die Vorschleife hier für alle Knoten aus der Menge A.
Er vergrößern wir die Knotenmenge jetzt um diesen einen Knoten.
Da kommt jetzt der eine Knoten, kommt jetzt dazu.
Und dann berechnen wir eine neue,
dichte Potenzialfunktion und ein neues,
maximales Gemäck
Gewichtetes Matching, auf der Basis von dem vorherigen Matching und der vorherigen Potenzialfunktion.
Ja, und dann passen wir die Werte an und dann nehmen wir den nächsten Knoten dazu.
Und wenn wir dann fertig sind und alle Knoten hinzugenommen haben,
haben wir das maximale gewichtete Bi-Partite Matching gefunden. Wir können dem Algorithmus direkt sehen,
dass er korrekt ist, wenn er alle Schritte korrekt ausführt,
denn weil wir in jedem Schritt,
also nach jeder Runde hier, immer beides berechnen,
das maximale gewichtete Matching und die dichte Potenzialfunktion, wissen wir,
das ist der Algorithmus optimale, das optimale,
gewichtete Matching zurückgebt.
Das folgt direkt daraus, dass wir beides haben. Wir müssen nur nachweisen,
dass diese Potenzialfunktion eben die Eigenschaften erfüllt und dicht ist.
Das müssen wir noch zeigen dann immer. Aber wenn dem so ist,
wenn wir also immer eine dichte Potenzialfunktion und das Matching haben,
dann ist alles gut, dann wissen wir auch,
dass der Algorithmus korrekt ist und das maximale Matching berechnet.
Okay, wir beginnen mit der initialen Potenzialfunktion.
Das habe ich jetzt gerade eigentlich schon vorweggenommen.
Das ist der ganz einfache Teil. Also wenn ich gar
keine Knoten habe, dann mache ich das wie folgt.
Ich setze das Matching auf die leere Menge.
Ich setze den IP-Wert für alle Knoten auf null,
weil alle Knoten sind dann ja freie Knoten und dann ist
diese Potenzialfunktion P0 offensichtlich nicht negativ und dicht.
Mit einem Knoten ist es auch ganz einfach,
da haben wir also einen Knoten,
der jetzt in der Menge drin ist,
A1 und wir betrachten jetzt die Kante E von A1 zu irgendeinem Knoten auf dieser Seite mit maximalen Kosten.
Wir sagen dann,
das Matching besteht aus diesem Knoten E und die Potenzialwerte hier sind so,
dass dass der Potenzialwert für den Knoten A1,
gerade die kompletten Kosten sind und alle anderen null.
Also wenn wir jetzt das hier jetzt entschieden hätten, das kriege ich jetzt nicht hin.
Also wir haben jetzt diese drei Kanten hatten wir hier.
Das ist A1 und jetzt mal angenommen der hier,
das ist die Kante mit maximalem Gewicht. So,
dann würden wir die in das Matching reinnehmen und wir würden
dann die Kosten aufteilen und würden sagen, okay, der Knoten A1,
der kriegt dann hier die sechs Einheiten und die haben eh alle noch null.
Da ist überall null. Und dann sehen wir sofort,
das ist dicht. Also, denn das war ja das Maximum,
das heißt sechs plus null ist dann immer größer als das Kantengewicht.
Das ist die eine Eigenschaft, die freien Kanten,
Knoten haben alle null und die gematchen kannten.
Das war ja dann nur diese hier, diese eine.
Hier, die ist gerade dicht, weil sechs plus null entspricht sechs.
Und jetzt können wir auch gleich den kleinen Plausibilitätstest machen. Wir könnten sagen,
was wäre denn gewesen, wenn wir nicht die Kante genommen hätten,
mit dem maximalen Kantengewicht, zum Beispiel diese hier,
ja, hätten wir die genommen,
dann hätten wir an diesen Knoten nicht sechs dran geschrieben,
sondern drei, ja, und dann hätten wir gesehen,
die Potenzialfunktion ist nicht korrekt,
weil für diese Kante hier würde das jetzt alles nicht hinkommen.
Für diese Kante hätten wir jetzt den Wert sechs und die ist ja,
und dann wäre eben drei plus null, wäre eben kleiner als sechs.
Klar, können Sie sagen, okay, kein Problem,
schreibe ich dann hier eine drei hin,
aber dann merken Sie,
dass es auch nicht geht
Weil die Funktion dann nicht dicht ist,
weil sie die Eigenschaft verletzt, welche Eigenschaft verletzt sie dann.
Ich verletze eine. Können Sie gleich noch mal überlegen.
Nee, das müssen wir jetzt rausfinden, oder?
Das wäre ja total blöd. Also, wir machen Folgendes
. Die Idee war zu sagen, diese Kante wird gematcht
Wir schreiben da eine drei hin und schreiben hier
auch mit drei hin. Wäre die Idee,
die Kante hat Gewicht sechs und in dem Augenblick ist so,
das ist ja ein freier Pupen, das ist ja nicht komplett.
Ach genau, genau, das ist der Grund, danke.
Genau, dieser Knoten ist frei und der hätte jetzt Gewichtsgröße einholt,
genau, deswegen geht es natürlich nicht
Also das ist, dass die Eigenschaft, die verletzt ist.
Ja, wenn man da vorne steht, ist man manchmal ein bisschen...
Okay, gut, alles klar. So,
hier unten ist das Beispiel von eben,
ist ein bisschen schöner als das, was ich jetzt aufgemalt habe,
so sehe ich das entsprechend aus.
Ja? So, der offensichtlich schwierige Schritt ist,
das Matching, was wir einmal berechnet haben von P,
von dem Zustand i-1 zum Zustand i zu erweitern.
Das ist der kritische Schritt. Der ist kompliziert,
da muss man überlegen,
wie das genau geht
So, was machen wir? Wir haben also jetzt
ein Matching und die Potenzialfunktion zum Zeitpunkt I minus eins.
Und jetzt male ich mal wieder das Richtige dahin.
Da steht dann die Null. Hier steht dann die,
hier steht dann die Sechs. Das war der Zustand,
den wir hatten. Nicht diese Kante ist gematcht, sondern diese hier.
Das ist die gematchte Kante. Das war der Zustand.
So, jetzt kommt der Knoten A2 dazu.
Und der hat natürlich jetzt weitere Kanten,
die irgendwie so lang geht
So, das erste, was wir machen, ist,
wir übertragen die Informationen, die wir vorher hatten,
auf den neuen Grafen, indem wir jetzt sagen,
okay, also die Knotenmenge wird erweitert um einen Knoten-U,
das ist jetzt der Knoten-A2 hier, der heißt SU.
Das Matching übernehmen wir erstmal so, das heißt,
nur diese Kante hier ist gematched.
Wir kopieren für alle Knoten die vorherigen Potenzialwerte.
Wir lassen das alles so, wie es ist.
Und wir schreiben an dem Knoten-U hier auch einen Potenzialwert null dran.
Ja, und danach gehen wir über die Attazenzliste,
Der hat ja hier im Verkannten, die haben vielleicht hier,
keine Ahnung, zwei, vier.
Irgendwelche Werte. Und wir setzen das P von U auf das Maximum,
was wir haben, wenn wir die Kosten der Kante nehmen,
Minus, die entsprechende Potenzial auf der einsprechenden anderen Seite.
Und in diesem Fall würden wir also hier das Maximum von den beiden nehmen.
Und hier würde dann am Ende der Potenzial, der hat vier stehen.
Da kommt von dem von der Kante. Wenn dieser Knoten
jetzt hier gematcht wäre und hier würde ein Potenzialwert stehen,
dann würden wir einen entsprechenden kleineren Wert hier hinschreiben
So, wenn wir das machen, dann haben wir schon mal eine Ausgangssituation.
Und die Frage ist, was gilt für diese Ausgangssituation?
Und wir sehen erstens, die reduzierten Kosten sind alle nicht negativ.
Dafür haben wir gesorgt, weil vorher waren sie alle nicht
negativ und nur dieser Knoten mit seinen Kanten ist ja dazugekommen.
Und wir haben ja gerade diese Kosten so hoch gedreht,
dass die reduzierten Kosten immer größer gleich null sind.
Dann sehen wir die Kanten des Matchings in dicht.
Warum? Naja, wir haben ja keine,
das Matching hatten wir ja vorher schon auf dem vorigen Graf
und da war das ja auch dicht
Deswegen bleibt das natürlich dicht. Der Knoten-U ist also frei,
der wird ja an dem Matching, ist der ja nicht beteiligt.
Die Potenziale sind alle nicht negativ, das ist auch okay,
weil wir haben ja nur hier einen neuen Potenzialwert dazu geschrieben und der ist größer gleich null.
Die einzige Eigenschaft, die verletzt ist, ist,
die Eigenschaft freie Knoten sind dicht,
weil der neue Knoten A2 ist ein freier Knoten,
der ist ja nicht im Matching beteiligt und dem haben wir einen Potenzialwert gegeben,
der größer ist als null.
Das Gute ist, es ist nur dieser eine Knoten,
uh, der die Eigenschaft verletzt, nur der Knoten-U hat die Eigenschaft,
dass er frei ist und der Potenzialwert größer als null kann.
Könnte auch null sein, aber in der Regel ist er
größer als nur. Ja, für alle anderen freien Knoten,
die waren ja vorher auch schon in dem Graphen drin und
dementsprechend hat sich daran nichts geändert, dass die Potenzialwerte null sein müssen.
Das heißt, wir haben jetzt den Zustand,
dass wir ein Matching haben und eine Potenzialfunktion,
die nur an einer Stelle verletzt ist und zwar hier an diesem einen hinzugefügten Knoten ist die Situation so,
dass der Potenzialwert potenziell größer ist als null,
obwohl es ein freier Knoten ist.
Und jetzt, das müssen wir reparieren. Und wenn wir
das hingekriegt haben, dann haben wir ein neues maximales Matching gefunden.
Okay, das werden wir aber jetzt nicht mehr reparieren,
weil jetzt ist Viertel vor zwölf, sondern dann nächste Woche.
Gut, das war es dann für heute