structure pour tp
This commit is contained in:
parent
1f5cabf992
commit
9a21011ffb
12 changed files with 237 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
./choco-4.0.6
|
||||
|
116
exemple/CarreMagique.java
Normal file
116
exemple/CarreMagique.java
Normal 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
10
exemple/makefile
Normal 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
9
tp/bibliographie.bib
Normal 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
3
tp/code/instance.txt
Normal 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
0
tp/code/probleme1.java
Normal file
0
tp/code/probleme2.java
Normal file
0
tp/code/probleme2.java
Normal file
BIN
tp/logo.png
Executable file
BIN
tp/logo.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 104 KiB |
17
tp/pagetitre.tex
Executable file
17
tp/pagetitre.tex
Executable 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
4
tp/question1.tex
Normal 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
5
tp/question2.tex
Normal 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
71
tp/rapport.tex
Normal 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:
|
Loading…
Reference in a new issue