TD Exercice 4
![](_img/kakuro_programmation_par_contraintes.png)
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 blanche, une variable enumérée
allant de 1 à 9.
- Pour
chaque bloc contigu :
- Une
contrainte linéaire (somme égale à
la valeur fournie).
- Des
contraintes de différences.
Voici
le code java en Choco
2.0 de ce premier modèle :
import
choco.kernel.solver.variables.integer.IntDomainVar;
import choco.kernel.solver.ContradictionException;
import choco.kernel.model.Model;
import choco.kernel.model.variables.integer.IntegerVariable;
import choco.cp.model.CPModel;
import choco.cp.solver.CPSolver;
import choco.Choco;
import java.util.ArrayList;
import java.util.List;
public
class Kakuro {
static
int[][] instance = new int[][]{
![](_img/spacer.png)
new
int[]{-1, -1, 2300, 2300, -1, 1500, 300},
![](_img/spacer.png)
new
int[]{-1, 304, 0, 0, 3, 0, 0},
![](_img/spacer.png)
new
int[]{9, 0, 0, 0, 305, 0, 0},
![](_img/spacer.png)
new
int[]{17, 0, 0, 0, 0, 0, 300},
![](_img/spacer.png)
new
int[]{-1, 425, 0, 0, 0, 0, 0},
![](_img/spacer.png)
new
int[]{7, 0, 0, 0, 3, 0, 0},
![](_img/spacer.png)
new
int[]{4, 0, 0, -1, -1, -1, -1}
};
public static void main(String[] args) {
// 0- Créons
le modèle
Model m
= new CPModel();
// 1- Créons
les variables
IntegerVariable[][]
vars;
vars =
new IntegerVariable[instance.length][];
for (int
i = 0; i < instance.length; i++)
{
![](_img/spacer.png)
int[]
ll = instance[i];
![](_img/spacer.png)
vars[i]
= new IntegerVariable[ll.length];
![](_img/spacer.png)
for
(int j = 0; j < ll.length; j++)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
int
val = ll[j];
![](_img/spacer.png)
![](_img/spacer.png)
if
(val == 0)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
vars[i][j]
= Choco.makeIntVar("x" + i + "_" + j,
1, 9);
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
}
}
int nbLig
= instance.length;
int nbCol
= instance[0].length;
for
(int x = 0; x < nbLig; x++)
{
![](_img/spacer.png)
int
y = 0;
![](_img/spacer.png)
while
(y < nbCol)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
while
(y < nbCol && instance[x][y] < 0) y++;
![](_img/spacer.png)
![](_img/spacer.png)
if
(y < nbCol)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(instance[x][y] == 0) System.err.println("Probleme
1");
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
int
sum = instance[x][y] % 100;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
y++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
List<IntegerVariable>
sumVars = new ArrayList<IntegerVariable>();
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
while
(y < nbCol && instance[x][y] == 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
sumVars.add(vars[x][y]);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
y++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(sumVars.size() > 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
IntegerVariable[]
sumVars2 =
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
new
IntegerVariable[sumVars.size()];
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
sumVars2
= sumVars.toArray(sumVars2);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
m.addConstraint(Choco.eq(Choco.sum(sumVars2),
sum));
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
postAlldiff(m,
sumVars2);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
}
}
for (int
y = 0; y < nbCol; y++)
{
![](_img/spacer.png)
int
x = 0;
![](_img/spacer.png)
while
(x < nbLig)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
while
(x < nbLig && instance[x][y] < 0)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
x++;
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
if
(x < nbLig)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(instance[x][y] == 0) System.err.println("Probleme
1");
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
int
sum = instance[x][y] / 100;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
x++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
List<IntegerVariable>
sumVars = new ArrayList<IntegerVariable>();
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
while
(x < nbLig && instance[x][y] == 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
sumVars.add(vars[x][y]);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
x++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(sumVars.size() > 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
IntegerVariable[]
sumVars2 = new IntegerVariable[sumVars.size()];
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
sumVars2
= sumVars.toArray(sumVars2);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
m.addConstraint(Choco.eq(Choco.sum(sumVars2),
sum));
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
postAlldiff(m,
sumVars2);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
}
}
CPSolver
s = new CPSolver();
s.read(m);
try
{
![](_img/spacer.png)
s.propagate();
}
catch (ContradictionException
e)
{ }
for(int
x = 0; x < nbCol; x++)
{
![](_img/spacer.png)
for(int
y = 0; y <nbLig; y++)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
if
(instance[x][y] == 0)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(s.getVar(vars[x][y]).isInstantiated())
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
System.out.print(s.getVar(vars[x][y]).getVal());
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
else
System.out.print("?");
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
else
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
System.out.print("
");
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
}
![](_img/spacer.png)
System.out.println("");
}
s.solve();
System.out.println(s.pretty());
for(int
x = 0; x < nbCol; x++)
{
![](_img/spacer.png)
for(int
y = 0; y <nbLig; y++)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
if
(instance[x][y] == 0)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(s.getVar(vars[x][y]).isInstantiated())
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
System.out.print(s.getVar(vars[x][y]).getVal());
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
else
System.out.print("?");
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
else
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
System.out.print("
");
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
}
![](_img/spacer.png)
System.out.println("");
}
s.printRuntimeSatistics();
}
private static void postAlldiff(Model m, IntegerVariable[]
vars)
{
for(int
i = 0; i < vars.length; i++)
{
![](_img/spacer.png)
for(int
j = i+1; j < vars.length; j++)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
m.addConstraint(Choco.neq(vars[i],
vars[j]));
![](_img/spacer.png)
}
}
}
}
Solution
Modèle 2
- Objectif
==> une meilleure propagation : utilisation d'une contrainte
dédiée.
- Pour
cela, on utilise une contrainte générique
avec test :
- Vérification
quune valeur apparait une seule fois.
- Vérifier
la somme.
Voici
le code java en Choco
2.0 de ce second modèle :
import
choco.Choco;
import choco.cp.model.CPModel;
import choco.cp.solver.CPSolver;
import choco.kernel.model.Model;
import choco.kernel.model.variables.integer.IntegerVariable;
import choco.kernel.solver.Solver;
import choco.kernel.solver.constraints.integer.extension.LargeRelation;
import choco.kernel.solver.constraints.integer.extension.TuplesTest;
import
java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
public
class KakuroAC {
static
int[][] instance = new int[][]{
![](_img/spacer.png)
new
int[]{-1, -1, 2300, 2300, -1, 1500, 300},
![](_img/spacer.png)
new
int[]{-1, 304, 0, 0, 3, 0, 0},
![](_img/spacer.png)
new
int[]{9, 0, 0, 0, 305, 0, 0},
![](_img/spacer.png)
new
int[]{17, 0, 0, 0, 0, 0, 300},
![](_img/spacer.png)
new
int[]{-1, 425, 0, 0, 0, 0, 0},
![](_img/spacer.png)
new
int[]{7, 0, 0, 0, 3, 0, 0},
![](_img/spacer.png)
new
int[]{4, 0, 0, -1, -1, -1, -1}
};
public
static void main(String[] args)
{
![](_img/spacer.png)
Model
m = new CPModel();
![](_img/spacer.png)
//
1- créons les variables
![](_img/spacer.png)
IntegerVariable[][]
vars;
![](_img/spacer.png)
vars
= new IntegerVariable[instance.length][];
![](_img/spacer.png)
for
(int i = 0; i < instance.length; i++)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
int[]
ll = instance[i];
![](_img/spacer.png)
![](_img/spacer.png)
vars[i]
= new IntegerVariable[ll.length];
![](_img/spacer.png)
![](_img/spacer.png)
for
(int j = 0; j < ll.length; j++)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
int
val = ll[j];
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(val == 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
vars[i][j]
= Choco.makeIntVar("x" + i + "_" + j,
1, 9);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
}
![](_img/spacer.png)
int
nbLig = instance.length;
![](_img/spacer.png)
int
nbCol = instance[0].length;
![](_img/spacer.png)
for
(int x = 0; x < nbLig; x++)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
int
y = 0;
![](_img/spacer.png)
![](_img/spacer.png)
while
(y < nbCol)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
while
(y < nbCol && instance[x][y] < 0) y++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(y < nbCol)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(instance[x][y] == 0) System.err.println("Probleme
1");
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
int
sum = instance[x][y] % 100;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
y++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
List<IntegerVariable>
sumVars =
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
new
ArrayList<IntegerVariable>();
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
while
(y < nbCol && instance[x][y] == 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
sumVars.add(vars[x][y]);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
y++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(sumVars.size() > 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
IntegerVariable[]
sumVars2 =
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
new
IntegerVariable[sumVars.size()];
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
sumVars2
= sumVars.toArray(sumVars2);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
postConstraint(m,
sumVars, sum);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
}
![](_img/spacer.png)
for
(int y = 0; y < nbCol; y++)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
int
x = 0;
![](_img/spacer.png)
![](_img/spacer.png)
while
(x < nbLig)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
while
(x < nbLig && instance[x][y] < 0) x++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(x < nbLig)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(instance[x][y] == 0) System.err.println("Probleme
1");
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
int
sum = instance[x][y] / 100;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
x++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
List<IntegerVariable>
sumVars =
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
new
ArrayList<IntegerVariable>();
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
while
(x < nbLig && instance[x][y] == 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
sumVars.add(vars[x][y]);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
x++;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(sumVars.size() > 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
IntegerVariable[]
sumVars2 =
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
new
IntegerVariable[sumVars.size()];
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
sumVars2
= sumVars.toArray(sumVars2);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
postConstraint(m,
sumVars, sum);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
}
![](_img/spacer.png)
Solver
s = new CPSolver();
![](_img/spacer.png)
s.read(m);
![](_img/spacer.png)
s.solve();
![](_img/spacer.png)
System.out.println(s.pretty());
![](_img/spacer.png)
for(int
x = 0; x < nbCol; x++)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
for(int
y = 0; y <nbLig; y++)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(instance[x][y] == 0)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(s.getVar(vars[x][y]).isInstantiated())
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
System.out.print(s.getVar(vars[x][y]).getVal());
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
else
System.out.print("?");
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
else
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
System.out.print("
");
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
System.out.println("");
![](_img/spacer.png)
}
![](_img/spacer.png)
s.printRuntimeSatistics();
}
private
static void postConstraint(Model m,
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
List<IntegerVariable>
sumVars, final int sum)
{
![](_img/spacer.png)
IntegerVariable[]
vars = new IntegerVariable[0];
![](_img/spacer.png)
vars
= sumVars.toArray(vars);
![](_img/spacer.png)
m.addConstraint(
![](_img/spacer.png)
![](_img/spacer.png)
Choco.relationTupleAC(vars,
new TuplesTest()
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
public
boolean checkTuple(int[] tuple)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
int
s = 0;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
BitSet
bs = new BitSet();
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
for
(int v : tuple)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
{
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
if
(bs.get(v)) return false;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
bs.set(v);
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
s
+= v;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
return
s == sum;
![](_img/spacer.png)
![](_img/spacer.png)
![](_img/spacer.png)
}
![](_img/spacer.png)
![](_img/spacer.png)
})
![](_img/spacer.png)
);
}
}
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.
![](_img/choco_solver.png)