Commit 633e709a authored by Simon de Givry's avatar Simon de Givry
Browse files

add tpgraph1win for Windows and installation procedure in tpgraph1.pdf

parent f4f861ed
No preview for this file type
......@@ -57,7 +57,6 @@
\documentclass[handout]{beamer}
\usepackage{etex}
\usepackage{pgfpages}
%\pgfpagesuselayout{1 on 1}[a4paper,border shrink=5mm, landscape]
\pgfpagesuselayout{4 on 1}[a4paper,border shrink=5mm, landscape]
%\pgfpagesuselayout{2 on 1}[a4paper,portrait,border shrink=5mm]
\else
......@@ -2393,11 +2392,12 @@ taille d'un couplage maximum $< |X|$\\[2mm]
Suppression des valeurs n'appartenant à aucune solution:
retrait des sommets $x_i$,$a$ et test d'existence d'un couplage couvrant $X-{x_i}$.
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).
Possibilité d'améliorer la complexité en $O(|A|)$ (Régin, 1994). %% How? chercher composantes connexes..
\end{frame}
%----------------------------------------------------------------
......@@ -2562,11 +2562,11 @@ $DSAT(v)$: nombre de couleurs différentes utilisées par ses voisins
\end{block}
\begin{block}{Article}
\begin{minipage}{0.79\textwidth}
Emmanuel H\'ebrard, George Katsirelos. {\em A Hybrid Approach for Exact Coloring of Massive Graphs.} CPAIOR'2019, Thessaloniki, Greece.
Emmanuel H\'ebrard, George Katsirelos. {\em A Hybrid Approach for Exact Coloring of Massive Graphs.} CPAIOR'2019, Thessaloniki, Greece. %% voir aussi article AIJ 2020
\end{minipage}
\begin{minipage}{0.19\textwidth}
\begin{center}
\includegraphics[width=0.9\textwidth]{RossiBeekWalsh2006}
\includegraphics[width=0.9\textwidth]{cpaior2019}
\end{center}
\end{minipage}
\end{block}
......
No preview for this file type
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%% pdflatex -shell-escape tpgraph1.tex %%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[a4paper, 10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[francais]{babel}
\usepackage{a4}
\usepackage{url}
%\usepackage{url}
\usepackage{hyperref}
%\usepackage[french,algonl,ruled]{algorithm2e}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage{minted}
\topmargin -2cm
%\oddsidemargin -1cm
......@@ -22,29 +29,83 @@
\title{TP Graphes et Réseaux 1}
\author{Simon de Givry et George Katsirelos}
\date{}
\date{9 octobre 2020}
\begin{document}
\maketitle
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Préliminaires}
Sous Linux (ubuntu), ouvrez le fichier \texttt{tpgraph1.zip} à l'adresse
\url{https://forgemia.inra.fr/degivry/enac/raw/master/tpgraph1.zip}
Le TP est noté~: envoyez vos réponses à \texttt{simon.de-givry@inrae.fr} sous forme d'un petit document (LibreOffice, Word) en reprenant les numéros de section pour vos réponses et en ajoutant en pièces jointes vos codes python.
Précisez moi dans le message votre environnement de travail (Ubuntu ENAC/domicile, Windows domicile, Mac domicile).
Décompactez le dossier \texttt{tpgraph1} dans \texttt{/tmp} puis ouvrez un terminal de commandes {\sc xterm} et aller dans le dossier du TP en faisant \texttt{cd /tmp/tpgraph1}.
\subsection{Installation sous Windows à la maison}~\label{windows}
Les différents solvers utiles à ce TP ainsi que leur documentation dont celle de la librairie python {\sc networkx} d'algorithmes sur les graphes se trouvent dans le dossier \texttt{solvers}. Lancer les commandes suivantes pour avoir accès à ces solvers~:\\
\texttt{chmod -R 755 solvers}\\
\texttt{PATH=\$PATH:/tmp/tpgraph1/solvers:/tmp/tpgraph1/solvers/gecode:.}\\
\texttt{LD\_LIBRARY\_PATH=/tmp/tpgraph1/solvers/gecode:.}\\
\texttt{export LD\_LIBRARY\_PATH}\\
Envoyez vos réponses sous forme d'un document LibreOffice et vos codes à \texttt{simon.de-givry@inrae.fr}.
Installer {\sf Visual Studio 2019} Communauté \url{https://visualstudio.microsoft.com/fr/downloads}.
Lors de l'installation, choisir de modifier l'installation par défaut, en incluant dans "Charge de travail" le module "Développement Python" avec Python 2.
\section{Construction de tournées d'aéroports (10 pts)}
Pour la partie sur les problèmes de tournées, installer {\sf Concorde} (Windows GUI) \url{http://www.math.uwaterloo.ca/tsp/concorde.html}. Télécharger \texttt{LKH-2.exe} \url{http://webhotel4.ruc.dk/~keld/research/LKH}, à copier dans le répertoire \texttt{tpgraph1/tsp} (voir plus loin).
Pour la partie sur la coloration de graphe, installer {\sf MiniZinc} \url{https://www.minizinc.org}.
Installation optionnelle~: {\sf or-tools} \url{https://developers.google.com/optimization} en téléchargeant la version {\em FlatZinc Binary distribution}.
Ouvrez le fichier \texttt{tpgraph1win.zip} à l'adresse
\url{https://forgemia.inra.fr/degivry/enac/raw/master/tpgraph1win.zip}
Décompactez le dossier \texttt{tpgraph1} dans \texttt{Documents}.
Démarrer Visual Studio 2019 et créer un nouveau projet en sélectionnant le répertoire \texttt{Documents/tpgraph1/tsp}. Choisir l'environnement Python 2.7 et finir l'installation en ajoutant le package {\sf networkx} (cliquer sur l'icone juste à droite du choix de Python 2.7).
\subsection{Installation sous Ubuntu dans une salle TP à l'ENAC}~\label{ubuntu}
Démarrer sous Linux Ubuntu et ouvrez le fichier \texttt{tpgraph1.zip} à l'adresse
\url{https://forgemia.inra.fr/degivry/enac/raw/master/tpgraph1.zip}
Décompactez le dossier \texttt{tpgraph1} dans \texttt{/tmp} puis ouvrez un terminal de commandes {\sf xterm} et aller dans le dossier du TP en faisant \texttt{cd /tmp/tpgraph1}.
Les différents solvers utiles à ce TP ainsi que leur documentation dont celle de la librairie python {\sf networkx} d'algorithmes sur les graphes se trouvent dans le dossier \texttt{solvers}.
Lancer les commandes {\sf bash} suivantes pour avoir accès à ces solvers~:
%\texttt{chmod -R 755 solvers}\\
%\texttt{PATH=\$PATH:/tmp/tpgraph1/solvers:/tmp/tpgraph1/solvers/gecode:.}\\
%\texttt{LD\_LIBRARY\_PATH=/tmp/tpgraph1/solvers/gecode:.}\\
%\texttt{export LD\_LIBRARY\_PATH}\\
\begin{minted}{bash}
chmod -R 755 solvers
PATH=$PATH:/tmp/tpgraph1/solvers:/tmp/tpgraph1/solvers/gecode:.
LD_LIBRARY_PATH=/tmp/tpgraph1/solvers/gecode:.
export LD_LIBRARY_PATH
\end{minted}
\subsection{Installation sous Ubuntu à la maison}
Installer Python2 et la librairie {\sf networkx}~:
%\texttt{sudo apt update}\\
%\texttt{sudo apt upgrade}\\
%\texttt{sudo apt install python2.7}\\
%\texttt{sudo apt install python-pip}\\
%\texttt{sudo pip install networkx}\\
\begin{minted}{bash}
sudo apt update
sudo apt upgrade
sudo apt install python2.7
sudo apt install python-pip
sudo pip install networkx
\end{minted}
Puis suivre les instructions à la Section~\ref{ubuntu}.
\subsection{Installation sous MacOS à la maison}
Installer la version Mac OS X de Visual Studio 2019 Communauté (pour avoir Python 2) et celle de MiniZinc ainsi que or-tools (optionnel), en suivant les instructions données en Section~\ref{windows}.
Il n'existe pas de version Mac OS X de LKH et Concorde, ne pas faire les questions des Sections~\ref{francecmp} et~\ref{monde}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Allez dans le dossier \texttt{/tmp/tpgraph1/tsp}.
\section{Construction de tournées d'aéroports (10 pts)}
Sous Ubuntu, allez dans le dossier \texttt{/tmp/tpgraph1/tsp}. Sous Windows/Mac, vous avez déjà ouvert \texttt{tpgraph1/tsp} sous Visual Studio 2019.
\subsection{Tournée des aéroports de France}
......@@ -52,70 +113,95 @@ Le fichier \texttt{france.geo} contient les coordonnées latitude/longitude en d
\subsubsection{Obtention d'un minorant à l'aide de l'arbre couvrant (2 pts)}
Modifier le fichier python \texttt{airports.py} pour calculer un minorant du tour des aéroports français. Pour cela, utiliser la fonction \texttt{minimum\_spanning\_edges} dans {\sf networkx}. Donner la valeur du minorant trouvé.
Modifier le fichier python \texttt{airports.py} pour calculer un minorant du tour des aéroports français.
Pour cela, utiliser la fonction \texttt{minimum\_spanning\_tree} dans {\sf networkx}, en s'inspirant de l'exemple donné dans la documentation \texttt{networkx.pdf}.
Donner la valeur du minorant trouvé.
\subsubsection{Obtention d'un majorant à l'aide de l'heuristique nearest neihbor (4 pts)}
Construire un tour approché en utilisant l'heuristique {\em nearest neihbor}. Il s'agit de partir d'un sommet quelconque puis d'ajouter successivement le plus proche voisin non visité jusqu'à inclure tous les sommets. Donner la valeur du majorant trouvé.
Construire un tour approché en utilisant l'heuristique {\em nearest neihbor}. Il s'agit de partir d'un sommet quelconque puis d'ajouter successivement le plus proche voisin non visité jusqu'à inclure tous les sommets et revenir au sommet initial. Donner la valeur du majorant trouvé.
Commandes pour visualiser la solution~:\\
\texttt{python2 airports.py} \% mets la solution trouvée dans francenn.sol \%\\
\texttt{awk -f sol2plot.awk france.geo francenn.sol > francenn.plot}\\
\texttt{gnuplot francenn.plot}
Quelle est la complexité de votre algorithme en fonction du nombre d'aéroports ?
\subsubsection{Comparaison avec des solvers exacts et approchés (2 pts)}
\subsubsection{Comparaison avec des solvers exacts et approchés (2 pts)}~\label{francecmp}
Comparer en terme de coût et de temps de calcul le solver de recherche locale {\sf LKH} contre une méthode exacte utilisant la programmation linéaire {\sf concorde}. Donner les résultats de votre comparaison. Que concluez vous par rapport à la solution trouvée dans la section précédente ?
Commandes pour exécuter les solvers~:\\
Commandes pour exécuter les solvers sous Ubuntu~:\\
\texttt{LKH france.par}\\
\texttt{concorde france.tsp}\\
Commandes pour visualiser les solutions~:\\
\texttt{awk -f lkh2plot.awk france.geo france.lkh > francelkh.plot}\\
\texttt{gnuplot francelkh.plot}\\
\texttt{awk -f sol2plot.awk france.geo france.sol > france.plot}\\
\texttt{gnuplot france.plot}
\subsection{Tournée mondiale (2 pts)}
Sous Windows, il faut ouvrir une {\em Invite de commandes} dans \texttt{Accessoires}, aller dans le répertoire \texttt{Documents/tpgraph1/tsp} et exécuter\\
\texttt{LKH-2.exe france.par}\\
Pour Concorde, il faut charger \texttt{france\_concorde\_windows.tsp} et choisir \texttt{Edges/Set Edge Norm/Geographic} avant de faire \texttt{Solve}.
\subsection{Tournée mondiale (2 pts)}~\label{monde}
Le fichier \texttt{airports.geo} contient les coordonnées latitude/longitude en degré des principaux aéroports internationaux. Sachant la vitesse de croisière du concorde à 2 158 km/h, en déduire une estimation du temps nécessaire pour survoler tous les aéroports (sans limite de carburant).
Le fichier \texttt{airports.geo} contient les coordonnées latitude/longitude en degré des principaux aéroports internationaux.
Sachant la vitesse de croisière du concorde à 2 158 km/h, en déduire une estimation du temps nécessaire pour survoler tous les aéroports (sans limite de carburant).
Commandes pour exécuter les solvers~:\\
Commandes pour exécuter les solvers sous Ubuntu~:\\
\texttt{LKH airports.par}\\
\texttt{concorde airports.tsp}\\
Commandes pour visualiser les solutions~:\\
\texttt{awk -f lkh2geo.awk airports.geo airports.lkh > tour.geo}\\
\texttt{gnuplot world.plot}\\
\texttt{awk -f sol2geo.awk airports.geo airports.sol > tour.geo}\\
\texttt{gnuplot world.plot}
Sous Windows, faire de même que précédemment.
Pour Concorde, utiliser \texttt{airports\_concorde\_windows.tsp}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Construction de routes aériennes (10 pts)}
Allez dans le dossier \texttt{/tmp/tpgraph1/coloring}. Les fichiers \texttt{flightsA01.txt} et \texttt{flightsB01.txt} contiennent des listes de vols directs de British Airways. On cherche à attribuer un niveau de vol à chaque route aérienne (correspondant à un ensemble de vols effectuant le même trajet) de manière que si deux routes se croisent alors elles utilisent un niveau différent. Visualiser les routes avec les commandes \texttt{gnuplot flightsA01.plot} et \texttt{gnuplot flightsB01.plot}.
Sous Ubuntu, aller dans le dossier \texttt{/tmp/tpgraph1/coloring}.
Sous Windows/Mac, ouvrir le dossier local \texttt{Documents/tpgraph1/coloring} avec Visual Studio 2019.
Les fichiers \texttt{flightsA01.txt} et \texttt{flightsB01.txt} contiennent des listes de vols directs de British Airways.
On cherche à attribuer un niveau de vol à chaque route aérienne (correspondant à un ensemble de vols effectuant le même trajet) de manière que si deux routes se croisent alors elles utilisent un niveau différent.
\subsection{Nombre chromatique du graphe d'intersections (6 pts)}
En utilisant le script python2 \texttt{flights.py} et le théorème de Brooks, donner un minorant et un majorant du nombre chromatique pour chaque liste de vols. Utiliser les fonctions networkx \texttt{graph\_clique\_number} et \texttt{degree}.
%%Comparer avec l'heuristique DSATUR (\texttt{greedy\_color}).
En utilisant le script python2 \texttt{flights.py} et le théorème de Brooks, donner un minorant et un majorant du nombre chromatique pour chaque liste de vols.
Utiliser les fonctions {\sf networkx} \texttt{graph\_clique\_number} et \texttt{G.degree}.
Comparer avec la solution trouvée par l'heuristique DSATUR sur les deux scénarios (fonction {\sf networkx} \texttt{greedy\_color}).
Générer ensuite un problème au format {\sf minizinc} de coloration du graphe d'intersections avec $k$ couleurs. Résoudre ce problème à l'aide du solver {\sf gecode}. Trouver le nombre chromatique pour les deux scénarios. Prouver leur optimalité. Expliquer.
Générer ensuite un problème au format {\sf MiniZinc} de coloration du graphe d'intersections avec $k$ couleurs.
Résoudre ce problème à l'aide du solver {\sf mzn-gecode}.
Trouver le nombre chromatique pour les deux scénarios.
Prouver leur optimalité. Expliquer votre démarche.
Commandes pour excécuter le solver (par ex., avec $k=10$ couleurs)~:\\
Commandes sous Ubuntu pour générer le problème et exécuter le solver avec $k=10$ couleurs sur le premier scénario~:\\
\texttt{python2 flights.py airports.geo flightsA01.txt 10}\\
\texttt{../solvers/gecode/mzn-gecode -s flightsA01.mzn}
\texttt{../solvers/gecode/mzn-gecode -s flightsA01.mzn}\\
Sous Windows/Mac, avec Visual Studio 2019, modifier le fichier \texttt{flights.py} suivant le scénario choisi et le nombre de couleurs voulu.
Exécuter le code \texttt{flights.py} pour générer le fichier \texttt{.mzn} correspondant.
Double-cliquer dessus pour lancer MiniZinc IDE et le résoudre.
\subsection{Amélioration des performances de la résolution (2 pts)}
Ajouter dans le modèle {\sf minizinc} des contraintes \texttt{alldifferent} pour l'ensemble des cliques du graphe d'intersection (fonction \texttt{nx.find\_cliques}). Est ce que cela permet de réduire le nombre de noeuds de l'arbre de recherche pour la preuve d'optimalité ? le temps de résolution ? Tester sur les deux scénarios et donner vos résultats.
Exemple de code {\sf minizinc} pour une clique sur les sommets $(6,17,19,57,63)$~:\\
\texttt{constraint alldifferent([x6, x17, x19, x57, x63]);}.\\
Comparer avec un modèle n'ajoutant qu'une seule clique maximale par sommet.
Modifier \texttt{flights.py} pour ajouter dans le modèle {\sf MiniZinc} généré des contraintes \texttt{alldifferent} pour l'ensemble des cliques du graphe d'intersection (fonction {\sf networkx} \texttt{find\_cliques}).
Est ce que cela permet de réduire le nombre de noeuds de l'arbre de recherche pour la preuve d'optimalité ? de réduire le temps de résolution ? Tester sur les deux scénarios et donner vos résultats.
Exemple de syntaxe {\sf MiniZinc} pour définir une clique sur les sommets $(6,17,19,57,63)$~:\\
\texttt{constraint alldifferent([x6, x17, x19, x57, x63]);}\\
Comparer avec un modèle n'ajoutant qu'une seule clique maximale par sommet (fonction {\sf networkx} \texttt{cliques\_containing\_node}).
\subsection{Minimisation des écarts au niveau de vol optimal (2 pts)}
On suppose que les avions préfèrent le niveau 0 ou sinon un niveau proche. Modéliser la somme des écarts au niveau de vol optimal comme une somme sur les variables du problème. Minimiser cette somme. Donner votre meilleur résultat.
On suppose que les avions préfèrent le niveau 0 ou sinon un niveau proche.
Modéliser la somme des écarts au niveau de vol optimal comme une somme sur les variables du problème.
Minimiser cette somme. Donner votre meilleur résultat.
Exemple de syntaxe {\sf MiniZinc} pour minimiser une somme sur les sommets $(6,7,8,9)$~:\\
\texttt{solve minimize sum([x6, x7, x8, x9]);}\\
\texttt{output [show(sum([x6, x7, x8, x9]))];}\\
Commande sous Ubuntu pour exécuter le solver en mode optimisation et voir les solutions intermédiaires~:\\
\texttt{../solvers/gecode/mzn-gecode -s -a flightsA01.mzn}\\
Commande pour excécuter le solver en optimisation et voir les solutions intermédiaires~:\\
\texttt{../solvers/gecode/mzn-gecode -s -a flightsA01.mzn}
Sous Windows/Mac, vous pouvez directement lancer la résolution par défaut avec {\sf gecode} ou bien ajouter un nouveau solver en indiquant le lien vers l'exécutable {\sf fzn-or-tools} et en cochant toutes les options (v,s,\ldots).
\end{document}
File added
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