• Aucun résultat trouvé

PAR CONTRAINTES

61 3.2.7 L'opérateur de remplacement

3.3 La programmation par contraintes

3.3.1 La recherche systématique

Une solution au CSP peut être trouvée en cherchant systématiquement parmi toutes les affectations possibles des valeurs aux variables. Les méthodes de recherche utilisées pour cela se divisent en deux catégories. La première catégorie regroupe les méthodes qui parcourent l'espace de recherche composé des solutions complètes pour lesquelles une

valeur est affectée à toutes les variables. La deuxième catégorie regroupe, quant à elle, les méthodes qui parcourent l'espace de recherche composé de solutions partielles pour lesquelles une partie des affectations est effectuée. Par la suite, ces méthodes étendent les solutions partielles pour obtenir des solutions complètes en prolongeant l'affectation partielle de valeurs. Il existe plusieurs algorithmes de résolution de CSP évoluant par le biais de recherche systématique d'affectation de valeurs aux variables. Certains de ces algorithmes garantissent de trouver une solution, si elle existe, ou prouvent que le problème étudié est insoluble. Ainsi, la recherche systématique est complète. Le principal désavantage de ces méthodes est qu'elles exigent énormément de temps de calcul. De même, ces méthodes utilisent généralement le composant de retour en arrière dans la recherche dans un arbre comme mécanisme de correction d'une décision prise antérieurement. Nous décrivons, dans la prochaine sous-section, quelques méthodes de recherche systématique.

3.3.1.1 Générer et Tester

La méthode Générer et Tester (GT) tient ses origines des approches mathématiques pour résoudre des problèmes combinatoires. C'est un algorithme typique de recherche complète dans l'espace de solutions. D'abord, l'algorithme génère quelques affectations complètes de variables et vérifie si celles-ci satisfont toutes les contraintes. Si ce test échoue, il existe alors des contraintes insatisfaites. L'algorithme essaie alors d'autres affectations et s'arrête dès qu'une affectation complète et satisfaisante pour toutes les contraintes est trouvée. Cette affectation représente une solution au problème. Dans le cas où toutes les affectations sont explorées et qu'aucune d'elles ne satisfait toutes les contraintes, le problème n'admet alors aucune solution. L'algorithme GT cherche

67 systématiquement dans l'ensemble de l'espace de solutions en explorant toutes les combinaisons possibles des affectations de variables. Le nombre de ces combinaisons est égal à la taille du produit cartésien de tous les domaines des variables.

Le principal inconvénient pour utiliser cette méthode est le fait de générer plusieurs affectations de valeurs aux variables qui sont rejetées lors de la phase de test. De plus, le générateur d'affectations de variables utilisé est aveugle. En effet, s'il existe déjà des instanciations conflictuelles, cela ne l'empêche pas d'en générer d'autres. Pour remédier à cela, il est possible de limiter la taille du générateur ou de fusionner la partie de génération avec celle du test.

3.3.1.2 Le retour arrière

L'algorithme le plus connu et utilisé en programmation par contrainte pour faire une recherche systématique est sans doute le retour-arrière (BackTraking) (BT) [Gaschnig, 1978]. Le BT essaie d'étendre progressivement une solution partielle qui spécifie les valeurs consistantes ou encore cohérentes de certaines variables jusqu'à l'obtention d'une solution complète. Pour cela, le BT choisit des valeurs pour les variables non instanciées qui soient consistantes avec celles de la solution partielle. La consistance implique qu'aucune des contraintes n'est violée. Le BT peut être considéré comme la fusion des phases de génération et de test de GT. Dans le BT, les variables sont instanciées de façon séquentielle et, dès que toutes les variables pertinentes à une contrainte sont instanciées, la validité de la contrainte est vérifiée. Si une affectation partielle viole une contrainte, le retour arrière est effectué vers la dernière variable instanciée qui possède d'autres possibilités d'instanciation. Ainsi, à chaque retour arrière, un sous-espace du produit cartésien des domaines des variables est éliminé.

Conséquemment, le BT est de loin supérieur au GT. Cependant, la complexité de son fonctionnement non trivial est encore exponentielle pour la plupart des problèmes. Ces algorithmes sont également appelés, dans leur forme la plus simple, algorithmes à retour arrière chronologique du le fait qu'ils vont chercher la dernière variable instanciée.

Le BT, dans sa forme standard, comporte trois principaux inconvénients. En effet, le BT standard n'identifie pas la raison réelle du conflit créé. Ainsi, la recherche dans différentes régions de l'espace peut produire des échecs de test pour les mêmes raisons.

Le BackJumping (Bf), décrit plus loin, également appelé BT Intelligent, peut remédier à cet inconvénient. Le deuxième inconvénient du BT est d'avoir à effectuer des actions redondantes. En effet, même si les conflits sont détectés, ils ne sont pas sauvegardés pour des actions ultérieures. Les méthodes pour résoudre ce problème sont appelées BackChecking ou BackMarking. Le dernier inconvénient est la détection tardive des conflits auxquels il est possible de remédier avec les techniques de vérification de consistance abordées dans les prochaines sections.

3.3.1.3 Le BackJumping

Le premier inconvénient du BackTracking cité plus haut peut être résolu par le BackJumping [Gaschnig, 1979] puisque leur fonctionnement est identique à l'exception dans la phase de retour en arrière. Les deux algorithmes traitent une variable à la fois et cherchent une valeur qui satisfait toutes les contraintes et ne génère aucun conflit.

Toutefois, si le BJ constate une incohérence, il analyse la situation afin d'identifier la source de cette incohérence. Il utilise les contraintes violées pour déterminer la variable conflictuelle. Si toutes les valeurs du domaine sont explorées, alors le BJ fait un retour en arrière vers la variable conflictuelle la plus récente. C'est la principale différence avec le

69 BT qui, lui, fait un retour en arrière vers la dernière variable instanciée. Il existe des améliorations au 5 J comme le Graph-Based BackJumping [Dechter, 1990] qui fait un retour en arrière vers la variable la plus récente qui contraint la variable courante.

3.3.1.4 Le BackMarking

Le deuxième inconvénient du BT est d'effectuer des actions redondantes. Il est possible de résoudre ce problème par deux méthodes appelées respectivement BackCheking (BC) et BackMarking {BM). Le BC et son descendant le 5Msont tous deux des algorithmes utilisés pour réduire la compatibilité des tests de cohérence. Si le BC trouve, par exemple, qu'une étiquette Y/b (affectation de la valeur b à la variable Y) est incompatible avec une récente étiquette X/a, alors il se rappellera de cette incompatibilité.

Ainsi, tant que l'étiquette X/a est existante, Y/b ne sera plus considéré. Le BM [Elliot, 1980] est une amélioration du BC qui permet d'éviter certaines vérifications de contraintes redondantes telles que la découverte d'inconsistances redondantes. Il réduit le nombre de contrôles de compatibilité en se souvenant de chaque étiquette incompatible avec les dernières étiquettes. Il empêche également la répétition des vérifications fructueuses qui ont été effectuées auparavant.

3.3.1.5 Autres techniques de recherche

II existe plusieurs autres techniques de parcours d'un espace de recherche. Une bonne description des différentes techniques de recherche en largeur {Depth-First Search {DFS)) peut être trouvée dans Frost et Dechter [1998]. Le BJ introduit par Gaschnig [1979] et amélioré par Ginsberg [1993] a été également appelé le BT dynamique. Outre un DFS complet, il existe plusieurs techniques incomplètes, tels le DBS {Depth-Bounded Search) [Cheadle et al, 2003] ou la recherche par crédit [Beldiceanu et al, 1997].

Plus récemment, des techniques de recouvrement d'échec d'une valeur heuristique, appelées méthodes à divergences limitées, sont devenues de plus en plus populaires et utilisées. La première méthode, Limited Discrepancy Search (LDS), proposée initialement par Harvey [1995] et reprise dans Ginsberg et Harvey [1995], s'appuie sur des heuristiques de parcours de l'arborescence pour assurer l'ordre de prise en considération des variables et celui pour l'instanciation de ces variables. UILDS (Improved Limited Discrepancy Search) [Korf, 1996], qui est une amélioration de LDS, évite la redondance dans le parcours de l'arbre. Le DDS (Depth-Bounded Discrepancy Search) [Walsh, 1997] est également une amélioration du LDS, qui consiste à limiter la génération des solutions à une profondeur donnée. Finalement, le CDS (Climbing Discrepancy Search) est une méthode de recherche locale qui adapte la notion de divergence afin de trouver une bonne solution à des problèmes d'optimisation combinatoire [Milano et Roli, 2002]. Le CDDS (Climbing Depth-Bounded Discrepancy Search) [Hmida et al, 2007] est une adaptation du CDS qui limite la profondeur de génération des solutions comme le DDS.

Nous décrivons, dans la prochaine section, les techniques de vérification de consistance qui sont une autre méthode de résolution d'un CSP.