diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..42152ce --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +./choco-4.0.6 + diff --git a/exemple/CarreMagique.java b/exemple/CarreMagique.java new file mode 100644 index 0000000..5989201 --- /dev/null +++ b/exemple/CarreMagique.java @@ -0,0 +1,116 @@ +import org.chocosolver.solver.Model; +import org.chocosolver.solver.Solver; +import org.chocosolver.solver.search.limits.FailCounter; +import org.chocosolver.solver.search.strategy.Search; +import org.chocosolver.solver.search.strategy.selectors.variables.DomOverWDeg; +import org.chocosolver.solver.search.strategy.selectors.variables.ImpactBased; +import org.chocosolver.solver.variables.IntVar; + +public class CarreMagique { + public static final int HEURISTIQUE_DEFAUT = 0; + public static final int HEURISTIQUE_DOMOVERWDEG = 1; + public static final int HEURISTIQUE_IMPACT_BASED_SEARCH = 2; + public static final int HEURISTIQUE_ACTIVITY = 3; + public static final String COHERENCE_BORNES = "BC"; + public static final String COHERENCE_DOMAINES = "AC"; + + public static final int RESTART_AUCUN = 0; + public static final int RESTART_LUBY = 1; + public static final int RESTART_GEOMETRIQUE = 2; + + public static void main(String[] args) { + final int n = 12; + + final int heuristique = HEURISTIQUE_ACTIVITY; + final boolean bris_symetries = true; + final int restart = RESTART_GEOMETRIQUE; + final String coherence = COHERENCE_BORNES; + + Model model = new Model("Carré magique"); + + // Creation d'une matrice de dimensions n x n de variables dont les domaines sont les entiers de 1 a n^2. + IntVar[][] lignes = model.intVarMatrix("x", n, n, 1, n * n); + + // Vecteur contenant toutes les variables de la matrice dans un seul vecteur + IntVar[] toutesLesVariables = new IntVar[n * n]; + for (int i = 0; i < n * n; i++) { + toutesLesVariables[i] = lignes[i / n][i % n]; + } + + // Ajout d'une contrainte forcant toutes les variables a prendre des variables differentes + model.allDifferent(toutesLesVariables, coherence).post(); + + // Creation de la tranpose de la matrice lignes. + IntVar[][] colonnes = new IntVar[n][n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + colonnes[i][j] = lignes[j][i]; + } + } + + final int sommeMagique = n * (n * n + 1) / 2; + + // Creation d'une variable n'ayant qu'une seule valeur dans son domaine + IntVar variableSommeMagique = model.intVar(sommeMagique); + IntVar[] diagonale1 = new IntVar[n]; // Contient les variables sur la diagonale negative de la matrice + IntVar[] diagonale2 = new IntVar[n]; // Contient les variables sur la diagonale positive de la matrice + for (int i = 0; i < n; i++) { + // Ajout de deux contraintes forcant les sommes des lignes et des colonnes a etre egales a la constante magique + model.sum(lignes[i], "=", variableSommeMagique).post(); + model.sum(colonnes[i], "=", variableSommeMagique).post(); + diagonale1[i] = lignes[i][i]; + diagonale2[i] = lignes[n - i - 1][i]; + } + model.sum(diagonale1, "=", variableSommeMagique).post(); + model.sum(diagonale2, "=", variableSommeMagique).post(); + + if (bris_symetries) { + for (int i = 1; i < n / 2; i++) + model.arithm(lignes[i - 1][i - 1], "<", lignes[i][i]).post(); + + model.arithm(lignes[0][0], "<", lignes[n - 1][0]).post(); + model.arithm(lignes[0][0], "<", lignes[0][n - 1]).post(); + model.arithm(lignes[0][0], "<", lignes[n - 1][n - 1]).post(); + // model.arithm(lignes[n - 1][0], "<", lignes[0][n - 1]).post(); + } + + // Creation du solveur + Solver solver = model.getSolver(); + + switch(heuristique) { + case HEURISTIQUE_DOMOVERWDEG: + solver.setSearch(Search.domOverWDegSearch(toutesLesVariables)); + break; + case HEURISTIQUE_IMPACT_BASED_SEARCH: + solver.setSearch(new ImpactBased(toutesLesVariables, true)); + break; + case HEURISTIQUE_ACTIVITY: + solver.setSearch(Search.activityBasedSearch(toutesLesVariables)); + break; + } + + switch(restart) { + case RESTART_LUBY: + solver.setLubyRestart(2, new FailCounter(model, 2), 25000); + break; + case RESTART_GEOMETRIQUE: + solver.setGeometricalRestart(2, 2.1, new FailCounter(model, 2), 25000); + break; + } + + solver.findSolution(); + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (lignes[i][j].getValue() < 10) + System.out.print(" "); + if (lignes[i][j].getValue() < 100) + System.out.print(" "); + System.out.print(lignes[i][j].getValue()); + System.out.print(" "); + } + System.out.println(""); + } + solver.printStatistics(); + } +} diff --git a/exemple/makefile b/exemple/makefile new file mode 100644 index 0000000..81f6000 --- /dev/null +++ b/exemple/makefile @@ -0,0 +1,10 @@ +all: CarreMagique.class + +%.class: %.java + javac -cp .:choco-solver-4.0.6-with-dependencies.jar $< + +run: CarreMagique.class + java -cp .:choco-solver-4.0.6-with-dependencies.jar CarreMagique + +clean: + rm *.class diff --git a/tp/bibliographie.bib b/tp/bibliographie.bib new file mode 100644 index 0000000..17e1d74 --- /dev/null +++ b/tp/bibliographie.bib @@ -0,0 +1,9 @@ +@manual{chocoSolver, +author = {Charles Prud'homme and Jean-Guillaume Fages and Xavier Lorca}, +title = {Choco Solver Documentation}, +year = {2016}, +organization = {TASC, INRIA Rennes, LINA CNRS UMR 6241, COSLING S.A.S.}, +timestamp = {Tue, 9 Feb 2016}, +url = {http://www.choco-solver.org}, +} + diff --git a/tp/code/instance.txt b/tp/code/instance.txt new file mode 100644 index 0000000..7e23d45 --- /dev/null +++ b/tp/code/instance.txt @@ -0,0 +1,3 @@ +5 10 14 3 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 +1 2 3 4 5 4 2 3 4 3 5 5 4 3 3 3 diff --git a/tp/code/probleme1.java b/tp/code/probleme1.java new file mode 100644 index 0000000..e69de29 diff --git a/tp/code/probleme2.java b/tp/code/probleme2.java new file mode 100644 index 0000000..e69de29 diff --git a/tp/logo.png b/tp/logo.png new file mode 100755 index 0000000..df2c3d8 Binary files /dev/null and b/tp/logo.png differ diff --git a/tp/pagetitre.tex b/tp/pagetitre.tex new file mode 100755 index 0000000..4dd2aa8 --- /dev/null +++ b/tp/pagetitre.tex @@ -0,0 +1,17 @@ +\thispagestyle{empty} % Pour éviter d'avoir un en-tête et un pied de page sur la page couverture +\includegraphics[width=5cm]{logo.png} % Pour inclure le logo (on précise la largeur de l'image) +\vspace{4cm} % Espacement vertical +\begin{center} % On centre le texte +{\huge \bf \titre}\\ % \huge fait que le texte est gros, \bf fait que le texte est gras +\vspace{4cm} +\large Travail présenté à \destinataire \\ \cours\\ +\vspace{4cm} +Réalisé par \\ \auteurs ;\\ \matricules +\vfill % On va jusqu'au bas de la page avant de mettre le texte ci-dessous +Dernière version produite le~\today~à~\currenttime +\pagebreak +\end{center} +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "IFT7008-908144032" +%%% End: diff --git a/tp/question1.tex b/tp/question1.tex new file mode 100644 index 0000000..851ef6e --- /dev/null +++ b/tp/question1.tex @@ -0,0 +1,4 @@ +\section{Problème 1} + +Modélisation et résolution du problème des quatre cubes avec le solveur Choco \cite{chocoSolver}. + diff --git a/tp/question2.tex b/tp/question2.tex new file mode 100644 index 0000000..a3c2c62 --- /dev/null +++ b/tp/question2.tex @@ -0,0 +1,5 @@ + +\section{Question 2} +\label{sec:q2} + +Conception d'un horaire de travail avec minimisation de la perte de profit en utilisant le solveur \cite{chocoSolver}. \ No newline at end of file diff --git a/tp/rapport.tex b/tp/rapport.tex new file mode 100644 index 0000000..dd862af --- /dev/null +++ b/tp/rapport.tex @@ -0,0 +1,71 @@ +\documentclass[12pt]{article} % Précise le type de document, et la taille de la police de caractère +\usepackage[square,sort,numbers]{natbib}% Pour pouvoir utiliser une bibliographie externe +\usepackage[french]{babel} % Pour préciser la langue du document +\usepackage[utf8]{inputenc} % Précise comment le texte est saisi : cela permet de tapper directement les accents +\usepackage[T1]{fontenc} % Précise la façon dont le document actuel est encodé +\usepackage{setspace} +\usepackage{datetime} +\usepackage[margin=2.5cm]{geometry} % Précise les marges du document +\title{IFT-7020 - Travail pratique}% N'affecte pas la page titre, mais défini le nom de votre projet +\author{François Pelletier} % N'affecte pas la page titre, mais défini le nom de l'auteur(e) du projet + +%Bibliographie +%---------------------------------------------------------------- +\bibliographystyle{plainnat} % Pour changer le style de bibliographie +\addto{\captionsfrench}{\renewcommand{\refname}{Bibliographie}} % Comme le langage défini est le français, "Références" aurait été le titre par défaut pour la bibliographie +\usepackage[nottoc]{tocbibind} % Ajoute la bibliographie dans la table des matières +%---------------------------------------------------------------- + +%Sections +%---------------------------------------------------------------- +%\usepackage{newclude} % Pour pouvoir utiliser l'étoile après \inculde pour éviter les sauts de page. Ce package a des problême de compatibilité avec la package natbib +%\renewcommand\thesection{} % Pour éviter la numérotation des sections +%---------------------------------------------------------------- + +%Informations destinées à la page de présentation +%---------------------------------------------------------------- +\newcommand{\titre}{Travail pratique} +\newcommand{\auteurs}{François Pelletier et François Bérubé} +\newcommand{\matricules}{908144032 et XXX XXX XXX} +\newcommand{\destinataire}{Claude-Guy Quimper} +\newcommand{\cours}{IFT-7020 Optimisation combinatoire} +%---------------------------------------------------------------- + +%Autres packages et commandes utiles +%---------------------------------------------------------------- +\usepackage{amsmath,amsthm,amssymb,amsfonts} % Pour pouvoir inclure certains symboles et environnements mathématiques +\usepackage[ + left = \flqq,% + right = \frqq,% + leftsub = \flqq,% + rightsub = \frqq% +]{dirtytalk} +\newtheorem{definition}{Définition} +\usepackage{lscape} +\usepackage{enumerate} % Pour mieux gérer la commande enumerate dans les sections +\usepackage{graphicx} % Pour inclure des images +\usepackage{color} % Pour inclure du texte en couleur +\usepackage{units} % Pour pouvoir tapper les unités correctement +\usepackage{pgf,tikz} % Utilisation du module tikz, qui permet de tracer des belles images +\usetikzlibrary{shapes.geometric, arrows} % Quand on exporte une image GeoGebra, on a besoin de préciser cela +\usepackage{hyperref} % Pour include des liens dans le document +\newcommand{\N}{\mathbb{N}} % Commande personnelle, plus rapide pour tapper les ensembles +\newcommand{\Z}{\mathbb{Z}} % Commande personnelle, plus rapide pour tapper les ensembles +\newcommand{\R}{\mathbb{R}} % Commande personnelle, plus rapide pour tapper les ensembles +\usepackage{cprotect} % Pour pouvoir personaliser la légende des figures +%---------------------------------------------------------------- + +\begin{document} +\input{pagetitre} % Inclut le code contenu dans un fichier comme s'il était entré ici +\tableofcontents +\listoffigures +% Le package newclude mis en commentaire permet d'introduire une * pour éviter le saut de page entre les section +\include{question1} +\include{question2} +\bibliography{bibliographie} +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: