Algorithme itératif affichant une seule solution
Entrée: X la liste des variables, de leur valeurs, de leurs domaines et d'un sous ensemble des contraintes les concernant
- Code:
-
début
Xi = premiereVariable(X);
tant que Xi != NULL{
tant que booléen = affecter_valeur(Xi){
booléen = vérifier_les_contraintes(Xi);
si booléen == true
break;
}
si booléen == true
Xi = suivant(Xi);
sinon
Xi = précédent(Xi);
}
si booléen == true
afficher_valeurs(X);
sinon
printf("pas de solution");
fin
principe de l'algo:
X est une liste doublement chainée terminée par NULL des deux côtés
il y a deux cas d'arrêts de la première boucle:
- car on tombe sur le pointeur NULL après la dernière variable: cela veut dire qu'on a affecté chaque variable, et que le résultat de vérifier_les_contraintes(Xi) à toujours donné true, donc on a une solution
- car on tombe sur le pointeur NULL avant la première variable: cela veut dire qu'on a testé toutes les valeurs possibles pour la première variable mais que ça fonctionnais pas donc qu'il n'y a aucune solution
dans la deuxième boucle, la fonction affecter_valeur renvoi 1 si elle réussit à mettre dans Xi->valeur une valeur, 0 si il n'y a plus de valeur à affecté (on peut par exemple savoir s'il ne reste plus de valeur en les affectant par ordre croissant et en regardant la valeur actuelle de Xi->valeur)
il y a deux manière de quitter cette deuxième boucle:
-les contraintes avec la valeur sont respectées et on emprunte le break et le booléen vaut true
-la fonction n'arrive affecter_valeur n'arrive pas à affecter une autre valeur et le booléen vaut false
en sortant de la boucle incluse, si le booléen vaut true, il faut passer à la variable suivante
si le booléen vaut false, c'est qu'aucune valeur ne satisfait les contraintes étant donnée les affectations actuelle des variable. il faut donc tenter d'affecter une valeur différente à la variable précédente
en sortant de la boucle principale, le booléen indique toujours si la dernière affectation à vérifier les contraintes ou non, donc cela indique si on a dans les variables une solution du CSP si c'est true, ou alors qu'il n'en existe pas si c'est false
Algorithme itératif affichant toutes solutions
Entrée: X la liste des variables, de leur valeurs, de leurs domaines et d'un sous ensemble des contraintes les concernant
- Code:
-
début
Xi = premiereVariable(X);
dernier = derniereVariable(X);
existeSolution = true;
tant que existeSolution{
tant que Xi != NULL{
tant que existeSolution = affecter_valeur(Xi){
existeSolution = vérifier_les_contraintes(Xi);
si existeSolution == true
break;
}
si existeSolution == true
Xi = suivant(Xi);
sinon
Xi = précédent(Xi);
}
si existeSolution == true{
afficher_valeurs(X);
Xi = dernier;
}
sinon
printf("plus de solution");
}
fin
le principe est pareil que l'algo précédent
en plus ici, dès qu'on trouve une solution, c'est à dire que notre booléen vaut true, alors notre Xi qui vaut NULL redevient la dernière variable pour continuer la recherche de solution