Commit d8a0e040 authored by Alexandre Gondran's avatar Alexandre Gondran
Browse files

modif du fichier Graphe-Slides.tex: separation des cours

parent ecc60942
......@@ -14,8 +14,8 @@
\animfalse
\newif\ifimprime
\imprimetrue
%\imprimefalse
%\imprimetrue
\imprimefalse
\newif\ifintro
\introtrue
......@@ -80,6 +80,7 @@
\usepackage[french,algonl,ruled]{algorithm2e}
\usepackage{animate}
%\usepackage{movie15}
\usepackage{multirow}
\usepackage{tikz}
\usepackage{xcolor}
......@@ -1996,451 +1997,7 @@ Chaîne verte~: carte robuste $L^*-L \geq 1$ ($|M'|=54$).}
%----------------------------------------------------------------
% ----------------------------------------------------------------
\ifflot
\begin{frame}{\bf Couplage}
On doit affecter un certain nombre de pilotes à un certain nombre
de vols à longue distance.
\begin{block}{}
\begin{itemize}
\item Chaque pilote est qualifié pour certains appareils (A318-321,A340,A380,etc).
\item On désire attribuer un pilote à chaque vol de tel façon
qu'un même vol ne soit pas affecté à deux pilotes différents, et vice-versa.
\item S'il n'est pas possible de satisfaire tous les vols, on veut
satisfaire le maximum d'entre eux.
\end{itemize}
\end{block}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Graphe biparti}
\begin{defin}[Graphe biparti]
Un graphe non orienté $G=(S,A)$ est biparti si $S=S_1 \cup S_2$, $S_1 \cap S_2 = \emptyset$, s'il
n'existe pas d'arête entre les sommets de $S_1$ et s'il
n'existe pas d'arête entre les sommets de $S_2$.
\end{defin}
\begin{center}
\includegraphics{bigraphe}
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Couplage}
\begin{defin}
Étant donné un graphe non orienté $G=(S,A)$, un {\bf couplage} sur $G$ est formé
d'un ensemble d'arêtes $C$ tel qu'aucune paire d'arêtes de $C$ ne partage
un sommet commun. \\[4mm]
La {\bf taille} du couplage est le nombre d'arêtes de $C$. \\[4mm]
Le couplage est \textbf{parfait} si tous les sommets du graphe sont
couverts par le couplage.
\end{defin}
Objectif~: trouver un couplage de taille maximum ($\leq \lfloor\frac{|S|}{2}\rfloor$)
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[scale=1.4]{cm0}
{Un graphe biparti}
\end{center}
\end{frame}
%----------------------------------------------------------------
\ifimprime
\else
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[scale=1.4]{cm}
{Un graphe biparti et un couplage maximum (parfait)\label{coup}}
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[scale=1.4]{cm1}
{Un couplage sous-optimal\label{coupbad}}
\end{center}
\end{frame}
\fi
%----------------------------------------------------------------
\begin{frame}{\bf Terminologie}
Soit $C \subset A$ un couplage de $G$. \\[5mm]
\begin{itemize}
\item un sommet $s\in S$ est \emph{saturé} si c'est l'extrémité d'une
arête de $C$. Sinon, \emph{insaturé}.
\item Une chaîne dans laquelle une arête sur deux est dans $C$ et
les autres dans $A-C$ est dite \emph{alternée}.
\item Une chaîne alternée est dite \emph{améliorante} si elle relie
deux sommets insaturés à ses extrémités (longueur impaire).
\end{itemize}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Théorème de Berge}
\begin{theor}
Un couplage $C$ est maximum si et seulement s'il n'existe pas de chaîne alternée améliorante relativement à $C$.
\end{theor}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Chaîne améliorante: suffisant}
À partir d'un couplage $C$ et d'une chaîne améliorante $C_A$ :\\
on améliore le couplage (de 1) par
``ou exclusif'' $\oplus$ (suppression dans $C$ des arêtes noires $C \cap C_A$ et ajout des arêtes grises $C_A \backslash (C \cap C_A)$).
\begin{center}
\includegraphics[scale=0.78]{cma}
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Chaîne améliorante~: nécessaire}
Soit $C$ et $D$, 2 couplages de $G$, $|C|<|D|$ et $G'=(S,C\oplus D)$.\\[2mm]
$C$ et $D$ sont deux couplages: chaque sommet de $S$ est l'extrémité
d'au plus une arête de $C$ et d'au plus une arête de $D$.\\[2mm]
Une composante connexe de $G'$ est une chaîne simple (évent. un
cycle) dont une arête sur deux est dans $C$ et les autres dans $D$.\\[2mm]
Comme $|C|<|D|$, $C\oplus D$ contient plus d'arêtes de $D$ que de $C$.
Les cycles: autant d'arêtes de $C$ que de $D \Rightarrow G'$ a une chaîne qui
n'est pas un cycle, avec plus d'arêtes de $D$ que de $C$~:
c'est une chaîne améliorante.
\end{frame}
%% chaine ameliorante e1 c4 e5 c6 e2 c2!
%----------------------------------------------------------------
\begin{frame}{\bf Algorithme des chaînes améliorantes}
On peut chercher les chaînes améliorantes en parcourant le graphe biparti en alternant le parcours d'arêtes hors et dans $C$ à partir des sommets insaturés de $S_1$.\\[2mm]
$\implies$ Construction de chaînes améliorantes par un parcours en largeur (plus court chemin) sur le graphe orienté de $S_1$ vers $S_2$, excepté pour $C$ dans l'ordre inverse.\\[2mm]
%%% similaire a la recherche des plus courts chemins et de l'arbre des plus courts chemins mais ici multi-sources
Au plus il y a $\lfloor\frac{|S|}{2}\rfloor$ chaînes améliorantes.\\[2mm]
Complexité (majorant) de l'algorithme en $O(|S|.|A|)$\\[2mm]
Algorithme d'Hopcroft-Karp en $O(\sqrt{|S|}.|A|)$
\end{frame}
%----------------------------------------------------------------
\shrink{
\begin{frame}{\bf Construction du graphe des chaînes améliorantes}
\begin{algorithm}[H]
\Function{\CGCA{$G=(S_1 \cup S_2, A),C$}}{
$G' \gets \varnothing$; $S \gets \varnothing$; $S[0] \gets insatures_C(S_1)$; $i \gets 1$\;
\Tq{$S[i-1] \neq \emptyset$}{
\PourCh{sommet $u \in S[i-1]$}{
\Si{$i$ impair}{
\PourCh{$v \in \mathit{Adj}[u]$ et $v \not\in \bigcup^{i-1}_0 S[j]$ et $(u,v) \not\in C$}{
Ajoute $v$ à $S[i]$; Ajoute $(u,v)$ à $G'$\;
\lSi{$v \in insatures_C(S_2)$}{\Retour{G'}\;}
}
}
\Sinon{
\PourCh{$v \in \mathit{Adj}[u]$ et $v \not\in \bigcup^{i-1}_0 S[j]$ et $(u,v) \in C$}{
Ajoute $v$ à $S[i]$; Ajoute $(u,v)$ à $G'$\;
}
}
}
$i \gets i + 1$\;
}
\Retour{Faux}\;
}
\end{algorithm}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Algorithme d'Hopcroft-Karp}
{\small
\hrule
Entrée : Un graphe biparti $G=(S_1 \cup S_2, A)$\\
Sortie : Un couplage maximal $C$
\hrule
{\tt /* initialisation */}\\
{\it anciennetaille} = -1;\\
$C = \emptyset$;\\
{\tt /* traitement */}\\
{\bf Tant que} {\it anciennetaille} $\neq \mid\!C\!\mid$ {\bf faire}\\
{\white mm} {\it anciennetaille} = $\mid\!C\!\mid$;\\
{\white mm} orienter le graphe $G$ ($S_1$ vers $S_2$, excepté pour $C$, ordre inverse);\\
{\white mm} {\bf Pour tout} $u \in S_1$ tel que $u \not\in C$ {\bf faire}\\
{\white mmmmm} {\bf Si} $\exists$ $v \in S_2$ connecté à $u$ par un chemin tel que $v \not\in C$ {\bf alors}\\
{\white mmmmmmmm} $chemin$ = plus court chemin améliorant de $u$ vers $v$;\\
{\white mmmmmmmm} $C$ = $C \oplus chemin$;\\
{\bf Retourner} $C$
\hrule
}
\end{frame}
%----------------------------------------------------------------
\ifanim
\begin{frame}{\bf Algorithme d'Hopcroft-Karp}
\centering
\begin{pspicture}(2,3.25)
\psset{unit=0.75}
\cnodeput(0.25,2){A}{{\scriptsize {\visible<2,3,4>{\red} $A$}}}
\cnodeput(0.25,1.25){B}{{\scriptsize {\visible<5,6,12,13,14,15,16>{\red} $B$}}}
\cnodeput(0.25,0.5){C}{{\scriptsize {\visible<7,8,9>{\red} $C$}}}
\ncbox[nodesep=.1cm,boxsize=.5,linearc=.2]{A}{C}
\cnodeput(2.75,2.50){D}{{\scriptsize $D$}}
\cnodeput(2.75,1.75){E}{{\scriptsize $E$}}
\cnodeput(2.75,1.00){F}{{\scriptsize $F$}}
\cnodeput(2.75,0.25){G}{{\scriptsize $G$}}
\ncbox[nodesep=.1cm,boxsize=.5,linearc=.2]{D}{G}
\ncline{A}{D}
\ncline{A}{E}
\ncline{B}{D}
\ncline{C}{F}
\ncline{C}{G}
\visible<2-9>{
\ncline[arrows=->]{A}{D}
\ncline[arrows=->]{A}{E}
\ncline[arrows=->]{B}{D}
\ncline[arrows=->]{C}{F}
\ncline[arrows=->]{C}{G}
}
\visible<10>{
\ncline[linewidth=2pt]{A}{D}
\ncline[linewidth=2pt]{C}{F}
}
\visible<11-16>{
\ncline[arrows=<-]{A}{D}
\ncline[arrows=->]{A}{E}
\ncline[arrows=->]{B}{D}
\ncline[arrows=<-]{C}{F}
\ncline[arrows=->]{C}{G}
}
\visible<17>{
\ncline[linewidth=2pt]{A}{E}
\ncline[linewidth=2pt]{B}{D}
\ncline[linewidth=2pt]{C}{F}
}
\end{pspicture}
\vfill
{\white .}
{\small C=\{\visible<4-14>{(A,D)} \visible<9->{(C,F)} \visible<14->{(B,D)} \visible<16->{(A,E)}\}}
\vfill
\begin{pspicture}(2,3.5)
\visible<2,3,4> {
\psset{arrows=->}
\cnodeput(1,3){A1bfs}{{\scriptsize $A$}}
\cnodeput(0,2){D1bfs}{{\scriptsize $D$}}
\cnodeput(2,2){E1bfs}{{\scriptsize $E$}}
\ncline{A1bfs}{E1bfs}
\ncline{A1bfs}{D1bfs}
\visible<3,4> {
\ncline[linewidth=2pt,linecolor=red]{A1bfs}{D1bfs}
}
}
\visible<5,6>{
\psset{arrows=->}
\cnodeput(1,3){B2bfs}{{\scriptsize $B$}}
\cnodeput(1,2){D2bfs}{{\scriptsize $D$}}
\ncline{B2bfs}{D2bfs}
}
\visible<7-9>{
\psset{arrows=->}
\cnodeput(1,3){C3bfs}{{\scriptsize $C$}}
\cnodeput(0,2){F3bfs}{{\scriptsize $F$}}
\cnodeput(2,2){G3bfs}{{\scriptsize $G$}}
\ncline{C3bfs}{F3bfs}
\ncline{C3bfs}{G3bfs}
\visible<8,9> {
\ncline[linewidth=2pt,linecolor=red]{C3bfs}{F3bfs}
}
}
\visible<12-16>{
\psset{arrows=->}
\cnodeput(1,3){B4bfs}{{\scriptsize $B$}}
\cnodeput(1,2){D4bfs}{{\scriptsize $D$}}
\cnodeput(1,1){A4bfs}{{\scriptsize $A$}}
\cnodeput(1,0){E4bfs}{{\scriptsize $E$}}
\ncline{B4bfs}{D4bfs}
\ncline{D4bfs}{A4bfs}
\ncline{A4bfs}{E4bfs}
\visible<13-16> {
\ncline[linewidth=2pt,linecolor=red]{B4bfs}{D4bfs}
\ncline[linewidth=2pt,linecolor=red]{D4bfs}{A4bfs}
\ncline[linewidth=2pt,linecolor=red]{A4bfs}{E4bfs}
}
}
\end{pspicture}
\end{frame}
\fi
}
%----------------------------------------------------------------
\ifimprime
\else
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm0}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm0oriented}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm1}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm2}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm3}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm4}\\[4mm]
\end{center}
\end{frame}
\fi
%----------------------------------------------------------------
\shrink{
\ifimprime
\else
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.9\textwidth]{cmap}\\[4mm]
{ Un couplage, cha{\^\i}ne am{\'e}liorante, couplage am{\'e}lior{\'e}}
\end{center}
\end{frame}
\fi
%----------------------------------------------------------------
\begin{frame}{\bf Finalement\ldots}
A chaque itération, la taille du plus court chemin augmente de 1.\\[2mm]
A l'itération $\sqrt{|S|}$, il y a au plus $\sqrt{|S|}$ chemins améliorants de taille supérieure à $\sqrt{|S|}$.\\[2mm]
Algorithme de Hopcroft et Karp : complexité en $O(\sqrt{|S|}.|A|)$\\[8mm]
Extensions possibles~: couplages pondérés, graphes quelconques
%%%: Gabow (RNA-2d)
\end{frame}
}
%----------------------------------------------------------------
\ifimprime
\else
\begin{frame}{\bf Couplage et filtrage des domaines}
\begin{center}
\includegraphics[width=0.8\textwidth]{alldifferent}\\[4mm]
{Couplage couvrant l'ensemble des variables et r\'esultat du filtrage.}\\~\\
Contrainte {\em AllDifferent} implémentée dans les outils de programmation par contraintes ({\em gecode}, {\em choco}, {\em or-tools}, {\em toulbar2}).
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exercice~: problème du Sudoku}
\begin{center}
\includegraphics[width=0.7\textwidth]{sudoku_hard}
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Solution~: problème du Sudoku}
Problème Sudoku NP-complet.\\[2mm]
Modélisation par 27 graphes bipartis.\\[2mm]
Test si aucune solution n'existe:
taille d'un couplage maximum $< |X|$\\[2mm]
Suppression des valeurs n'appartenant à aucune solution:
retrait des sommets $x_i$,$a$ %% Why??? au contraire, forcer l arete
et test d'existence d'un couplage couvrant $X-{x_i}$.
$\implies$ complexité $O(|A|^2)$\\[3mm]
Possibilité d'améliorer la complexité en $O(|A|)$ (Régin, 1994). %% How? chercher composantes connexes..
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Logiciels, lectures}
\begin{block}{Langages de programmation par contraintes}
Minizinc \url{https://www.minizinc.org}\\
XCSP3 \url{http://xcsp.org}
\end{block}
\begin{block}{Solvers CP-SAT}
Google OR-tools C++/python/.NET\\
\url{https://developers.google.com/optimization}\\
{\small Choco Java \url{https://choco-solver.org}}
\end{block}
\begin{block}{Livre}
\begin{minipage}{0.79\textwidth}
Francesca Rossi, Peter van Beek, Toby Walsh. {\em Handbook of Constraint Programming.} Elsevier, 2006.
\end{minipage}
\begin{minipage}{0.19\textwidth}
\begin{center}
\includegraphics[width=0.9\textwidth]{RossiBeekWalsh2006}
\end{center}
\end{minipage}
\end{block}
\end{frame}
\fi % utilisation du couplage pour le filtrage des domaines
\input{couplage.tex}
%----------------------------------------------------------------
\begin{frame}{\bf Problème de construction de routes aériennes}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment