Cours GRF du jour

This commit is contained in:
Némunaire 2012-06-11 11:31:46 +02:00
parent 07894cfb0e
commit 91dd3a3e87

View File

@ -1124,115 +1124,176 @@ X=\bordermatrix{~ & 1 & 2 & 3 & 4 & 5 & 6 & ~\cr
& {\color{yellow}14} & {\color{yellow}5} & {\color{yellow}73}\cr} & {\color{yellow}14} & {\color{yellow}5} & {\color{yellow}73}\cr}
\] \]
%cours du 5/06 %cours du 5/06 et du 11/06
\section{Problèmes de flot maximal} \section{Problèmes de flot maximal}
Applications de 2 sortes :
-> type réseau (de communication, routier, fluvial)
Comment faire passer les éléments pour acheminer le débit maximun tout en
respectant toutes les contraintes de capacité ?
%ici faire petit dessin :)
-> type affectation -> exemple : graphe biparti
%ici faire petit dessin :)
employés :
-couplage de cardinal maximun (employé, tâche)
(1, b) -> coupable de cardinal 1
(1, a)
(2, b) cardinal 2
Définitions : Il existe 2 types d'applications~:
Un réseau de transport est un graphe sans boucle qui comporte une entrée ou une \begin{itemize}
source et une sortie ou puits. \item type réseau (de communication, routier, fluvial)~: comment faire
%graphe ici passer les éléments pour acheminer le débit maximun tout en
-Chaque arc u est doté d'une capacité c(u) respectant toutes les contraintes de capacité~?
On s'intéresse à une fonction, appelée le flot. On associe à chaque arc une \item type affectation, par exemple un graphe biparti.
fonction f(u) = flux transitant dans l'arc u. \end{itemize}
$flot = \{\ flux\ \}_\text{tous les arcs}$
f(u): inconnue
c(u): donnée
-Le flot doit respecter 2 types de contraintes :
(1) $\forall{u}: 0=<f(u)<=c(u)$
(2) $\forall$ le noeud x dans le réseau, loi de kirshoff.
[si f(u)=c(u), on dit que l'arc u est saturé]
\paragraph{Définition} Un \emph{réseau de transport} est un graphe
orienté sans boucle qui comporte une entrée (ou une source $s$) et une
sortie (ou puits $p$).\\
$$\sum\text{flux entrants}=\sum\text{flux sortants}$$ $\forall$ le noeud x Chaque arc $u$ est doté d'une capacité $c(u)\geq 0$, représenté $[]$
-Tout flot qui respect dans le réseau les contraintes de type (1) et (2) est
dit valide:
exemple : flot nul.
val(f) se définit de 3 manières différentes.
(1) Valeur à la source [hypothès: pas de flux entrants dans s]
$$val(f)=\sum\text{flux des arcs issues de s}$$
= Chaque arc u est doté d'une capacité c(u)
(2) Valeur au puits p [pas de flux sortants de p]
$$val(f)=\sum\text{flux des arcs entrants dans p}$$
(3) Valeur au niveau d'une coupe $$(S, \bar{S})$$ séparant la source du puits.
S=ensemble de sommets du réseau qui contient
obligatoirement s et qui ne contient pas p.
$$\bar{S} = \text{ensemble de sonnets complémentaires}$$.
$$val(f)=(\sum{f(S,\bar{S})}) - (\sum{f(\bar(S), S)})$$
$\sum{f(S,\bar{S})}$ : somme des flux des ars ayant leur origine dans S
et leur extrémité dans $$\bar{S}$$
$\sum{f(\bar(S), S)}$ : somme des flux des arcs ayant leur origine dans
$$\bar{S}$$ et leur extrémité dans S
Propriété : $\forall$ la coupe $$(S, \bar{S})$$ considérée, la valeur du flot
mesurée au niveau de cette coupe est la même : c'est val(f)
-Capacité d'une coupe $$(S,\bar{S})$$ On s'intéresse à une fonction, appelée le flot.\\
$c(S,\bar{S}) = \sum{c(u)}_{arcs allant de S vers \bar{S}}$
Propriétés (admises) :
[1] $\forall$ la coupe $$(S,\bar{S})$$ considérée, la valeur du flot mesurée
au niveau de cette coupe est la même
[2] Soit f un flot $\forall$ établi dans un réseau de transport
(1) $$val(f) =< c(S,\bar{S})$$, $\forall$ la coupe $$(S,\bar{S})$$ considérée
(2) Si on trouve un flot f et une coupe $$(S,\bar{S})$$ tels que :
$$val(f) = c(S,\bar{S})$$, alors le flot est de valeur maximale
-> c'est le flot optimal
Théoreme de la coupe et du flot : On associe à chaque arc une fonction $f(u)=\text{flux transitant dans
Flot de valeur maximum $$\equiv$$ coupe de capacité minimal l'arc} u$. $flot=\text{flux}_\text{tous les arcs}$ $f(u)$~:
(3) Lorsque le flot maximal (et la coupe de $$(S,\bar{S})$$ capacité minimale) : inconnue $c(u)$~: donnée. C'est ce que l'on appel un \emph{flot}.
{ Pour tout arc de $$(S,\bar{S})$$, il est saturé: $$f(u)=c(u)$$
{ Pour tout arc de $$(\bar{S},S)$$, il est de flux nul: $$f(u) = 0$$
Détermination du flot maximal; algorithme de FORD-FULKERSON Celui-ci doit respecter 2 types de contraintes~:
-On suppose établi un certain flot dans le réseau de transport (peut être \begin{enumerate}
un flôt de bonne qualité déterminé empiriquement, ou alors peut être le \item $\forall{u} : 0\leq f(u) \leq c(u)$
flot nul) \item $\forall\text{ noeud }x$ dans le réseau, la loi de
-On cherche s'il existe dans le réseau une chaîne augmentante: Kirshoff est vérifiée. (si $f(u)=c(u)$, on dit que l'arc $u$ est saturé).
-> si oui, alors on exploite cette chaine => nouveau flot de valeur supérieur \end{enumerate}
-> si non, alors le flot considéré est optimal.
-Chaîne augmentante : chaîne reliant s à p: $$\sum\text{flux entrants}=\sum\text{flux sortants}$$
%ici schema
-Cette chaîne est dite augmentante si et seulement si il existe un nombre Un flot est valide si et seulement si, il respecte les deux conditions
positif $\alpha$ que l'on peut ajouter au flux de tous les arcs à l'endroit ci-dessous. exemple~: le flot nul.
(sans aller au delà de leur saturation) et retrancher de tous les arcs à
l'envers (sans aller en-dessous du flux nul) \paragraph{Définition} une \emph{coupe} sépare la source du puits.
-Exploiter une chaine augmentante, c'est rechercher le $\alpha$ maximum.
On appel $S$ l'ensemble de sommets incluant obligatoirement $s$ et excluant
obligatoirement $p$.
$\bar{S}$ est l'ensemble de sommets complémentaires.
$(S,\bar{S})$ est une coupe séparant la source du puits.\\
\paragraph{Propriété} $\forall$ coupe $(S, \bar{S})$ considérée, la valeur
du flot mesurée au niveau de cette coupe est la même~: c'est $val(f)$
\paragraph{Définition} La capacité d'une coupe se définit par~:
$$c(S,\bar{S}) = \sum{c(u)}_{arcs allant de S vers \bar{S}}$$
La valeur d'un flot ($val(f)$) se définit de 3 manières différentes~:
\begin{enumerate}
\item Valeur à la source (hypothèse~: pas de flux entrants dans $s$)
$$val(f)=\sum_{\text{arcs issus de }s}f(u)$$
\item Valeur au puits $p$ (pas de flux sortants de $p$)
$$val(f)=\sum_{\text{flux des arcs entrants dans }p}f(u)$$
\item Valeur au niveau d'une coupe $(S, \bar{S})$ quelconque.
$$val(f)=\sum_{\text{arcs allant de }S\text{ vers }\bar{S}}f(u)
\sum_{\text{arcs allant de }\bar{S}\text{ vers }S}f(u)$$
\end{enumerate}
\paragraph{Résultats théoriques}
\begin{enumerate}
\item $\forall$ coupe $(S,\bar{S})$ considérée, la valeur du flot mesurée au
niveau de cette coupe est la même~;
\item $\forall\text{ flot }f$ et $\forall\text{ coupe }(S, \bar{S})$, établi dans un réseau de
transport~: $Val(f)\leq c(S,\bar{S})$.\\
Si on trouve un flot $f$ et une coupe $(S,\bar{S})$ tels que~: $Val(f) =
c(S,\bar{S})$, alors le flot est de valeur maximale, c'est le flot optimal
\end{enumerate}
\subsection{Théorème du float maximal}
Le flot de valeur maximum est identique à la coupe de capacité minimale.
La coupe $(S,\bar{S})$ de capacité minimale respecte les propriétés suivantes~:
\begin{itemize}
\item Tout arc $u$ allant de $S$ vers $\bar{S}$ dont $f(u)=c(u)$ est dit saturé.
\item Tout arc $u$ allant de $\bar{S}$ vers $S$ est de flux nul ($f(u)=0$).
\end{itemize}
Lorsque le flot est maximal (et que la coupe de $(S,\bar{S})$ est de capacité
minimale)~: { Pour tout arc de $(S,\bar{S})$, il est saturé: $f(u)=c(u)$ { Pour
tout arc de $(\bar{S},S)$, il est de flux nul~: $f(u) = 0$
\subsection{Algorithme de Ford-Fulkerson}
Cet algorithme a pour but de déterminer le flot optimal dans un réseau de
transport donné.
\begin{itemize}
\item On part d'un flot initial établi dans le réseau (soit un flot établi à
la main, soit un flot nul)~;
\item on cherche s'il existe dans le réseau une \emph{chaîne augmentante}~
reliant $s$ à $p$~:
\begin{tikzpicture}[>=stealth',shorten >=1pt,auto,node distance=2.5cm,
thick,main node/.style={circle,fill=blue!20,draw,font=\sffamily\Large\bfseries}]
\node[main node] (1) {$s$};
\node[main node] (2) [right of=1] {};
\node[main node] (3) [right of=2] {};
\node[main node] (4) [right of=3] {};
\node[main node] (5) [right of=4] {$p$};
\path[every node/.style={font=\sffamily\small}]
(1) edge [->, right] node[right] {$[6]$ 2} (2)
(3) edge [->, right] node[right] {$[3]$ 3} (2)
(3) edge [->, right] node[right] {$[12]$ 5} (4)
(4) edge [->, right] node[right] {$[7]$ 1} (5)
;
\end{tikzpicture}
\item Cette chaîne est dite \emph{augmentante} si et seulement s'il existe un
nombre positif $\alpha$ que l'on peut ajouter au flux de tous les arcs à
l'endroit (sans aller au delà de leur saturation) et retrancher de tous les
arcs à l'envers (sans aller en-dessous du flux nul). Ici~:
$\alpha_{\max}=3$ et $\alpha_{\min}=\left(\min\left(c(u)-f(u)\right);\min
f(u)\text{ des arcs à l'envers}\right)$
\item Exploiter une chaine augmentante, c'est rechercher le $\alpha$ maximum.
$$\alpha = [Min(c(u)-f(u)); Min f(u)]$$ $$\alpha = [Min(c(u)-f(u)); Min f(u)]$$
Algo de Ford-Fullkerson \end{itemize}
(1) Faire passer un flot au pigé
(2) Améliorer ce flot pour le rendre complet -> tout chemin de s à p comporte
au moins 1 arc saturé.
(3) * marquer l'entrée du réseau \subsubsection{Principe de l'algorithme de Ford-Fullkerson}
* marquer l'extrémité terminale J de tout arc (I,J) non saturé dont \begin{itemize}
l'extrémité initiale est déjà marquée \item On part d'un flot initial~;
* marquer l'extrémité initiale K de tout arc (K,L) de flux non nul dont \item On cherche s'il existe une chaîne augmentante reliant $s$ à $p$.\\
l'extrémité terminale L est déjà marquée. Si oui~: on exploite cette chaîne, on augmente $\alpha$ de la valeur du
flot et on recommence cette étape.\\
Si non~: on a atteint le flot optimal.
\end{itemize}
Ces deux phaes de marquage avant et en arriere sont alternées jusqu'au blocage \subsubsection{Recherche d'une chaîne augmentante dans le réseau}
-> 2 cas de figure : Procédure de marquage des sommets.
(a) on a pu marquer p -> alors il existe une chaîne augmentante identifiée à \begin{itemize}
l'aide des marques. On explicite cette chaîne (recherche du $\alpha$) \item marquer (on note $+$ à côté du sommet) l'entrée du réseau~;
=> augmentationn de $\alpha$ de la valeur du flot \item \textbf{marquage en avant~:} marquer ($+I$ à côté du sommet $J$)
(b) on n'a pas pu marquer p => il n'existe pas de chaîne augmentante reliant l'extrémité terminale $J$ de tout arc $(I,J)$ non saturé et dont
s à p : le flot considéré est optimal. l'extrémité initiale est déjà marquée~;
Remarque : à l'issue de l'étape p, la coupe $$(S,\bar{S})$$ où S = liste des \item \textbf{marquage en arrière~:} marquer ($-L$ à côté du sommet $J$)
sommets marqués est la coupe de capacité minimale. l'extrémité initiale $K$ de tout arc $(K,L)$ de flux non nul dont
l'extrémité terminale $L$ est déjà marquée.
\end{itemize}
Application (polycop. p103) Ces deux phaes de marquage avant et en arriere sont alternées jusqu'au blocage.
-2 ports A et B -> quantités 10 et 10
-marchandises demadée dans 3 ports C, D et E selon les quantités 9, 12 et 7 Si au moment du blocage, on constate que l'on a pu marqué $p$, cela signifie
que le flot considéré n'est pas encore optimal. On se sert alors des marques
pour identifier les différents sommets constituant la chaîne augmentante.
Si au moment du blocage, on constate que l'on a pas pu marqué $p$, dans ce cas
le flot considéré est optimal.
\paragraph{Remarque} Si l'on considère la dernière itération de marquage
réalisé (où l'on n'a pas pu marqué $p$), on a la coupe $(S,\bar{S})$ de
capacité minimale où $S$ est constitué de la liste des sommets marqués.
On véfifie que la valeur de cette capacité est égale à la valeur du flot
obtenu~: le flot maximal = la coupe de capacité minimale.
\paragraph{Remarque} Pour diminuer le nombre d'itération de l'algorithme de
Ford-Fullkerson, on s'efforce généralement de partir d'un \emph{flot initial
complet} (tout chemin de $s$ à $p$ comporte au moins un arc saturé).
\paragraph{Attention} Ne pas confondre les problèmes de flot optimal avec les
problèmes de plans de transport de coût minimal.
\subsection{Application (poly. p103)}
\begin{itemize}
\item 2 ports $A$ et $B$~: quantités 10 et 10~;
\item marchandises demandée dans 3 ports $C$, $D$ et $E$ selon les quantités
9, 12 et 7.
\end{itemize}
\begin{figure}[h] \begin{figure}[h]
\centering \centering
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.5cm, \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.5cm,
@ -1254,45 +1315,113 @@ Application (polycop. p103)
\end{tikzpicture} \end{tikzpicture}
\end{figure} \end{figure}
(1) Peut-on satisfaire toutes les demandes ? Non. \begin{enumerate}
offre totale = $10+10=20$ \item Peut-on satisfaire toutes les demandes~?\\
demande totale = $9+12+7=28$ Non, car l'offre est inférieure à la demande~:\\
offre totale = $10+10=20$~; demande totale = $9+12+7=28$
\item Comment organiser les expéditions de façon à louer un maximun
de marchandise~?
\end{enumerate}
(2) Comment organiser les expéditions de façon à louer un maximun \begin{itemize}
de marchandise ? \item transformer ce problème en un problème de recherche du flot maximal dans
un réseau de transport~;
-transformer ce problème en un problème de recherche du flot maximal dans \item résoudre par l'algo de Ford-Fulkerson~;
un réseau de transport. \item \textbf{initialisation~:} on s'efforce de démarrer l'algo à partir d'un
-résoudre par l'algo de Ford-Fulkerson flot complet (tout chemin de $s$ à $p$ comporte au moins 1 arc saturé)~:
-Initialisation -> on s'efforce de démarrer l'algo à partir d'un flot complet \begin{itemize}
(tout chemin de s à p comporte au moins 1 arc saturé : \item flux 7 de $A$ vers $C$~;
* flux 7 de A vers C \item flux 9 de $C$ vers $p$~;
* flux 9 de C vers p \item Kirschoff au noeud $C$~: flux 2 de $B$ vers $C$ (OK car < capacité
* Kirschoff au noeud C => flux 2 de B vers C (OK car < capacité de 5) de 5)~;
* flux 10 de s vers A \item flux 10 de $s$ vers $A$~;
* Kirschoff en A => flux 3 de A vers D (OK car < capacité de 4) \item Kirschoff en $A$~: flux 3 de $A$ vers $D$ (OK car < capacité de
* Kirschoff en D => flux 3 de D vers p (OK car < capacité de 12) 4)~;
* on sature B-E \item Kirschoff en $D$~: flux 3 de $D$ vers $p$ (OK car < capacité de
* Kirschoff au moeud E => flux de 5 sur E-p (OK car < capacité de 7) 12)~;
* Kirshchoff au noeud B => flux de 7 sur s-B (OK car < capacité de 10) \item on sature $B-E$~;
\item Kirschoff au n\oe ud $E$~: flux de 5 sur $E-p$ (OK car < capacité
de 7)~;
\item Kirshchoff au noeud $B$~: flux de 7 sur $s-B$ (OK car < capacité de
10).
\end{itemize}
\end{itemize}
On a un flot complet de valeur 17. On a un flot complet de valeur 17.
On a pu marquer p => le flot considéré n'est pas optimal : On a pu marquer $p$~: le flot considéré n'est pas optimal :
%faire un graphe avec ça : s ->[10](7) B ->[5](2) C <-[7](7) A ->[4](3) D ->[12](3) p %faire un graphe avec ça : s ->[10](7) B ->[5](2) C <-[7](7) A ->[4](3) D ->[12](3) p
%devient 8, 3, 6, 4, 4 %devient 8, 3, 6, 4, 4
$\alpha=1$ -> flot: de 17 à 18. \begin{figure}[h]
-Le nouveau flot est encore complet. \centering
-Le nouveau flot est de valeur 18 ($10 + 8$ ou $9 + 4 + 5$) \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.5cm,
2e itération -> on ne peut pas marquer p => le flot optimal est de valeur 18 thick,main node/.style={circle,fill=blue!20,draw,font=\sffamily\Large\bfseries}]
-> La coupe où S = ensemble des sommets marqués en dernière itération \node[main node] (s) {$s$};
La capacité de la coupe $$(S,\bar{S})$$ est : \node[main node] (A) [right of=s]{$A$};
$c(C,p) + c(A,D) + c(B,E) = [9] + [4] + [5] = 18$ \node[main node] (B) [right of=A]{$B$};
\node[main node] (C) [right of=B]{$C$};
\node[main node] (D) [right of=C]{$D$};
\node[main node] (p) [right of=D]{$p$};
\path[every node/.style={font=\sffamily\small}]
(s) edge [right] node[right] {[10] 8} (A)
(A) edge [right] node[right] {[5] 3} (B)
(B) edge [right] node[right] {[7] 6} (C)
(C) edge [<-, right] node[right] {[4] 4} (D)
(D) edge [right] node[right] {[12] 4} (p)
;
\end{tikzpicture}
\end{figure}
Exploitation de la chaîne augmentente avec $\alpha$ : le flot passe de 17 à 18.
\begin{itemize}
\item Le nouveau flot est encore complet~;
\item le nouveau flot est de valeur 18 ($10 + 8$ ou $9 + 4 + 5$)~;
\end{itemize}
2\ieme itération~: on ne peut pas marquer $p$, donc le flot optimal est de
valeur 18.
La coupe où $S$ équivaut à l'ensemble des sommets marqués en dernière
itération.
La capacité de la coupe $(S,\bar{S})$ est~: $c(C,p) + c(A,D) + c(B,E) = [9] +
[4] + [5] = 18$
On a trouvé une coupe dont la capacité est alors à la valeur d'un flot. On a trouvé une coupe dont la capacité est alors à la valeur d'un flot.
-> C'est que le flot es de valeur maximum et la coupe est de la capacité mini
Remarque: tous les acs de $$(S,\bar{S})$$ sont saturés C'est que le flot de valeur maximum et la coupe est de la capacité minimal.
(tous les arcs de $$(\bar{S},S)$$ sont de flux nul)
\paragraph{Remarque} Tous les arcs de $(S,\bar{S})$ sont saturés (tous les
arcs de $(\bar{S},S)$ sont de flux nul)
%ici graphe et tableau exo %ici graphe et tableau exo
\begin{figure}[h]
\centering
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.5cm,
thick,main node/.style={circle,fill=blue!20,draw,font=\sffamily\Large\bfseries}]
\node[main node] (A) {$A$};
\node[main node] (s) [below left of=A]{$s$};
\node[main node] (B) [below right of=s]{$B$};
\node[main node] (C) [below right of=A]{$C$};
\node[main node] (D) [right of=A]{$D$};
\node[main node] (E) [right of=B]{$C$};
\node[main node] (p) [right of=C]{$p$};
Flot max de 4 (En partant du flot nul) \path[every node/.style={font=\sffamily\small}]
(s) edge [right] node[right] {[10] 10} (A)
(s) edge [right] node[right] {[10] 8} (B)
(A) edge [right] node[right] {[7] 6} (C)
(A) edge [right] node[right] {[4] 4} (D)
(B) edge [right] node[right] {[5] 3} (C)
(B) edge [right] node[right] {[5] 5} (E)
(C) edge [right] node[right] {[9] 9} (p)
(D) edge [right] node[right] {[12] 4} (p)
(E) edge [right] node[right] {[5] 7} (p)
;
\end{tikzpicture}
\end{figure}
Flot maximal de 4 (En partant du flot nul)