TD Exercice 3
Modéliser
le problème et trouver la solution au problème
en utilisant le solveur Choco 2.0.
Solution
Modèle 1
Pour chaque case une variable énumérée
allant de 1 à 9
Pour
chaque ligne, colonne, carré de 3*3, des contraintes
de différence entre chaque couple
Voici
le code java en Choco
2.0 de ce premier modèle :
import
choco.cp.model.CPModel;
import choco.cp.solver.CPSolver;
import choco.cp.solver.search.integer.valiterator.*;
import choco.cp.solver.search.integer.varselector.*;
import choco.cp.solver.search.integer.valselector.*;
import choco.kernel.model.Model;
import choco.kernel.model.variables.integer.IntegerVariable;
import choco.kernel.solver.Solver;
import choco.Choco;
import java.lang.Math;
public
class Sudoku {
public
static int n = 9;
public
static void main(String[] args) {
long
time = System.currentTimeMillis();
System.out.println("Sudoku");
assert
Math.rint(Math.sqrt(n))==Math.sqrt(n);
Model
m = new CPModel();
IntegerVariable[][]
vars = createVariables(m);
postConstraints(m,
vars);
Solver
s = new CPSolver();
s.read(m);
setHeuristic(s);
s.solve();
displayResult(s,
vars);
System.out.println("Time
ellapsed: " + (System.currentTimeMillis() - time) +
"ms.");
}
//
1. Création des variables
private
static IntegerVariable[][] createVariables(Model m) {
return
Choco.makeIntVarArray("Case", n, n, 1, n);
}
//
2. Création des contraintes sur les lignes, colonnes,
carrés
private
static void postConstraints(Model m, IntegerVariable[][]
vars) {
for(int
i = 0; i < n; i++) {
IntegerVariable[]
lignes = new IntegerVariable[n];
IntegerVariable[]
colonnes = new IntegerVariable[n];
IntegerVariable[]
carres = new IntegerVariable[n];
for(int
j = 0; j < n; j++) {
lignes[j]
= vars[i][j];
colonnes[j]
= vars[j][i];
int
sqrtn=(int) Math.sqrt(n);
carres[j]
= vars[j%sqrtn + (i % sqrtn) * sqrtn][j/sqrtn + (i / sqrtn)
* sqrtn];
}
postAlldiff(m,
lignes);
postAlldiff(m,
colonnes);
postAlldiff(m,
carres);
}
}
//
3. Création d'une contrainte Alldiff
private
static void postAlldiff(Model m, IntegerVariable[] vars)
{
for(int
i = 0; i < vars.length; i++) {
for(int
j = i+1; j < vars.length; j++) {
m.addConstraint(Choco.neq(vars[i],
vars[j]));
}
}
}
//
4. Réglage des heuristiques de choix de variables
et de valeurs
private
static void setHeuristic(Solver s) {
s.setVarIntSelector(new
RandomIntVarSelector(s));
s.setValIntIterator(new
IncreasingDomain());
}
//
5. Affichages des résultats
private
static void displayResult(Solver s, IntegerVariable[][]
vars) {
int
sqrtn=(int) Math.sqrt(n);
for(int
i = 0; i < n; i++) {
if
(i%sqrtn == 0) {
String
str="";
for(int
k=0;k<n+(2*(sqrtn+1));k++) str=str.concat("-");
System.out.println(str);
}
for(int
j = 0; j < n; j++) {
if
(j%sqrtn == 0) System.out.print("||");
int
val=s.getVar(vars[i][j]).getVal();
if(val>=10){
char
c= (char) ('A'+val-10);
System.out.print(c);
}
else
System.out.print(val);
}
System.out.println("||");
}
String
str="";
for(int
k=0;k<n+(2*(sqrtn+1));k++) str=str.concat("-");
System.out.println(str);
}
}
Voici
le plan de cette présentation sur la programmation par contraintes
- Les
notions de base
:
- Quelques
notions avancées :
- Quelques
exemples pour utiliser la P.P.C. :
Cette page
a été co-réalisée avec Guillaume
Rochart, docteur en mathématiques dans mon équipe de
recherche au Bouygues
e-lab.10/03/2009.