diff --git a/tp/code/Exercice1.java b/tp/code/Exercice1.java index b4c014c..084943e 100644 --- a/tp/code/Exercice1.java +++ b/tp/code/Exercice1.java @@ -16,12 +16,15 @@ public class Exercice1 { public static final int RESTART_GEOMETRIQUE = 2; public static void main(String[] args) { - + + + final int N = 4; + final int F = 4; final String coherence = COHERENCE_BORNES; Model model = new Model("Quatre cubes"); - // Ajout des tuples. 1: rouge, 2:vert, 3:bleu, 4:jaune + // Énumération des combinaisons dans un tableau. 1: rouge, 2:vert, 3:bleu, 4:jaune int[][] tableauCubeUn = new int[][]{ {3,4,1,2},{3,2,1,1},{3,2,1,4},{3,1,1,2}, {2,3,4,1},{2,2,4,1},{2,1,4,3},{2,1,4,2}, @@ -55,43 +58,54 @@ public class Exercice1 { {2,3,1,4},{2,4,1,3},{2,1,1,4},{2,4,1,1}, {1,4,2,3},{1,3,2,4},{1,1,2,4},{1,4,2,1}, }; - + + // Création des tuples à partir des tableaux pour implémenter les contraintes table. Tuples tuplesCubeUn = new Tuples(tableauCubeUn, true); Tuples tuplesCubeDeux = new Tuples(tableauCubeDeux, true); Tuples tuplesCubeTrois = new Tuples(tableauCubeTrois, true); Tuples tuplesCubeQuatre = new Tuples(tableauCubeQuatre, true); - IntVar[][] facesCubes = model.intVarMatrix("x", 4, 4, 1, 4, false); + IntVar[][] facesCubes = model.intVarMatrix("x", N, F, 1, 4, false); model.table(facesCubes[0], tuplesCubeUn).post(); model.table(facesCubes[1], tuplesCubeDeux).post(); model.table(facesCubes[2], tuplesCubeTrois).post(); model.table(facesCubes[3], tuplesCubeQuatre).post(); - IntVar[][] faceRectangulaires = new IntVar[4][4]; - - for (int noFace = 0; noFace < 4; noFace++) { - for (int noCube = 0; noCube < 4; noCube++) { + // On créé la transpose de la matrice facesCubes pour pouvoir effectuer la contrainte ALLDIFFERENT. + IntVar[][] faceRectangulaires = new IntVar[F][N]; + for (int noFace = 0; noFace < F; noFace++) { + for (int noCube = 0; noCube < N; noCube++) { faceRectangulaires[noFace][noCube] = facesCubes[noCube][noFace]; } model.allDifferent(faceRectangulaires[noFace], coherence).post(); } - // Creation du solveur + // Creation et lancement du solveur. Solver solver = model.getSolver(); - solver.findSolution(); - - for (int noFace = 0; noFace < 4; noFace++) { - for (int noCube = 0; noCube < 4; noCube++) { + + // On affiche la solution. + System.out.print(" "); + for (int noCube = 0; noCube < N; noCube++) { + System.out.print(" Cube "); + System.out.print(noCube); + System.out.print(" "); + } + System.out.println(""); + for (int noFace = 0; noFace < F; noFace++) { + System.out.print(" Face "); + System.out.print(noFace); + System.out.print(" "); + for (int noCube = 0; noCube < N; noCube++) { if (faceRectangulaires[noFace][noCube].getValue() == 1) { - System.out.print(" R "); + System.out.print(" R "); }else if (faceRectangulaires[noFace][noCube].getValue() == 2) { - System.out.print(" V "); + System.out.print(" V "); }else if (faceRectangulaires[noFace][noCube].getValue() == 3) { - System.out.print(" B "); + System.out.print(" B "); }else { - System.out.print(" J "); + System.out.print(" J "); } System.out.print(" "); diff --git a/tp/question1.tex b/tp/question1.tex index a0508c6..bdd801f 100644 --- a/tp/question1.tex +++ b/tp/question1.tex @@ -48,8 +48,12 @@ Il s'agit d'une contrainte de type \textsc{tableau} qui s'écrit de la façon su \begin{align} \label{eq:q1c1} -&Tableau(facesCubes_{i1} , ... , facesCubes_{iF} , T) & \text{pour i = 1 .. N} +&Tableau(facesCubes_{11} , ... , facesCubes_{1F} , T) \end{align} +\begin{center} +... \\ +$Tableau(facesCubes_{N1} , ... , facesCubes_{NF} , T)$ +\end{center} \subsubsection{Couleurs différentes sur les 4 faces} \label{sec:couleur4faces} @@ -62,8 +66,12 @@ Il s'agit d'une contrainte de type \textsc{AllDifferent} qui s'écrit de la faç \begin{align} \label{eq:q1c2} -&facesCubes_{i1} \neq ... \neq facesCubes_{iF} & \text{pour i = 1 .. N} +&facesCubes_{11} \neq ... \neq facesCubes_{1F} \end{align} +\begin{center} +... \\ +$facesCubes_{N1} \neq ... \neq facesCubes_{NF}$ +\end{center} \subsubsection{Nombre total de contraintes} \label{sec:q1totcontr} @@ -71,15 +79,16 @@ Il s'agit d'une contrainte de type \textsc{AllDifferent} qui s'écrit de la faç Le nombre total de contraintes pour les définitions \eqref{eq:q1c1} et \eqref{eq:q1c2} est: \begin{align} \label{eq:conttot} -N \text{contraintes «tableau»} + N \text{contraintes «AllDifferent»} &= 2N \in \theta(N) \\ -\text{De plus, chaque tableau contient 24} \in \theta(1) & \text{ entrées} +N \text{contraintes «tableau»} + \frac{4*N(N-1)}{2} \text{contraintes de différence} &= 2N^{2}-N \in \theta(N^{2}) \end{align} - +\begin{center} +De plus, chaque tableau contient au plus 24 $\in$ O(24) entrées. +\end{center} \subsection{Resultats} \label{sec:q1resultats} -Nous avons demandé au solveur Choco de trouver une solution au problème des 4 cubes à l'aide de la méthode \texttt{findSolution}. Nous avons utilisé les heuristiques par défaut car elles permettaient d'obtenir un résultat en moins d'une seconde. Le solveur trouve une seule solution en effectuant 0 retours arrières et ce, en 0,038s. +Nous avons demandé au solveur Choco de trouver une solution au problème des 4 cubes à l'aide de la méthode \texttt{findSolution}. Nous avons utilisé les heuristiques par défaut car elles permettaient d'obtenir un résultat en moins d'une seconde. Le solveur trouve une seule solution en effectuant 0 retour arrière et ce, en 0,038s. \bigskip La solution retournée par le solveur est la suivante :