CM1 B Flashcards
Quels sont les 3 éléments qui caractérisent un réseau de contraintes ?
- Ensemble de variables
- Ensemble de domaines des variables (finis, ⊆ {Z})
- Ensemble de contraintes
Qu’est-ce qu’une contrainte ?
Une fonction booléenne portant sur des variables
Comment satisfaire une contrainte ?
Avec un tuple (un ensemble de valeurs) τ tel que C(τ) = 1
Qu’est-ce qu’une instanciation ?
Une affectation de valeurs à une partie des variables
Qu’est-ce qu’une instanciation valide ?
Une instanciation dans laquelle chaque valeur affectée à une variable appartient bien au domaine de cette dernière
Qu’est-ce qu’une instanciation localement cohérente ?
Une instanciation valide qui ne viole aucune contrainte dont toutes les variables de la portée ont une affectation
Qu’est-ce qu’une solution ?
Une instanciation localement cohérente qui a une affectation pour chacune des variables
Quelle est la classe de complexité du problème de la résolution de CSP ?
NP-Complet
Algorithme de Backtrack (entrée, sortie, algorithme)
- Entrée : problème N = (X, D, C), instanciation I
- Sortie : booléen
- BT(N, I) :
- Si |I| = |X|, renvoyer vrai
- Choisir xi une variable non-affectée (!∈ I)
- Pour vi ∈ Dom(xi)
- Si I ∪ {xi, vi} est localement cohérente :
- Si BT(N, I ∪ {xi, vi}), renvoyer vrai
- Si I ∪ {xi, vi} est localement cohérente :
- Renvoyer faux
Comment fonctionne l’algorithme du Backtrack ?
Tant que toutes les variables ne sont pas instanciées, l’instanciation est élargie avec une valeur pour une variable :
- Si elle est localement cohérente, on continue
- Sinon, on essaye une autre valeur et s’il n’y en a pas, on revient sur l’affectation précédente
Complexité (temporelle et spatiale) du backtrack
Soit n = |X|, m = |C|, d = maxi=1..n(D(Xi)),
- Temporelle : O(m×dn)
- Spatiale : linéaire
Défauts de l’algorithme de Backtrack
- Il redécouvre plusieurs fois les mêmes échecs
- Il est limité aux petits problèmes par sa complexité
Qu’est-ce qu’un tuple support ?
Un tuple de la contrainte c est support si toutes ses valeurs sont bien dans les domaines des variables concernées et s’il satisfait c
Qu’est-ce qu’une valeur viable ?
Une valeur d’un domaine qui est contenue dans au moins un tuple support de chaque contrainte qui porte sur la valeur à laquelle elle est associée
Qu’est-ce qu’un domaine arc-cohérent ?
Un domaine dont toutes les valeurs sont viables
Comment obtenir la fermeture arc-cohérente d’un domaine ?
En supprimant au fur et à mesure toutes ses valeurs non-viables
Quels liens existent entre l’arc-cohénce et la cohénce ?
- Sol(X, D, C) = Sol(X, DAC, C)
- Cohérent ⇒ Arc-cohérent
- Arc-cohérent !⇒ Cohérent
Algorithme AC3 (entrée, sortie, algorithme)
- Entrée : Problème N = (X, D, C)
- Sortie : booléen
- Algorithme :
- Q ← {(xi, c) | c ∈ C, xi ∈ portée(c)}
- Tant que Q != ∅ :
- Supprimer (xi, c) de Q
- Si Revise(xi, c) :
- Si D(xi) = ∅, renvoyer faux
- Sinon, Q ← Q ∪ {(xj, c’) | c’ ∈ C, {xi, xj} ⊆ portée(c’), i != j}
- Renvoyer vrai
Algorithme Revise3 (entrée, sortie, algorithme)
- Entrée : Variable xi, Contrainte cij
- Sortie : booléen
- Algorithme :
- Change ← Faux
- Pour chaque valeur vi de D(xi) :
- vj ← first(D(xj))
- Tant que vj != nil et ¬cij (vi, vj ) :
- vj ← next(vj, D(xj))
- Si vj = nil
- D(xi) ← D(xi) \ {xi}
- Change ← Vrai
- Renvoyer Change
Algorithme Revise3 (entrée, sortie, algorithme)
- Entrée : Variable xi, Contrainte cij
- Sortie : booléen
- Algorithme :
- Change ← Faux
- Pour chaque valeur vi de D(xi) :
- vj ← first(D(xj))
- Tant que vj != nil et ¬cij (vi, vj ) :
- vj ← next(vj, D(xj))
- Si vj = nil
- D(xi) ← D(xi) \ {xi}
- Change ← Vrai
- Renvoyer Change
Quels sont les défauts d’AC3 ?
Il refait des calculs qu’il a déjà faitn il n’est donc pas optimal
Qu’est-ce qui change dans l’algorithme d’AC2001 par rapport à celui d’AC3 ?
AC2001 apporte la notion de “last” qui enregistre le dernier tuple support vérifié pour chaque couple (xi, c), de façon à reprendre à cet endroit là pour tester seulement les couples qui n’ont jamais été testé
Algorithme Revise2001 (entrée, sortie, algorithme)
- Entrée : Variable xi, Contrainte cij
- Sortie : booléen
- Algorithme :
- Change ← Faux
- Pour chaque valeur vi de D(xi) telle que Last(xi, vi, xj) !∈ D(xj) :
- vj ← next(Last(xi, vi, xj), D(xj))
- Tant que vj != nil et ¬cij (vi, vj ) :
- vj ← next(vj, D(xj))
- Si vj != nil
- Last(xi, vi, xj) !∈ D(xj) ← vj
- Sinon :
- D(xi) ← D(xi) - {xi}
- Change ← Vrai
- Renvoyer Change
Complexité (temporelle et spatiale) d’AC3
Soit n = |X|, m = |C|, d = maxi=1..n(D(Xi)),
- Temporelle : O(m×d3) pour des contraintes binaires
- Spatiale : O(m)
Complexité (temporelle et spatiale) d’AC2001
Soit n = |X|, m = |C|, d = maxi=1..n(D(Xi)),
- Temporelle : O(m×d2) pour des contraintes binaires
- Spatiale : O(m×d)
Qu’est-ce qu’un “removal event” ?
Une fonction qui réduit les domaines d’une certaine façon
Quels sont les principaux “removal event ?
- remValue qui supprime une valeur
- incMin qui supprime la plus petite valeur
- decMax qui supprime la plus grande valeur
- instantiate qui réduit le domaine à un singleton
Quand est-ce qu’un réseau est arc-cohérent ?
Quand pour tout ensemble de variables de taille k-1, pour toute instanciation localement consistante sur cet ensemble, toute variable n’y appartenant pas a au moins une valeur de son domaine qui permet d’étendre l’instanciation sans perdre la cohénrence
Comment la 2-cohérence (2C) et l’arc-cohérence (AC) sont elles comparables ?
Pour les réseaux binaires :
- Si le réseau est normalisé, 2C = AC
- Sinon, 2C est plus fort que AC
Pour les réseaux non-binaires :
- Si le réseau est normalisé, 2C est moins fort que AC
- Sinon, 2C et AC sont incomparables
Qu’est-ce qu’une réseau fortement k-cohérent ?
Un réseau j-cohérent pour j=1..k
Complexité (temporelle et spatiale) du calcul de la k-cohérence forte
Soit n = |X|, m = |C|, d = maxi=1..n(D(Xi)),
- Temporelle : O(nk+1×dk+1)
- Spatiale : O(nk-1×dk-1)
ou
- Temporelle : O(nk×dk)
- Spatiale : O(nk×dk)
Qu’est-ce qu’une instanciation globalement cohérente ?
Une instanciation qui peut être étendue à une solution
Qu’est-ce qu’un réseau globalement cohérent ?
Un réseau dans lequel toute instanciation localement cohérente est globalement cohérente
Quel lien peut-on établir entre la cohérence globale et le Backtrack ?
Il n’y a jamais besoin de backtracker dans un réseau globalement cohérent
Quel lien peut-on établir entre la cohérence globale et la k-cohérence forte ?
Un réseau est globalement cohérent si et seulement s’il est fortement n-cohérent avec n = |X|