PPC L3 Base
PPC L3 Base
Ouali Abdelkader
2. Modélisation CSP
3. Algorithmes de résolution
▶ Étant donné un ensemble de pions chacun portant un chiffre (à gauche), et une grille partiellement remplie de
chiffres (à droite)
▶ Objectif : disposer les pions dans la grille afin que la somme indiquée pour chaque ligne et chaque colonne
soit satisfaite
▶ Étant donné un ensemble de pions chacun portant un chiffre (à gauche), et une grille partiellement remplie de
chiffres (à droite)
▶ Objectif : disposer les pions dans la grille afin que la somme indiquée pour chaque ligne et chaque colonne
soit satisfaite
▶ Étant donné un ensemble de pions chacun portant un chiffre (à gauche), et une grille partiellement remplie de
chiffres (à droite)
▶ Objectif : disposer les pions dans la grille afin que la somme indiquée pour chaque ligne et chaque colonne
soit satisfaite
▶ Étant donné un ensemble de pions chacun portant un chiffre (à gauche), et une grille partiellement remplie de
chiffres (à droite)
▶ Objectif : disposer les pions dans la grille afin que la somme indiquée pour chaque ligne et chaque colonne
soit satisfaite
En général, nous avons de nombreux problèmes (e.g. affectation, planification, sélection, etc.) dans différents
domaines (location, transport, recherche médicale, etc.) dont on :
En général, nous avons de nombreux problèmes (e.g. affectation, planification, sélection, etc.) dans différents
domaines (location, transport, recherche médicale, etc.) dont on :
Motivation :
▶ Cadre flexible
➥ on peut résoudre des puzzles, de l’ordonnancement, du partitionnement, de la coloration de graphe, etc.
Solution
Étape suivante
Retour arrière
▶ Une contrainte est une relation logique sur un nombre fini de variables
Elle n’est pas "dirigée" comme une fonction, et elle est déclarative
➠ exemple d’une contrainte sur deux variables :
(x1 = 1 ↔ x2 = 1), (x1 = 2 ↔ x2 = 2), (x1 = 3 ↔ x2 = 3)
▶ Une contrainte est une relation logique sur un nombre fini de variables
Elle n’est pas "dirigée" comme une fonction, et elle est déclarative
➠ exemple d’une contrainte sur deux variables :
(x1 = 1 ↔ x2 = 1), (x1 = 2 ↔ x2 = 2), (x1 = 3 ↔ x2 = 3)
▶ Une contrainte restreint les valeurs que peuvent prendre simultanément les variables qu’elle relie :
➠ instanciations interdites par la contrainte :
hhh hh hh
↔h
(x1 = 1 h x2h=h 2), (x1 =h1h ↔hx2h =h3), (x1 =h ↔h x2h
hh 2 h =h1),
h
h h h h
h ↔h
(x1 = 2 h x2h=h 3), (x1 = 3 h
h ↔hx2h =h 3 ↔h
1), (x1 =h x2h=h2)
▶ Une contrainte est une relation logique sur un nombre fini de variables
Elle n’est pas "dirigée" comme une fonction, et elle est déclarative
➠ exemple d’une contrainte sur deux variables :
(x1 = 1 ↔ x2 = 1), (x1 = 2 ↔ x2 = 2), (x1 = 3 ↔ x2 = 3)
▶ Une contrainte restreint les valeurs que peuvent prendre simultanément les variables qu’elle relie :
➠ instanciations interdites par la contrainte :
hhh hh hh
↔h
(x1 = 1 h x2h=h 2), (x1 =h1h ↔hx2h =h3), (x1 =h ↔h x2h
hh 2 h =h1),
h
h h h h
h ↔h
(x1 = 2 h x2h=h 3), (x1 = 3 h
h ↔hx2h =h 3 ↔h
1), (x1 =h x2h=h2)
▶ L’ordre dans lequel sont posées les contraintes n’est pas significatif
Toutes les contraintes sont satisfaites à la fin
Néanmoins, l’efficacité de la résolution est impactée dans certains langages en PPC
CSP
▶ X = {x1 , . . . , xn } un ensemble fini de n variables
Définition en extension : toutes les valeurs autorisées des variables dans la portée de la contrainte sont
explicitement spécifiées :
▶ (x1 = 1 ↔ x2 = 1)
▶ (x1 = 2 ↔ x2 = 2)
▶ (x1 = 3 ↔ x2 = 3)
Définition en extension : toutes les valeurs autorisées des variables dans la portée de la contrainte sont
explicitement spécifiées :
▶ (x1 = 1 ↔ x2 = 1)
▶ (x1 = 2 ↔ x2 = 2)
▶ (x1 = 3 ↔ x2 = 3)
Définition en compréhension : la relation entre les variables impliquées est exprimée en fonction d’opérateurs
arithmétiques quand c’est possible, ou avec un nom quand la contrainte est complexe :
▶ x1 = x2 , ou
▶ égalité(x1 , x2 )
▶ Une instanciation associe à chacune des variables du CSP un élément de son domaine
➠ c’est un élément du produit cartésien : D(x1 ) × ... × D(xn )
{1,2,3} × {1,2,3} = {(1,1), (1, 2), (1, 3), (2, 1), . . . , (3, 3)}
| {z } | {z }
x1 x2
▶ Une instanciation associe à chacune des variables du CSP un élément de son domaine
➠ c’est un élément du produit cartésien : D(x1 ) × ... × D(xn )
{1,2,3} × {1,2,3} = {(1,1), (1, 2), (1, 3), (2, 1), . . . , (3, 3)}
| {z } | {z }
x1 x2
▶ Une solution est une instanciation satisfaisant chacune des contraintes du CSP
➠ Si dans chaque contrainte on remplace chacune des variables dans sa portée par la valeur que lui affecte
l’instanciation, alors ladite contrainte s’évalue à vrai
Description du problème
Dans cette addition cryptée sur différentes lettres, on considère que :
▶ une lettre ne peut être associée qu’un chiffre, et
▶ aucune lettre n’a le même chiffre d’une autre lettre.
Question
Quelle est la valeur du mot MONEY et les chiffres associés aux différentes lettres qui vérifient l’équation de
l’addition suivante :
S E N D
+ M O R E
= M O N E Y
S E N D
+ M O R E
= M O N E Y
Variables :
S E N D
+ M O R E
= M O N E Y
Variables :
▶ {S, E, N, D, M, O, R et Y }
S E N D
+ M O R E
= M O N E Y
Variables :
▶ {S, E, N, D, M, O, R et Y }
▶ {r1 , r2 et r3 }
S E N D
+ M O R E
= M O N E Y
Variables :
▶ {S, E, N, D, M, O, R et Y }
▶ {r1 , r2 et r3 }
Domaines :
S E N D
+ M O R E
= M O N E Y
Variables :
▶ {S, E, N, D, M, O, R et Y }
▶ {r1 , r2 et r3 }
Domaines :
▶ D(S) = D(E), . . . , D(Y ) = {0, 1, . . . , 9}
S E N D
+ M O R E
= M O N E Y
Variables :
▶ {S, E, N, D, M, O, R et Y }
▶ {r1 , r2 et r3 }
Domaines :
▶ D(S) = D(E), . . . , D(Y ) = {0, 1, . . . , 9}
▶ D(r1 ) = D(r2 ) = D(r3 ) = {0, 1}
r3 r2 r1
S E N D
+ M O R E
= M O N E Y
Contraintes :
▶ D + E = Y + 10 × r1
▶ r1 + N + R = E + 10 × r2
▶ r2 + E + O = N + 10 × r3
▶ r3 + S + M = O + 10 × M
r3 r2 r1
S E N D
+ M O R E
= M O N E Y
Contraintes :
▶ D + E = Y + 10 × r1
▶ r1 + N + R = E + 10 × r2
▶ r2 + E + O = N + 10 × r3
▶ r3 + S + M = O + 10 × M
▶ alldif f erent(S, E, N, D, M, O, R et Y )
r3 r2 r1 0 1 1
S E N D 9 5 6 7
+ M O R E + 1 0 8 5
= M O N E Y = 1 0 6 5 2
r3 r2 r1
S E N D
+ M O R E
= M O N E Y
Description
On dispose d’un graphe non orienté représentant une
carte des pays à colorier avec une fonction associant à A S
chaque nœud du graphe un ensemble de couleurs
permises, où :
A S
Question
Trouver le modèle CSP pour colorier les nœuds du graphe, F
chacun avec une couleur de l’ensemble que lui associe la
fonction cl, de telle sorte que deux noeuds adjacents (i.e.,
reliés par une arête) n’aient pas la même couleur ?
E I
A S
E I
A S
▶ Variables :
▶ A, S, F, I et E
▶ Domaines :
▶ {rouge, vert, bleu} F
E I
A S
▶ Variables :
▶ A, S, F, I et E
▶ Domaines :
▶ {rouge, vert, bleu} F
▶ Contraintes :
▶ A ̸= S, A ̸= F, S ̸= F,
▶ S≠ I, F ̸= I et F ̸= E E I
A S
▶ A = E = I = rouge, F
▶ S = vert, et
▶ F = bleu
E I
Portée d’une contrainte (scope en anglais) est l’ensemble des variables impliquées dans la contrainte.
On définit les variables {case1 , case2 , case3 } et on considère les contraintes suivantes :
Portée d’une contrainte (scope en anglais) est l’ensemble des variables impliquées dans la contrainte.
On définit les variables {case1 , case2 , case3 } et on considère les contraintes suivantes :
CSP binaire
Chacune des contraintes porte sur au plus deux variables, si on prend l’ensemble de variables
{x1 , x2 , x3 , . . . , xn } :
▶ x1 = 3 (unaire)
▶ x1 = x2 (binaire)
Exemple de contraintes qui ne doivent pas apparaître dans ce type de CSP :
▶ h
x1 h
+hx3 h=hx2 (ternaire)
hh
▶ alldifh
f erent(x
hhh1h . , xn ) (n-aires)
, . .h
h
h
CSP discret
▶ Un ensemble de personnes :
D(Étudiant) = {Ania, Inès, Y un}
CSP continu
P = (X, D, C)
▶ X = {x1 , x2 , . . . , xn }
Exemple :
▶ X = {x1 , x2 }
▶ D(x1 ) = D(x2 ) = {1, 2, . . . , 100}
▶ C = {1 ≤ x1 ≤ 9, x21 = x2 }
▶ Un CSP binaire discret P = (X, D, C) est un graphe orienté étiqueté G = (X, E, L) défini comme suit :
▶ Un CSP binaire discret P = (X, D, C) est un graphe orienté étiqueté G = (X, E, L) défini comme suit :
▶ Un CSP binaire discret P = (X, D, C) est un graphe orienté étiqueté G = (X, E, L) défini comme suit :
▶ Pour toute contrainte binaire ck (xi , xj ), G contient un seul arc (xi , xj ) ou (xj , xi ), sinon aucun
▶ Un CSP binaire discret P = (X, D, C) est un graphe orienté étiqueté G = (X, E, L) défini comme suit :
▶ Pour toute contrainte binaire ck (xi , xj ), G contient un seul arc (xi , xj ) ou (xj , xi ), sinon aucun
▶ Pour tout arc (xi , xj ) de G, l’étiquette de (xi , xj ) est l’intersection de toutes les matrices booléennes Mk (xi , xj )
représentant les relations Rk (xi , xj ) associées aux différentes contraintes ck (xi , xj ) de P
▶ Un CSP binaire discret P = (X, D, C) est un graphe orienté étiqueté G = (X, E, L) défini comme suit :
▶ Pour toute contrainte binaire ck (xi , xj ), G contient un seul arc (xi , xj ) ou (xj , xi ), sinon aucun
▶ Pour tout arc (xi , xj ) de G, l’étiquette de (xi , xj ) est l’intersection de toutes les matrices booléennes Mk (xi , xj )
représentant les relations Rk (xi , xj ) associées aux différentes contraintes ck (xi , xj ) de P
Exemple
▶ X = {x1 , x2 }
▶ D(x1 ) = D(x2 ) = {1, 2, 3}
▶ C = {x1 >= x2 , x1 = x2 + 1}
▶ Un CSP binaire discret P = (X, D, C) est un graphe orienté étiqueté G = (X, E, L) défini comme suit :
▶ Pour toute contrainte binaire ck (xi , xj ), G contient un seul arc (xi , xj ) ou (xj , xi ), sinon aucun
▶ Pour tout arc (xi , xj ) de G, l’étiquette de (xi , xj ) est l’intersection de toutes les matrices booléennes Mk (xi , xj )
représentant les relations Rk (xi , xj ) associées aux différentes contraintes ck (xi , xj ) de P
Exemple
▶ X = {x1 , x2 } h 0 0 0
i
x1 1 0 0 x2
▶ D(x1 ) = D(x2 ) = {1, 2, 3} 0 1 0
▶ C = {x1 >= x2 , x1 = x2 + 1}
▶ L’instanciation d’une variable est le couple (variable, valeur) où valeur est un des éléments du domaine de la
variable
▶ Une instanciation est partielle s’il y a des variables du CSP ayant un domaine contenant deux ou plusieurs
valeurs
▶ Une instanciation est complète si le domaine de chaque variable du CSP a une valeur
▶ L’instanciation d’une variable est le couple (variable, valeur) où valeur est un des éléments du domaine de la
variable
▶ Une instanciation est partielle s’il y a des variables du CSP ayant un domaine contenant deux ou plusieurs
valeurs
▶ Une instanciation est complète si le domaine de chaque variable du CSP a une valeur
▶ Une contrainte est vérifiée (ou satisfaite) si les valeurs des variables respectent la contrainte
▶ Une contrainte est vérifiée (ou satisfaite) si les valeurs des variables respectent la contrainte
Exemples : (contrainte A + B = 2)
▶ Exécuter des algorithmes sur les contraintes du CSP sans faire d’hypothèses
▶ Obtenir un CSP plus simple (instanciation de variables, réduire les domaines) et cohérent
▶ Dans certaines situations, un retour immédiatement (backtracker) est possible : pas de solution au problème
➥ Filtrage qui réduit bien les domaines des variables à partir des choix causés initialement
3. Vérification de l’hypothèse
1. Succès :
2. Échec :
▶ Choisir une nouvelle valeur s’il reste des valeurs non explorées pour la variable de l’hypothèse
▶ Générer et Tester GT
▶ Techniques prospectives :
▶ Forward checking FC
▶ Looking ahead LA
2. Marquer l’instanciation I
Une fonction récursive booléenne GT pour un CSP P = (X, D, C) dont on doit tester la consistance :
3. La fonction GT est appelée initialement avec I vide, aucune variable n’est instanciée
Algorithme 1 : Pseudo-code de GT
Entrées :
▶ Un CSP P = (X, D, C) // membre de la classe
▶ Une instantiation partielle I // argument donné à la fonction GT
Output : Booléen
Algorithme 2 : Pseudo-code de GT
Entrées :
▶ Un CSP P = (X, D, C) // membre de la classe
▶ Une instantiation partielle I // argument donné à la fonction GT
Output : Booléen
Fonction GT(I)
si |Variables(I)|=|X| alors
si Évaluer(I) alors
retourner Vrai
sinon
retourner Faux
sinon
Choisir une variable xi ∈ X qui n’est pas encore instanciée
pour vi ∈ D(xi ) faire
si GT (I ∪ (xi , vi )) alors
retourner Vrai
retourner Faux
Algorithme 3 : Pseudo-code de GT
Entrées :
▶ Un CSP P = (X, D, C) // membre de la classe
▶ Une instantiation partielle I // argument donné à la fonction GT
Output : Booléen
Fonction GT(I)
si |Variables(I)|=|X| alors
si Évaluer(I) alors
retourner Vrai
sinon
retourner Faux
sinon
Choisir une variable xi ∈ X qui n’est pas encore instanciée
pour vi ∈ D(xi ) faire
si GT (I ∪ (xi , vi )) alors
retourner Vrai
retourner Faux
Fonction Évaluer(I)
pour c ∈ C faire
si ¬ c.Satisfait(I) alors
retourner Faux
retourner Vrai
Inconvénient majeur :
1. Si inexistence de solutions
▶ Retour en arrière est appliqué quand la valeur choisie pour la variable en cours d’instanciation n’est pas
validée avec l’instanciation partielle sur l’ensemble de contraintes possibles
Fonction BT(I, V)
// condition d’arrêt de la récurrsivité
si V = ∅ alors
retourner I
// choisir une variable non encore instanciée
xi ← Retirer(V)
// choisir une valeur dans le domaine de xi
pour vi ∈ D(xi ) faire
N ← I ∪ (xi , vi )
si IsConsistent(N ) alors
R ← BT(N , V)
si R ̸= N ul alors
retourner R
Mettre(V, xi )
retourner Nul
Fonction IsConsistent(N )
pour c ∈ C faire
si Portée(c) ⊆ Variables(N ) alors
si ¬ c.Satisfait(N ) alors
retourner Faux
retourner Vrai
TP :
À partir d’une instanciation vide, appeler la fonction BT() dans la méthode solve() de la classe BacktrackSolver.
Avantage :
Inconvénient :
▶ Supprimer des domaines des variables non encore instanciées les valeurs qui ne sont pas compatibles avec
la valeur choisie (anticiper)
Algorithme 5 : Pseudo-code de FC
Entrées :
▶ Un CSP P = (X, D, C) // membre d’une classe
▶ Une instantiation partielle I // arugment de la fonction FC
▶ Les variables non instanciées V // argument donné à la fonction BT (classe LinkedList dans le
TP)
▶ Suivre l’évolution des domaines ED // arugment de la fonction FC
Output : Solution
Algorithme 6 : Pseudo-code de FC
Entrées :
▶ Un CSP P = (X, D, C) // membre d’une classe
▶ Une instantiation partielle I // arugment de la fonction FC
▶ Les variables non instanciées V // argument donné à la fonction BT (classe LinkedList dans le
TP)
▶ Suivre l’évolution des domaines ED // arugment de la fonction FC
Output : Solution
Fonction FC(I, V, ED)
// condition d’arrêt de la récurrsivité
si V = ∅ alors
retourner I
sinon
// choisir une variable non encore instanciée
xi ← Retirer(V)
pour vi ∈ ED(xi ) satisfaisant les contraintes unaire sur xi faire
V′ ← V
D′ = ED ; D′ (xi ) = {vi } ; domaineVide=Faux
Mettre(V, xi )
retourner Nul
Inconvénient :
▶ Ne supprime que les valeurs incompatibles avec la valeur choisie pour la variable en cours d’instanciation
▶ Il peut y avoir des xi et xj non encore instanciées où ED(xi ) peut avoir des valeurs n’ayant plus de support
dans ED(xj )
▶ Cohérence de nœud
▶ Heuristiques
▶ Choix de variables
▶ Choix de valeurs
▶ Un CSP P = (X, D, C) est cohérent de noeud si pour toute variable xi ∈ X, et pour toute valeur vi ∈ D(xi ) :
➠ l’instanciation partielle {(xi , vi )} satisfait toutes les contraintes unaires dans C portant sur xi
▶ Aucun domaine n’est vide
Principe
▶ Supprimer de D(xi ) toute valeur vi telle que l’instanciation partielle (xi , vi ) viole les contraintes unaires
portant exclusivement sur xi
Algorithme 7 : Pseudo-code de NC
Entrées :
▶ Un CSP (X, D, C) // membre de la classe
▶ Un argument pour suivre l’évolution des domaines ED
Output :
▶ Les domaines dans ED vérifient la cohérence de noeud
▶ La fonction retourne Vrai si aucun domaine n’est vide, sinon elle retourne Faux
Fonction enforceNodeConsistency(ED)
pour toute variable x ∈ X faire
pour toute valeur v ∈ ED(x) faire
pour toute contrainte unaire c ∈ C faire
si ¬ c.Satisfait((x, v)) alors
ED(x) ← ED(x) \ {v} // Supprimer v du domaine de x
pour toute variable x ∈ X faire
si ED(x) = ∅ alors retourner Faux
retourner Vrai
▶ La valeur (xj , vj ) est support de la valeur (xi , vi ) pour la contrainte c si et seulement si (vi , vj ) satisfait c
▶ Une valeur est viable si et seulement si elle possède au moins un support pour chacune des contraintes
portant sur elle
▶ La valeur (xj , vj ) est support de la valeur (xi , vi ) pour la contrainte c si et seulement si (vi , vj ) satisfait c
▶ Une valeur est viable si et seulement si elle possède au moins un support pour chacune des contraintes
portant sur elle
Par exemple :
▶ X : {x1 , x2 , x3 }, D(x1 ) = D(x2 ) = D(x3 ) = {1, 2, 3}
▶ C = {x1 < x2 et x2 = x3 }
▶ (x2 , 2) et (x2 , 3) sont support de (x1 , 1) pour x1 < x2 donc (x1 , 1) est viable
▶ (x2 , 3) est support de (x1 , 2) pour x1 < x2 donc (x1 , 2) est viable
▶ il n’y a pas de support de (x1 , 3) pour x1 < x2 donc (x1 , 3) est non viable
Principe
▶ Revise
▶ Réduit la taille des domaines
▶ AC1 :
▶ Applique autant que possible Revise à tous les arcs sur lesquels il y a une contrainte
▶ Réapplique Revise à tous les arcs, même aux arcs non modifiés par la passe précédente
▶ AC3 :
▶ Ne réapplique Revise qu’aux arcs dont le domaine de la variable extrémité a été modifié
➥ (xk , xi ) tel que D(xi ) modifié
Fonction AC1(ED)
si ¬NC(ED) alors
retourner Faux
faire
change ← F aux
pour tout couple (xi , xj ) dans X faire
si REVISE(xi , xj , ED) alors
change ← V rai
Définition
Méthode permettant en pratique d’obtenir plus rapidement une solution, très souvent non optimale.
▶ Première/Dernière
▶ |domaine| / |contraintes|
▶ Première/Dernière
▶ Au milieu
▶ Alternance début/fin
▶ Mais si on cherche une solution, impact sur le temps nécessaire pour l’obtenir
Choix aléatoire :