Commit ea01bba7 authored by Simon de Givry's avatar Simon de Givry
Browse files

corrections mineurs (glpsol --cpxlp) et mise a jour liens implementations modeles graphiques

parent 8e1b833d
No preview for this file type
......@@ -5555,12 +5555,12 @@ $nd+e.d^r$ variables. $n+2ed$ contraintes.
\begin{center}
\begin{itemize}
\item \href{http://www.inra.fr/mia/T/toulbar2/}{www.inra.fr/mia/T/toulbar2} (C++)
\item \href{https://miat.inrae.fr/toulbar2/}{miat.inrae.fr/toulbar2} (C++)
\item \href{https://github.com/eomahony/Numberjack}{github.com/eomahony/Numberjack} (python interface, includes {\sf toulbar2} (old version), {\sf mistral}, {\sf minisat}, links with {\sf cplex} and {\sf SCIP})
\item \href{https://vislearn.github.io/combilp}{vislearn.github.io/combilp} (python interface, includes {\sf toulbar2}, {\sf cplex}, {\sf TRWS})
\item \href{https://github.com/lotten/daoopt}{github.com/lotten/daoopt} (C++)
\item \href{https://bitbucket.org/jorism/libdai.git}{bitbucket.org/jorism/libdai.git} (C++)
\item \href{https://github.com/opengm/opengm}{github.com/opengm/opengm} (C++, includes libDAI, DAOOPT, TRWS, cplex, and old version of combilp)
\item \href{http://hciweb2.iwr.uni-heidelberg.de/opengm/}{hciweb2.iwr.uni-heidelberg.de/opengm} (C++, includes libDAI, DAOOPT, TRWS, cplex, and old version of combilp)
\end{itemize}
\end{center}
\end{frame}
......
No preview for this file type
......@@ -31,7 +31,7 @@
\begin{document}
\maketitle
\section{Préliminaires}
\section*{Préliminaires}
Sous Linux (ubuntu), ouvrez le fichier \texttt{tpgraph2.zip} à l'adresse
\url{https://forgemia.inra.fr/degivry/enac/raw/master/tpgraph2.zip}
......@@ -43,7 +43,30 @@ Les différents solvers utiles à ce TP ainsi que leur documentation dont celle
\texttt{PATH=\$PATH:/tmp/tpgraph2/solvers:.}\\
Envoyez vos réponses sous forme d'un document LibreOffice et vos codes à \texttt{simon.de-givry@inrae.fr}.
\section{Problème de couverture non-rigide quadratique \label{qap} (5 points)}
\section{Problème d'ordonnancement d'avions à l'atterrissage \label{airland} (10 points)}
Il s'agit d'ordonnancer $N$ avions sur un aéroport disposant de $K$ pistes d'atterrissage. Chaque avion $i \in \{1,\ldots,N\}$ a une date d'atterrissage prévue $p_i$ et une fenêtre temporelle $[e_i, l_i]$ où il peut atterrir au plus tôt $e_i$ ou au plus tard $l_i$ ($p_i \in [e_i, l_i]$). Pour chaque avion $i \in \{1,\ldots,N\}$, il faut décider de sa date d'atterrissage $t_i \in [e_i, l_i]$. Comme contrainte physique supplémentaire, pour chaque piste d'atterrissage et pour toute paire d'avions $i$ et $j$, un délai temporel $d(i,j)$ doit être respecté entre l'atterrissage de l'avion $i$ et celui de l'avion $j$.
La fonction objectif est de minimiser la somme pondérée des écarts entre les dates d'atterrissage et les dates initialement prévues. La pondération dépend pour chaque avion $i$ s'il atterrit en avance (coût unitaire $c^e_i$) ou en retard ($c^l_i$) par rapport à $p_i$. La fonction objectif s'écrit formellement par $$\min \sum_{i \in \{1,\ldots,N\}, t_i < p_i} c^e_i (p_i - t_i) + \sum_{i \in \{1,\ldots,N\}, t_i > p_i} c^l_i (t_i - p_i)$$.
(Q1.1 3pts) On suppose dans un premier temps que $K=1$. Donner un modèle en programmation linéaire à variables mixtes. Pour cela on pose comme variable continue $t_i$ la date choisie d'atterrissage de l'avion $i \in \{1,\ldots,N\}$. Pour modéliser qu'un avion $i \in \{1,\ldots,N\}$ atterrit avant un autre $j \in \{1,\ldots,N\}$, on utilise une variable binaire $b_{i,j}$ telle que $b_{i,j}=1$ si l'avion $i$ atterrit avant l'avion $j$ et $b_{i,j}=0$ sinon. On ajoute la contrainte $b_{i,j} + b_{j,i} = 1, i \in \{1,\ldots,N\}, j \in \{1,\ldots,N\}, i < j$ pour imposer que soit $i$ atterrit avant $j$, soit $j$ atterrit avant $i$. Utiliser ces variables $b_{i,j}$ pour respecter les contraintes de distance temporelle à l'atterrissage entre deux avions. {\em Astuces~: (i) une contrainte d'inégalité $x - M y \leq z$ avec $x>0,z>0,y\in \{0,1\}$ est forcément satisfaite si $y=1$ et $M$ suffisamment grand, (ii) pour modéliser la fonction objectif, utiliser des variables supplémentaires continues positives ou nulles par type d'écart (avance ou retard) en profitant du fait que $\min x \mbox{ s.t. } x \geq 0, x \geq y - z$ est égal à $y - z$ lorsque $y > z$ et zéro sinon.}
Compléter le programme Python2 {\tt airlandPLNE.py} et donner vos résultats pour les instances airland1.txt à airland8.txt. Résoudre les instances avec {\sc scip} ou {\sc glpk}~:\\
\texttt{python2 airlandPLNE.py airland1.txt > airland1.lp}\\
\texttt{glpsol --cpxlp airland1.lp}\\
\texttt{scip -c 'read airland1.lp opt'}\\
(Q1.2 2pts) Ecrire un modèle graphique sous forme d'un réseau de fonctions de coûts pour résoudre toujours le même problème avec $K=1$. Utiliser des variables entières pour modéliser la date d'atterrissage $t_i$. Montrer que la fonction objectif se décompose en un ensemble de fonctions de coûts unaires sur les $t_i$ et que la contrainte de distance entre deux avions $i,j$ ($i<j$) peut se représenter par une fonction de coûts binaire sur $t_i,t_j$ avec des coûts 0 ou infini ($top$). Compléter {\tt airlandWCSP.py} et comparer vos résultats sur airland1.txt (valeur de l'objectif et temps de calcul) à ceux obtenus en Q1.1 en utilisant le solver {\sc toulbar2}~:\\
\texttt{python2 airlandWCSP.py airland1.txt > airland1.wcsp}\\
\texttt{toulbar2 airland1.wcsp}\\
(Q1.3 2pts) On suppose maintenant $K$ quelconque. Étendre le modèle en programmation linéaire à variables mixtes. Pour cela, on ajoute des variables binaires de décision $x_i^u \in \{0,1\}, u \in \{1,\ldots,K\}$ indiquant le choix de la piste d'atterrissage~: $x_i^u = 1$ si l'avion $i$ atterrit sur la piste $u$ et $x_i^u = 0$ sinon. On ajoute les contraintes $\forall i \in \{1,\ldots,N\}, \sum_{u \in \{1,\ldots,K\}} x_i^u = 1$ pour que chaque avion soit affecté à une piste et une seule. {\em Astuces~: introduire une autre variable binaire $z_{i,j}=1$ lorsque les avions $i$ et $j$ atterrissent sur la même piste. Relier $z_{i,j}$ à $x_i^u$ et $x_j^u$. Utiliser $d(i,j) z_{i,j}$ pour modéliser l'écart entre les avions $i$ et $j$.} Copier et modifier {\tt airlandPLNE.py} pour résoudre les instances airland1.txt à airland8.txt avec $K=3$. Donner vos résultats. Qu'observez vous ?\\
(Q1.4 2pts) Ecrire un autre modèle graphique pour $K$ quelconque. Utiliser des variables entières pour modéliser la date d'atterrissage $t_i$ et le choix de la piste d'atterrissage $x_i$. Comparer vos résultats à ceux obtenus en Q1.3.\\
(Q1.5 1pt) Proposer une heuristique donnant un majorant de $K$ pour que tous les avions puissent atterrir à leur date prévue.
\section{Problème de couverture non-rigide quadratique \label{qap} (2 points)}
\vspace*{-1cm}
\begin{figure}[h]
......@@ -69,42 +92,43 @@ Ce modèle graphique peut également s'écrire comme un programme linéaire en
&& x_{ik}, y_{ikjl} \in \{0,1\} \quad \forall i,j,k,l, i<j
\end{eqnarray}
(Q2.1 3pts) Résoudre l'instance \texttt{matching0} du dossier \texttt{tpgraph2} avec les solvers {\sc toulbar2} et {\sc glpk}. Donner vos résultats. Comparer les minorants produits par les deux approches en pré-traitement avant de faire la recherche Branch-and-Bound.\\
\texttt{./solvers/toulbar2 -m=2 -d: -f: -dee: -s=3 matching0.cfn}\\
(Q2.1 1pt) Résoudre l'instance \texttt{matching0} du dossier \texttt{tpgraph2} avec les solvers {\sc toulbar2} et {\sc glpk}/{\sc scip}. Donner vos résultats. Comparer les minorants produits par les deux approches en pré-traitement avant de démarrer le Branch-and-Bound.\\
\texttt{./solvers/toulbar2 -m=2 -d: -f: -dee: matching0.wcsp}\\
%%%%%Optimum: 1936293 in 1450 backtracks and 3295 nodes and 1.055 seconds.
%%Initial lower and upper bounds: [1034675, 34567989] 97.007%
\texttt{glpsol --cpxlp matching0\_support.lp}\\
%%* 25285: objval = 1.156334169e+06 infeas = 1.509270139e-13 (113)
%%mip = not found yet >= 1.156277422e+06
\texttt{scip -c 'read matching0\_support.lp opt'}\\
(Q2.2 1pt) Sachant que le problème de couverture quadratique décrit ci-dessus peut inclure le problème d'affectation vu en cours, peut on en conclure que ce problème de couverture non-rigide est polynomial (dans la classe $P$) ?\\
(Q2.2 1pt) Sachant que le problème de couverture non-rigide quadratique inclut le problème d'affectation qui est dans la classe polynomiale, peut on en conclure que ce problème de couverture est aussi dans la classe polynomiale ?
(Q2.3 1pt) Dans quelle situation les deux modélisations proposées ci-dessus peuvent ne pas avoir de solution ?
%%%(Q2.3 1pt) Dans quelle situation les deux modélisations proposées ci-dessus peuvent ne pas avoir de solution ?
%%%lorsque le nombre de cibles est inferieur au nombre de sources
\section{Détection de trajectoires d'avions (15 points)}
\section{Détection de trajectoires d'avions (8 points)}
A partir du site \url{opensky-network.org}, nous avons collecté une liste de coordonnées longitude/latitude d'avions survolant la Bretagne ($\pm 2\degree$ depuis l'aéroport de Rennes $-1.43\degree$ lat./$48.04\degree$ lon.) à différents instants temporels. On se propose de chercher un couplage optimal (comme décrit en section \ref{qap}) entre instants successifs. Allez dans le dossier \texttt{/tmp/tpgraph2/opensky} et tapez la commande suivante pour voir la position des avions aux temps $t=0$, $t=1$ et $t=3$ minutes~:\\
A partir du site \url{opensky-network.org}, nous avons collecté une liste de coordonnées longitude/latitude d'avions survolant la Bretagne ($\pm 2\degree$ depuis l'aéroport de Rennes $-1.43\degree$ lat./$48.04\degree$ lon.) à différents instants temporels. On se propose de chercher un couplage optimal (comme décrit en Section \ref{qap}) entre instants successifs. Allez dans le dossier \texttt{/tmp/tpgraph2/opensky} et tapez la commande suivante pour voir la position des avions aux temps $t=0$, $t=1$ et $t=3$ minutes~:\\
\texttt{gnuplot opensky.plot}\\
(Q3.1 3pts) Construire le problème de couplage correspondant à la transition de $t=0$ à $t=1$ à l'aide du script \texttt{opensky.py}. Donner son optimum et analyser son résultat graphiquement.\\
\texttt{python opensky.py 0.dat 1.dat 0to1.cfn}\\
\texttt{../solvers/toulbar2 0to1.cfn -m=2 -d: -f: -dee: -s=3 -w=0to1.sol}\\
(Q3.1 2pts) Construire le problème de couplage correspondant à la transition de $t=0$ à $t=1$ à l'aide du script \texttt{opensky.py}. Donner son optimum et analyser son résultat graphiquement.\\
\texttt{python opensky.py 0.dat 1.dat > 0to1.wcsp}\\
\texttt{../solvers/toulbar2 0to1.wcsp -m=2 -d: -f: -dee: -w=0to1.sol}\\
\texttt{awk -f ./sol2plot.awk 0.dat 1.dat 0to1.sol > 0to1.plot}\\
\texttt{gnuplot opensky0to1.plot}\\
%%%%Optimum: 27883 in 23 backtracks and 74 nodes ( 0 removals by DEE) and 0.334858 seconds.
%%Optimum: 28.075 in 22 backtracks and 92 nodes ( 0 removals by DEE) and 0.485 seconds.
(Q3.2 6pts) Construire le problème de couplage correspondant à la transition de $t=1$ à $t=3$. Quel problème rencontrez vous ? Modifiez le script python pour le résoudre en ajoutant une valeur spéciale dans les domaines traduisant l'absence de couplage. Donner l'optimum trouvé et analyser votre résultat graphiquement. Note~: voir la contrainte \texttt{wamong} dans la documentation CFNformat.pdf de {\sc toulbar2}.\\
\texttt{python opensky.py 1.dat 3.dat 1to3.cfn}\\
\texttt{../solvers/toulbar2 1to3.cfn -m=2 -d: -f: -dee: -s=3 -w=1to3.sol}\\
(Q3.2 3pts) Construire le problème de couplage correspondant à la transition de $t=1$ à $t=3$. Quel problème rencontrez vous ? Modifiez le script python pour le résoudre en ajoutant une valeur spéciale dans les domaines traduisant l'absence de couplage. Donner l'optimum trouvé et analyser votre résultat graphiquement. Note~: voir la contrainte \texttt{wamong} dans la documentation de {\sc toulbar2}.\\
\texttt{python opensky.py 1.dat 3.dat > 1to3.wcsp}\\
\texttt{../solvers/toulbar2 1to3.wcsp -m=2 -d: -f: -dee: -w=1to3.sol}\\
\texttt{awk -f ./sol2plot.awk 1.dat 3.dat 1to3.sol > 1to3.plot}\\
\texttt{gnuplot opensky0to1to3.plot}\\
%%%%%Optimum: 50.769 in 13774 backtracks and 35397 nodes ( 0 removals by DEE) and 91.093 seconds.
(Q3.3 3pts) Dans le cas particulier précédent (transition de $t=1$ à $t=3$), il est possible de décomposer le problème à résoudre en plusieurs sous-problèmes indépendants en fonction de la taille de la liste source. Expliquer comment. Utiliser la commande suivante pour les résoudre en parallèle. Observer la distribution des temps de résolution des sous-problèmes.\\
\texttt{parallel.sh -r "time ../solvers/toulbar2 1to3.cfn -m=2 -d: -f: -dee: -v=-1 -x=,*=JOKERVALUE" 0 1 2 3 ...}\\
%%%(Q3.3 3pts) Dans le cas particulier précédent (transition de $t=1$ à $t=3$), il est possible de décomposer le problème à résoudre en plusieurs sous-problèmes indépendants en fonction de la taille de la liste source. Expliquer comment. Utiliser la commande suivante pour les résoudre en parallèle. Observer la distribution des temps de résolution des sous-problèmes.\\
%%%\texttt{parallel.sh -r "time ../solvers/toulbar2 1to3.cfn -m=2 -d: -f: -dee: -v=-1 -x=,*=JOKERVALUE" 0 1 2 3 ...}\\
%%%variations de 8 a 450 secondes! seulement 4sec pour le sous-probleme ayant l'optimum
(Q3.4 3pts) Comparer les résultats avec une approche utilisant un programme linéaire (comme décrit en section \ref{qap}) en le résolvant avec le solver {\sc glpk}.
(Q3.3 3pts) Comparer les résultats (optimum et temps de calcul) avec une approche utilisant la programmation linéaire à variables binaires (comme décrit en Section \ref{qap}) en le résolvant avec le solver {\sc glpk} ou {\sc scip}.
\end{document}
No preview for this file type
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