Partie II Décompositions fonctionnelles et structurelles, exactes et approchées 53
5.2 Une nouvelle méthode pour le comptage
Les méthodes structurelles comme Btdsont efficaces pour la résolution de Csp structurés. Nous
proposons d’adapter l’algorithme Btd au dénombrement exact de solutions et ainsi évaluer l’intérêt
de l’utilisation de la structure d’une instance pour le comptage de solutions : #Btd.
Comme pourBtd, la première étape de #Btdconsiste à calculer une décomposition arborescente
du graphe de contraintes. Tandis queBtdutilise la notion de good, pour le dénombrement de solutions
nous utilisons la notion de #good. Le but est de sauver le nombre de solutions des sous-problèmes
induits par la décomposition arborescente.
Définition 5.9 #good
Soit une décomposition arborescenteD. Étant donnés le cluster C
iet un de ses filsC
j, un#good est
une paire (A[C
i∩ C
j], nb) avecA[C
i∩ C
j] une affectation consistante surC
i∩ C
jetnbest le nombre de
solutions du sous-problèmeP
A,Ci/Cj.
Reprenons le Csp de la figure 5.3 page précédente. Si nous considérons l’affectation A ={X
4←
a, X5 ← d} sur C
2∩ C
3nous obtenons un #good (A,2) car nous avons deux solutions pour le
5.2. Une nouvelle méthode pour le comptage 99
Algorithme 5: #Btd(A,C
i,X
Ci) : entier
Entrée:
une affectationA
un clusterC
iun ensemble de variablesX
Ci⊆X
Pré-conditions :
X
Cicontient les variables deC
iqui ne sont pas affectés dans A
Post-relations :
renvoie le nombre de solutions du problème enraciné enC
iayant comme affectation partielle A
—————————————————————————————————————————–
if X
Ci=∅then
N bSol←1;
F ←Fils(C
i);
1while F 6=∅ et N bSol6= 0do
Choisir C
jdans F;
F ←F r{C
j};
if (A[C
i∩ C
j], nb) n’est pas un #good dans P then
nb←#Btd(A,C
j,X
Cjr(C
i∩ C
j));
enregistre le #good (A[C
i∩ C
j], nb) deC
i/C
jdansP;
N bSol←N bSol×nb;
2return N bSol;
else
Choisir X∈X
Ci;
N bSol←0;
D←D
X;
3whileD6=∅ do
Choisir v dansD;
D←Dr{v};
4