Cours GRF du jour

This commit is contained in:
Némunaire 2012-06-11 11:31:46 +02:00
parent 07894cfb0e
commit 91dd3a3e87
1 changed files with 259 additions and 130 deletions

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}
\]
%cours du 5/06
%cours du 5/06 et du 11/06
\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 :
Un réseau de transport est un graphe sans boucle qui comporte une entrée ou une
source et une sortie ou puits.
%graphe ici
-Chaque arc u est doté d'une capacité c(u)
On s'intéresse à une fonction, appelée le flot. On associe à chaque arc une
fonction f(u) = flux transitant dans l'arc u.
$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é]
Il existe 2 types d'applications~:
\begin{itemize}
\item 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é~?
\item type affectation, par exemple un graphe biparti.
\end{itemize}
\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
-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)
Chaque arc $u$ est doté d'une capacité $c(u)\geq 0$, représenté $[]$
-Capacité d'une coupe $$(S,\bar{S})$$
$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
On s'intéresse à une fonction, appelée le flot.\\
Théoreme de la coupe et du flot :
Flot de valeur maximum $$\equiv$$ coupe de capacité minimal
(3) Lorsque le flot maximal (et la coupe de $$(S,\bar{S})$$ 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$$
On associe à chaque arc une fonction $f(u)=\text{flux transitant dans
l'arc} u$. $flot=\text{flux}_\text{tous les arcs}$ $f(u)$~:
inconnue $c(u)$~: donnée. C'est ce que l'on appel un \emph{flot}.
Détermination du flot maximal; algorithme de FORD-FULKERSON
-On suppose établi un certain flot dans le réseau de transport (peut être
un flôt de bonne qualité déterminé empiriquement, ou alors peut être le
flot nul)
-On cherche s'il existe dans le réseau une chaîne augmentante:
-> si oui, alors on exploite cette chaine => nouveau flot de valeur supérieur
-> si non, alors le flot considéré est optimal.
-Chaîne augmentante : chaîne reliant s à p:
%ici schema
-Cette chaîne est dite augmentante si et seulement si 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)
-Exploiter une chaine augmentante, c'est rechercher le $\alpha$ maximum.
Celui-ci doit respecter 2 types de contraintes~:
\begin{enumerate}
\item $\forall{u} : 0\leq f(u) \leq c(u)$
\item $\forall\text{ noeud }x$ dans le réseau, la loi de
Kirshoff est vérifiée. (si $f(u)=c(u)$, on dit que l'arc $u$ est saturé).
\end{enumerate}
$$\sum\text{flux entrants}=\sum\text{flux sortants}$$
Un flot est valide si et seulement si, il respecte les deux conditions
ci-dessous. exemple~: le flot nul.
\paragraph{Définition} une \emph{coupe} sépare la source du puits.
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)]$$
Algo de Ford-Fullkerson
(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é.
\end{itemize}
(3) * marquer l'entrée du réseau
* marquer l'extrémité terminale J de tout arc (I,J) non saturé dont
l'extrémité initiale est déjà marquée
* marquer 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.
\subsubsection{Principe de l'algorithme de Ford-Fullkerson}
\begin{itemize}
\item On part d'un flot initial~;
\item On cherche s'il existe une chaîne augmentante reliant $s$ à $p$.\\
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
-> 2 cas de figure :
(a) on a pu marquer p -> alors il existe une chaîne augmentante identifiée à
l'aide des marques. On explicite cette chaîne (recherche du $\alpha$)
=> augmentationn de $\alpha$ de la valeur du flot
(b) on n'a pas pu marquer p => il n'existe pas de chaîne augmentante reliant
s à p : le flot considéré est optimal.
Remarque : à l'issue de l'étape p, la coupe $$(S,\bar{S})$$ où S = liste des
sommets marqués est la coupe de capacité minimale.
\subsubsection{Recherche d'une chaîne augmentante dans le réseau}
Procédure de marquage des sommets.
\begin{itemize}
\item marquer (on note $+$ à côté du sommet) l'entrée du réseau~;
\item \textbf{marquage en avant~:} marquer ($+I$ à côté du sommet $J$)
l'extrémité terminale $J$ de tout arc $(I,J)$ non saturé et dont
l'extrémité initiale est déjà marquée~;
\item \textbf{marquage en arrière~:} marquer ($-L$ à côté du sommet $J$)
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)
-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
Ces deux phaes de marquage avant et en arriere sont alternées jusqu'au blocage.
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]
\centering
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.5cm,
@ -1254,45 +1315,113 @@ Application (polycop. p103)
\end{tikzpicture}
\end{figure}
(1) Peut-on satisfaire toutes les demandes ? Non.
offre totale = $10+10=20$
demande totale = $9+12+7=28$
\begin{enumerate}
\item Peut-on satisfaire toutes les demandes~?\\
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
de marchandise ?
-transformer ce problème en un problème de recherche du flot maximal dans
un réseau de transport.
-résoudre par l'algo de Ford-Fulkerson
-Initialisation -> on s'efforce de démarrer l'algo à partir d'un flot complet
(tout chemin de s à p comporte au moins 1 arc saturé :
* flux 7 de A vers C
* flux 9 de C vers p
* Kirschoff au noeud C => flux 2 de B vers C (OK car < capacité de 5)
* flux 10 de s vers A
* Kirschoff en A => flux 3 de A vers D (OK car < capacité de 4)
* Kirschoff en D => flux 3 de D vers p (OK car < capacité de 12)
* on sature B-E
* Kirschoff au moeud E => flux de 5 sur E-p (OK car < capacité de 7)
* Kirshchoff au noeud B => flux de 7 sur s-B (OK car < capacité de 10)
\begin{itemize}
\item transformer ce problème en un problème de recherche du flot maximal dans
un réseau de transport~;
\item résoudre par l'algo de Ford-Fulkerson~;
\item \textbf{initialisation~:} on s'efforce de démarrer l'algo à partir d'un
flot complet (tout chemin de $s$ à $p$ comporte au moins 1 arc saturé)~:
\begin{itemize}
\item flux 7 de $A$ vers $C$~;
\item flux 9 de $C$ vers $p$~;
\item Kirschoff au noeud $C$~: flux 2 de $B$ vers $C$ (OK car < capacité
de 5)~;
\item flux 10 de $s$ vers $A$~;
\item Kirschoff en $A$~: flux 3 de $A$ vers $D$ (OK car < capacité de
4)~;
\item Kirschoff en $D$~: flux 3 de $D$ vers $p$ (OK car < capacité de
12)~;
\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 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
%devient 8, 3, 6, 4, 4
$\alpha=1$ -> flot: de 17 à 18.
-Le nouveau flot est encore complet.
-Le nouveau flot est de valeur 18 ($10 + 8$ ou $9 + 4 + 5$)
2e itération -> on ne peut pas marquer p => le flot optimal est de valeur 18
-> La coupe où S = 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$
\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] (s) {$s$};
\node[main node] (A) [right of=s]{$A$};
\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.
-> 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
(tous les arcs de $$(\bar{S},S)$$ sont de flux nul)
C'est que le flot de valeur maximum et la coupe est de la capacité minimal.
\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
\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)