structure pour tp

This commit is contained in:
François Pelletier 2018-02-02 00:24:44 -05:00
parent 1f5cabf992
commit 9a21011ffb
12 changed files with 237 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
./choco-4.0.6

116
exemple/CarreMagique.java Normal file
View file

@ -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();
}
}

10
exemple/makefile Normal file
View file

@ -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

9
tp/bibliographie.bib Normal file
View file

@ -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},
}

3
tp/code/instance.txt Normal file
View file

@ -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

0
tp/code/probleme1.java Normal file
View file

0
tp/code/probleme2.java Normal file
View file

BIN
tp/logo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

17
tp/pagetitre.tex Executable file
View file

@ -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:

4
tp/question1.tex Normal file
View file

@ -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}.

5
tp/question2.tex Normal file
View file

@ -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}.

71
tp/rapport.tex Normal file
View file

@ -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: