Parallel pats and maximum matching

This commit is contained in:
Antti H S Laaksonen 2017-01-10 23:34:36 +02:00
parent 99c1706277
commit c65bbed2f3
1 changed files with 145 additions and 145 deletions

View File

@ -554,15 +554,17 @@ as a cut in the graph.
Thus, the flow has to be a maximum flow, Thus, the flow has to be a maximum flow,
and the cut has to be a minimum cut. and the cut has to be a minimum cut.
\section{Rinnakkaiset polut} \section{Parallel paths}
Ensimmäisenä virtauslaskennan sovelluksena tarkastelemme As a first application for flows,
tehtävää, jossa tavoitteena on muodostaa mahdollisimman we consider a problem where the task is to
monta rinnakkaista polkua verkon alkusolmusta loppusolmuun. form as many parallel paths as possible
Vaatimuksena on, että jokainen verkon kaari esiintyy from the starting node of the graph
enintään yhdellä polulla. to the ending node.
It is required that no edge appears
in more than one path.
Esimerkiksi verkossa For example, in the graph
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
\node[draw, circle] (1) at (1,2) {$1$}; \node[draw, circle] (1) at (1,2) {$1$};
@ -582,10 +584,10 @@ Esimerkiksi verkossa
\path[draw,thick,->] (5) -- (6); \path[draw,thick,->] (5) -- (6);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
pystyy muodostamaan kaksi rinnakkaista polkua solmusta 1 solmuun 6. we can form two parallel paths from node 1 to node 6.
Tämä toteutuu valitsemalla polut This can be done by choosing paths
$1 \rightarrow 2 \rightarrow 4 \rightarrow 3 \rightarrow 6$ $1 \rightarrow 2 \rightarrow 4 \rightarrow 3 \rightarrow 6$
ja $1 \rightarrow 4 \rightarrow 5 \rightarrow 6$: and $1 \rightarrow 4 \rightarrow 5 \rightarrow 6$:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -616,20 +618,19 @@ ja $1 \rightarrow 4 \rightarrow 5 \rightarrow 6$:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Osoittautuu, että suurin rinnakkaisten polkujen määrä It turns out that the maximum number of parallel paths
on yhtä suuri kuin maksimivirtaus verkossa, equals the maximum flow in the graph when the weight
jossa jokaisen kaaren kapasiteetti on 1. of each edge is 1.
Kun maksimivirtaus on muodostettu, After the maximum flow has been constructed,
rinnakkaiset polut voi löytää the parallel paths can be found greedily by finding
ahneesti etsimällä alkusolmusta loppusolmuun paths from the starting node to the ending node.
kulkevia polkuja.
Tarkastellaan sitten tehtävän muunnelmaa, Let's then consider a variation for the problem
jossa jokainen solmu (alku- ja loppusolmua lukuun ottamatta) where each node (except for the starting and ending nodes)
saa esiintyä enintään yhdellä polulla. can appear in at most one path.
Tämän rajoituksen seurauksena äskeisessä verkossa After this restriction, we can construct only one path
voi muodostaa vain yhden polun, in the above graph, because node 4 can't appear
koska solmu 4 ei voi esiintyä monella polulla: in more than one path:
\begin{center} \begin{center}
\begin{tikzpicture} \begin{tikzpicture}
@ -656,14 +657,14 @@ koska solmu 4 ei voi esiintyä monella polulla:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tavallinen keino rajoittaa solmun kautta kulkevaa A standard way to restrict the flow through a node
virtausta on jakaa solmu tulosolmuksi ja lähtösolmuksi. is to divide the node into two parts.
Kaikki solmuun tulevat kaaret saapuvat tulosolmuun All incoming edges are connected to the first part,
ja kaikki solmusta lähtevät kaaret poistuvat lähtösolmusta. and all outgoing edges are connected to the second part.
Lisäksi tulosolmusta lähtösolmuun on kaari, In addition, there is an edge from the first part
jossa on haluttu kapasiteetti. to the second part.
Tässä tapauksessa verkosta tulee seuraava: In the current example, the graph becomes as follows:
\begin{center} \begin{center}
\begin{tikzpicture} \begin{tikzpicture}
\node[draw, circle] (1) at (1,2) {$1$}; \node[draw, circle] (1) at (1,2) {$1$};
@ -697,7 +698,7 @@ Tässä tapauksessa verkosta tulee seuraava:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tämän verkon maksimivirtaus on: The maximum flow for the graph is as follows:
\begin{center} \begin{center}
\begin{tikzpicture} \begin{tikzpicture}
\node[draw, circle] (1) at (1,2) {$1$}; \node[draw, circle] (1) at (1,2) {$1$};
@ -739,35 +740,35 @@ Tämän verkon maksimivirtaus on:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tämä tarkoittaa, että verkossa on mahdollista muodostaa This means that it is possible to form exactly
vain yksi polku alkusolmusta lähtösolmuun, one path from the starting node to the ending node
kun sama solmu ei saa esiintyä monessa polussa. when a node can't appear in more than one path.
\section{Maksimiparitus} \section{Maximum matching}
\index{paritus@paritus} \index{matching}
\index{maksimiparitus@maksimiparitus} \index{maximum matching}
\key{Maksimiparitus} on suurin mahdollinen joukko A \key{maximum matching} is the largest possible
verkon solmuista muodostettuja pareja, set of pairs of nodes in a graph
jolle pätee, such that there is an edge between each pair of nodes,
että jokaisen parin välillä on kaari verkossa and each node belongs to at most one pair.
ja jokainen solmu kuuluu enintään yhteen pariin.
Maksimiparituksen etsimiseen yleisessä There is a polynomial algorithm for finding
verkossa on olemassa polynominen algoritmi, a maximum matching in a general graph,
mutta se on hyvin monimutkainen. but it is very complex.
Tässä luvussa keskitymmekin tilanteeseen, For this reason, we will restrict ourselves to the
jossa verkko on kaksijakoinen. case where the graph is bipartite.
Tällöin maksimiparituksen pystyy etsimään In this case we can easily find the maximum matching
helposti virtauslaskennan avulla. using a maximum flow algorithm.
\subsubsection{Maksimiparituksen etsiminen} \subsubsection{Finding a maximum matching}
Kaksijakoinen verkko voidaan esittää niin, A bipartite graph can be always presented so
että se muodostuu vasemman ja oikean puolen that it consists of left-side and right-side nodes,
solmuista ja kaikki verkon kaaret kulkevat puolten välillä. and all edges in the graph go between
Tarkastellaan esimerkkinä seuraavaa verkkoa: left and right sides.
As an example, consider the following graph:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.60] \begin{tikzpicture}[scale=0.60]
@ -789,7 +790,7 @@ Tarkastellaan esimerkkinä seuraavaa verkkoa:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tässä verkossa maksimiparituksen koko on 3: In this graph, the size of a maximum matching is 3:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.60] \begin{tikzpicture}[scale=0.60]
\node[draw, circle] (1) at (2,4.5) {1}; \node[draw, circle] (1) at (2,4.5) {1};
@ -814,16 +815,16 @@ Tässä verkossa maksimiparituksen koko on 3:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Kaksijakoisen verkon maksimiparitus A maximum matching in a bipartite graph
vastaa maksimivirtausta verkossa, corresponds to a maximum flow in an extended graph
johon on lisätty alkusolmu ja loppusolmu. that contains a starting node,
Alkusolmusta on kaari jokaiseen vasemman an ending node and all the nodes of the original graph.
puolen solmuun, ja vastaavasti loppusolmuun There is an edge from the starting node to
on kaari jokaisesta oikean puolen solmusta. each left-side node, and an edge from
Jokaisen kaaren kapasiteettina on 1. each right-side node to the ending node.
The capacity of each edge is 1.
Esimerkissä tuloksena on seuraava verkko:
In the example graph, the result is as follows:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.60] \begin{tikzpicture}[scale=0.60]
\node[draw, circle] (1) at (2,4.5) {1}; \node[draw, circle] (1) at (2,4.5) {1};
@ -856,37 +857,36 @@ Esimerkissä tuloksena on seuraava verkko:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tämän verkon maksimivirtaus on yhtä suuri kuin The size of a maximum flow in this graph
alkuperäisen verkon maksimiparitus, equals the size of a maximum matching
koska virtaus muodostuu joukosta polkuja in the original graph,
alkusolmusta loppusolmuun ja jokainen because each path from the starting node
polku ottaa mukaan uuden kaaren paritukseen. to the ending node adds one edge to the matching.
Tässä tapauksessa maksimivirtaus on 3, In this graph, the maximum flow is 3,
joten maksimiparitus on myös 3. so the maximum matching is also 3.
\subsubsection{Hallin lause} \subsubsection{Hall's theorem}
\index{Hallin lause@Hallin lause} \index{Hall's theorem}
\index{txydellinen paritus@täydellinen paritus} \index{perfect matching}
\key{Hallin lause} antaa ehdon, milloin kaksijakoiseen \key{Hall's theorem} describes when a bipartite graph
verkkoon voidaan muodostaa paritus, has a matching that contains all nodes
joka sisältää kaikki toisen puolen solmut. in one side of the graph.
Jos kummallakin puolella on yhtä monta solmua, If both sides contain the same number of nodes,
Hallin lause kertoo, voidaanko muodostaa Hall's theorem tells us if it's possible to
\key{täydellinen paritus}, construct a \key{perfect matching} where
jossa kaikki solmut paritetaan keskenään. all nodes are paired with each other.
Oletetaan, että haluamme muodostaa parituksen, Assume that we want to construct a matching
johon kuuluvat kaikki vasemman puolen solmut. that contains all left-side nodes.
Olkoon $X$ jokin joukko vasemman puolen solmuja Let $X$ be a set of left-side nodes,
ja $f(X)$ näiden solmujen naapurien joukko. and let $f(X)$ be the set of their neighbors.
Hallin lauseen mukaan paritus on mahdollinen, According to Hall's theorem, a such matching exists
kun jokaiselle joukolle $X$ exactly when for each $X$, the condition $|X| \le |f(X)|$ holds.
pätee $|X| \le |f(X)|$.
Tarkastellaan Hallin lauseen merkitystä esimerkkiverkossa. Let's study Hall's theorem in the example graph.
Valitaan ensin $X=\{1,3\}$, jolloin $f(X)=\{5,6,8\}$: First, let $X=\{1,3\}$ and $f(X)=\{5,6,8\}$:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.60] \begin{tikzpicture}[scale=0.60]
@ -908,8 +908,9 @@ Valitaan ensin $X=\{1,3\}$, jolloin $f(X)=\{5,6,8\}$:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tämä täyttää Hallin lauseen ehdon, koska $|X|=2$ ja $|f(X)|=3$. The condition of Hall's theorem holds, because
Valitaan sitten $X=\{2,4\}$, jolloin $f(X)=\{7\}$: $|X|=2$ and $|f(X)|=3$.
Next, let $X=\{2,4\}$ and $f(X)=\{7\}$:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.60] \begin{tikzpicture}[scale=0.60]
@ -931,43 +932,44 @@ Valitaan sitten $X=\{2,4\}$, jolloin $f(X)=\{7\}$:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tässä tapauksessa $|X|=2$ ja $|f(X)|=1$, joten Hallin lauseen ehto In this case, $|X|=2$ and $|f(X)|=1$,
ei ole voimassa. so the condition of Hall's theorem doesn't hold.
Tämä tarkoittaa, että verkossa This means that it's not possible to form
ei ole mahdollista muodostaa täydellistä paritusta, a perfect matching in the graph.
johon kuuluvat kaikki vasemman puolen solmut. This result is not surprising, because we already
Tämä on myös odotettu tulos, koska verkon maksimiparitus on 3 eikä 4. knew that the maximum matching in the graph is 3 and not 4.
Jos Hallin lauseen ehto ei päde, osajoukko $X$ If the condition of Hall's theorem doesn't hold,
kertoo syyn sille, miksi paritusta ei voi muodostaa. the set $X$ provides an explanation why we can't form a matching.
Koska $X$ sisältää enemmän solmuja kuin $f(X)$, Since $X$ contains more nodes than $f(X)$,
kaikille $X$:n solmuille ei riitä paria oikealta. there is no pair for all nodes in $X$.
Esimerkiksi yllä molemmat solmut 2 ja 4 tulisi For example, in the above graph, both nodes 2 and 4
yhdistää solmuun 7, mutta tämä ei ole mahdollista. should be connected to node 7 which is not possible.
\subsubsection{Kőnigin lause} \subsubsection{Kőnig's theorem}
\index{Kőnigin lause} \index{Kőnig's theorem}
\index{solmupeite@solmupeite} \index{node cover}
\index{pienin solmupeite@pienin solmupeite} \index{minimum node cover}
\key{Kőnigin lause} tarjoaa tehokkaan \key{Kőnig's theorem} provides an efficient way
tavan muodostaa kaksijakoiselle verkolle to construct a \key{minimum node cover} for a
\key{pienin solmupeite} eli pienin sellainen bipartite graph.
solmujen joukko, että jokaisesta verkon kaaresta ainakin This is a minimum set of nodes such that
toinen päätesolmuista kuuluu joukkoon. each edge in the graph is connected to at least
one node in the set.
Yleisessä verkossa pienimmän solmupeitteen In a general graph, finding a minimum node cover
etsiminen on NP-vaikea ongelma. is a NP-hard problem.
Sen sijaan kaksijakoisessa verkossa However, in a bipartite graph,
Kőnigin lauseen nojalla maksimiparitus ja the size of
pienin solmupeite ovat aina yhtä suuria, a maximum matching and a minimum node cover
minkä ansiosta is always the same, according to Kőnig's theorem.
pienimmän solmupeitteen voi Thus, we can efficiently find a minimum node cover
etsiä tehokkaasti virtauslaskennan avulla. using a maximum flow algorithm.
Tarkastellaan taas seuraavaa verkkoa, Let's consider the following graph
jonka maksimiparituksen koko on 3: with a maximum matching of size 3:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.60] \begin{tikzpicture}[scale=0.60]
\node[draw, circle] (1) at (2,4.5) {1}; \node[draw, circle] (1) at (2,4.5) {1};
@ -991,9 +993,9 @@ jonka maksimiparituksen koko on 3:
\path[draw=red,thick,-,line width=2pt] (3) -- (6); \path[draw=red,thick,-,line width=2pt] (3) -- (6);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Kőnigin lauseen ansiosta tiedämme nyt, Using Kőnig's theorem, we know that the size
että myös pienimmän solmupeitteen koko on 3. of a minimum node cover is also 3.
Solmupeite voidaan muodostaa seuraavasti: It can be constructed as follows:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.60] \begin{tikzpicture}[scale=0.60]
@ -1014,27 +1016,25 @@ Solmupeite voidaan muodostaa seuraavasti:
\path[draw,thick,-] (4) -- (7); \path[draw,thick,-] (4) -- (7);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Pienin solmupeite muodostuu aina niin, For each edge in the maximum matching,
että jokaisesta maksimiparituksen kaaresta exactly one of its end nodes belongs to
toinen kaaren päätesolmuista kuuluu peitteeseen. the minimum node cover.
\index{riippumaton joukko@riippumaton joukko} \index{independent set}
\index{suurin riippumaton joukko@suurin riippumaton joukko} \index{maximum independent set}
Kun verkosta valitaan kaikki solmut, The set of all nodes that do \emph{not}
jotka \emph{eivät} kuulu pienimpään belong to a minimum node cover
solmupeitteeseen, syntyy is a \key{maximum independent set}.
\key{suurin riippumaton joukko}. This is the largest possible set of nodes
Tämä on suurin mahdollinen joukko solmuja, where there is no edge between any two nodes
jossa minkään kahden solmun in the graph.
välillä ei ole kaarta. Once again, finding a maximum independent
Pienimmän solmupeitteen tavoin set in a general graph is a NP-hard problem,
riippumattoman joukon muodostaminen on but in a bipartite graph we can use
NP-vaikea ongelma yleisessä verkossa, Kőnig's theorem to solve the problem efficiently.
mutta Kőnigin lauseen avulla In the example graph, the maximum independent
ongelma on mahdollista ratkaista set is as follows:
tehokkaasti kaksijakoisessa verkossa.
Esimerkkiverkossa suurin riippumaton joukko on seuraava:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.60] \begin{tikzpicture}[scale=0.60]