• Aucun résultat trouvé

Au début des années 90, l’algorithme Asynchronous Backtracking (ABT) était le pionnier algorithme complet de la recherche asynchrone pour résoudre des DisCSP. Cet algorithme est devenu la référence pour la conception de tout nouvel algorithme de résolution DisCSP. ABT est un algorithme asynchrone exécuté d’une manière autonome et asynchrone par chaque agent dans le réseau. Chaque agent prend ses propres décisions, informe les autres agents sur ces décisions, et aucun agent ne doit attendre les réponses des autres pour faire sa tâche. Cette tâche consiste à trouver une affectation satisfaisant les contraintes avec ses voisins plus prioritaires. L’algorithme ABT exige que les contraintes soient dirigées. Une contrainte cause une liaison orientée entre les deux agents contraints : l’agent envoyant la valeur de lequel le lien part, et l’agent évaluant la contrainte auquel le lien arrive. Un ordre total est établi entre les agents pour former un graphe acyclique. Quand un agent

Ai instancie une valeur, il informe un agent Aj moins prioritaire que lui. Ce dernier

va essayer à son tour de trouver une valeur consistante avec celle prise par Ai. Si Aj

ne peut pas trouver aucune valeur à sa variable, il fait un retour en arrière à l’agent

Ai par envoie d’un message de type spéciale.

L’algorithme ABT [YDIK92, Y00, BMBM05] est exécuté sur chaque agent, en gardant sa propre vue sur les agents les plus prioritaires et une liste des nogoods. Étant donné un agent générique Ai, la structure AgentView est l’ensemble des va-

leurs attribuées aux agents plus prioritaires que Ai et ayant une contrainte avec lui.

La liste NogoodStore est la liste des justifications des valeurs interdises, gardées par

Ai. Les agents échangent des instanciations et des nogoods. L’ABT accepte toujours

des nouvelles instanciations, en mettant à jour son AgentView. En conséquence, lors de la réception d’un nogood, il est accepté s’il est cohérent avec l’AgentView de Ai,

autrement, il est abandonné comme obsolète. Quand un agent n’arrive pas à trouver une valeur consistante avec son AgentView, à cause des contraintes originales ou des nogoods reçus, il déclenche un backtrack en générant un nouveau nogood à partir de son AgentView et en l’envoyant à l’agent le plus proche inclut dans le nogood pro- duit. Si Ai reçoit un nogood qui inclut un agent non relié avec lui, Ai exige l’ajout

d’un lien de cet agent à Ai. Le processus termine lors du silence dans le réseau

(solution trouvée), ou quand un nogood vide est produit (problème insoluble). C. Bessiere et al [BMBM05] ont proposé un cadre unificateur pour la recherche arborescente asynchrone dans un réseau de contraintes distribuées. Cet algorithme appelé ABTkernel inclut les principes fondamentaux d’ABT. A partir d’ABTkernel,

69 IV.3 La résolution d’un problème DisCSps les types de messages suivants

— ok ? : Il informe Ai que Aj a fait une nouvelle affectation.

— ngd : Il informe Ai que Aj a trouvé un nogood comme une cause de l’incon-

sistance et il exige que Ai ne doit pas prendre rhs(nogood). Ce message est

envoyé quand Aj n’a plus de valeurs consistantes avec son AgentView, et Ai

est l’agent le plus proche inclus dans le nogood généré.

— stp : Il informe Ai qu’aucune solution n’existe et qu’il doit donc s’arrêter.

Ce message se produit entre les agents normaux et un agent supplémentaire appelé system.

L’ensemble du processus est illustré dans l’algorithme 9 et 10.

Les messages de type ok ? sont traités par la procédure ProcessInfo(msg) et ils sont toujours acceptés. Après la réception d’un message de type ok ?, Ai mis à

jour son AgentView pour inclure la nouvelle affectation et pour éliminer tout no- good incohérent avec l’AgentView. Puis, Ai cherche une valeur consistante avec son

AgentView (ligne 14). La procédure CheckAgentView() vérifie si la valeur courante de Ai est encore consistante (ligne 8). Si non, il essaie de sélectionner une nouvelle

valeur (ligne 9). Dans ce processus, quelques valeurs de Ai peuvent paraître comme

étant inconsistantes. Les nogoods qui justifient leurs élimination sont ajoutés au NogoodStore (ligne 26). Si une nouvelle valeur consistante est trouvée, cette affec- tation est notifiée à tous les agents moins prioritaires que Ai à travers des messages

de type ok ? (lignes 10-11). Autrement, Ai doit lancer un backtrack (ligne 13). La

procédure Backtrack() produit un nouveau nogood par la résolution des nogoods existants dans le NogoodStore de Ai (ligne 21). Si le nouveau nogood est vide, un

message de type stp est envoyé à l’agent system et le processus s’arrête (ligne 22). Autrement, le nouveau nogood est envoyé dans un message de type ngd à l’agent qui paraît dans son rhs. La valeur de cet agent est supprimée de l’AgentView et une nouvelle valeur consistante est sélectionnée (ligne 23).

Les messages de type ngd sont traités par la procédure ResolveConflict(). Un message de type ngd venant de Aj est accepté si le nogood inclus dans ce message a

les mêmes affectations que celle de Aiet des agents plus prioritaires que Ai(ligne 15).

Dans ce cas, les affectations des variables inclus dans le nogood et non liées à Ai sont

prises pour mettre à jour l’AgentView (ligne 27). Le nogood est enregistré comme étant une justification d’élimination de la valeur actuelle de Ai. Une nouvelle valeur

consistante est cherchée (ligne 17). Si le message n’est pas accepté, il est considéré obsolète. Ainsi, si la valeur de Ai est correcte dans le nogood reçu, Ai renvoie sa

70 IV.3 La résolution d’un problème DisCSps

ALGORITHM 9: Algorithme ABT (1ère partie) procedure ABTkernel()

1. myValue←empty ; 2. end←false ; 3. CheckAgentView() ; 4. while (¬ end) do 5. msg←getMsg() ; 6. switch (msg.type) do 7. ok ? : ProcessInfo(msg) ; 8. ngd : ResolveConflict(msg) ; 9. stp : end ← true ; procedure CheckAgentView(msg) 10. if (¬ consistent(myValue,myAgentView) then 11. myValue ← ChooseValue() ; 12. if (myValue) then 13. foreach (child ∈ Γ+ (xi)) do

14. sendMsg :ok ?(child,myValue) ; 15. else 16. Backtrack() ; procedure ProcessInfo(msg) 17. Update(myAgentView,msg.Assig) ; 18. CheckAgentView() ; procedure ResolveConflict(msg) 19. if (Coherent(msg.Nogood, Γ(x i))) then

20. foreach (assig ∈ lhs(msg.Nogood) Γ(x

i)) do 21. Update(myAgentView, assig) 22. add(msg.Nogood,myNogoodStore) ; 23. myValue ← empty ; 24. CheckAgentView() ; 25. else

26. if (msg.sender ∈ Γ+(xi) ∧ Coherent(msg.Nogood, xi) then 27. sendMsg.ok ?(msg.sender,myValue)

de Ai lorsqu’il a envoyé le message ngd. Sinon, Ai ne fait rien parce qu’il y a un

message de type ok ? qui part de Ai vers Aj qui n’est pas encore arrivé.

Un message de type stp signifie qu’un nogood vide a été généré, le problème n’a donc aucune solution et le processus doit s’arrêter. Finalement, le système peut se stabiliser dans un état dans lequel chaque agent a une valeur et aucune contrainte n’est violée. Cet état est une solution globale et le réseau a atteint le silence (quies- cence), qui signifie qu’aucun message ne circule dans le réseau. Un tel état peut être détecté en utilisant des algorithmes spécialisés. Si aucune solution n’existe, un nogood vide sera produit.

71 IV.3 La résolution d’un problème DisCSps

ALGORITHM 10: Algorithme ABT (2ème partie) procedure Backtrack() 25. newNogood ← solve(myNogoodStore) ; 26. if (newNogood = ∅) then 27. end ← true ; 28. sendMsg.stp(system) ; 29. else 30. sendMsg.ngd(newNogood) ; 31. Update(myAgentVew, rhs(newNogood)←unknown) ; 32. CheckAgentView() ; function ChooseValue()

33. foreach (vi ∈ di not eliminated by myNogoodStore) do 34. if (consistent(vi, myAgentView) then

35. return vi; 36. else

37. add(xj = vj ⇒ xi Ó= vi, myNogoodStore) ; 38. return empty ;

procedure Update(myAgentView, newAssig) 39. add(newAssig,myAgentView) ;

40. foreach (ng ∈ myNogoodStore) do

41. if (Coherent(lhs(ng), myAgentView)) then

42. remove(ng,myNogoodStore) ; function Coherent(nogood, agents) 43. foreach (var ∈ nogood ∪ agents) do

44. if (nogood[var] Ó= myAgentView[var]) then 45. return false ;

46. return true ;

Puisque le principal problème de cet algorithme est le manque d’information en provenance des agents de haut niveau, une solution envisageable est d’ajouter des liens de communication dans le réseau formé par les agents, pour apporter au dé- tenteur d’un nogood donné une vue plus précise de l’état global du système et lui permettre de déterminer si ce nogood est valide. Un lien de communication peut être vu comme une contrainte tautologique, ou encore une extension triviale de l’en- semble des voisins de l’agent de haut niveau. Bien que l’ajout de tels liens ne change pas l’espace des solutions pour le problème considéré, il permet au destinataire de défausser systématiquement les informations périmées.

— ABTall : Cet algorithme ajoute tous les liens permanents potentiellement

utiles pendant une phase de pré-traitement. Une approche brutale consisterait relier chaque agent avec tous ses homologues de priorité plus faible, mais c’est plus qu’il n’est nécessaire : deux agents qui ne partagent aucun descendant ne

72 IV.3 La résolution d’un problème DisCSps peuvent pas faire partie d’un même conflit. En revanche, pour chaque paire d’agent partageant un descendant, le plus prioritaire, Ai, doit ajouter l’autre,

Aj, à son ensemble Γ+ pour que Aj puisse traiter les nogoods se référant à

Ai.

— ABT : Cet algorithme ajoute dynamiquement des liens entre les agents. Ces liens sont demandés par l’agent Ai quand il reçoit un message Backtrack

contenant des agents inconnus et au-dessus de Ai dans l’ordre. Les nouveaux

liens sont permanents. Cette approche est adoptée par l’ABT original. — ABTtemp : Cet algorithme ajoute dynamiquement des liens entre les agents,

comme ABT. La différence avec ABT est que les nouveaux liens sont provi- soires. Quand un nouveau lien est placé, il demeure jusqu’à ce qu’un nombre fixe de messages aient été échangés par ce lien. Ensuite, il est enlevé et dé- connecte les deux agents.

— ABTnot : Aucun nouveau lien n’est ajouté entre les agents. Pour réaliser la

complétude, cet algorithme doit enlever l’information obsolète dans un temps fini. Pour cela, quand il fait le retour arrière il oublie tous les nogoods qui pourraient hypothétiquement devenir obsolète.

Figure IV.4(a) illustre un exemple d’exécution de l’algorithme ABT sur une simple instance. Cette instance inclut 3 agents, chaque agent a une seule variable. Leur domaines sont respectivement {1,2}, {2} et {1,2}. Cette instance inclut 2 contraintes x1 Ó= x2 et x2 Ó= x3. Dans la figure IV.4(b), lors de la réception des

messages ok ? de x1 et x2, l’AgentView de x3 sera [x1 = 1, x2 = 2]. Ces affectations

supprime les valeurs 1 et 2 de d3 en sauvegardant deux nogoods comme justification

de suppression (c.-à-d. x1 = 1 ⇒ x3 Ó= 1 respectivement, x2 = 2 ⇒ x3 Ó= 2). Puisque

x3 n’a plus de valeur dans son domaine, il résout ses nogoods en produisant un

nouveau nogood (x1 = 1 ⇒ x2 Ó= 2) (IV.4(c)). Ce nogood est alors envoyé à x2 dans

un message nogood. Lors de la réception de ce message nogood, l’agent x2sauvegarde

ce nogood qui contient l’affectation de l’agent x1 et qu’il n’est pas connecté avec x2

par un lien. Par conséquent, l’agent x2 demande un nouveau lien entre lui et x1 par

l’envoie d’un message addlink (IV.4(d)). L’agent x2 vérifie si sa valeur est consistent

avec son AgentView ([x1 = 1]). Puisque sa seule valeur 2 est éliminé par le nogood

reçu de x3, l’agent x2 résout son NogoodStore en produisant un nouveau nogood, []

⇒ x1 Ó= 1. Ce nogood est ensuite envoyé à l’agent x1 (IV.4(e)). Ce nogood conduira

x1 pour changer sa valeur actuelle, et dorénavant il va envoyer son affectation dans

73 IV.3 La résolution d’un problème DisCSps

Figure IV.4– Exemple d’exécution de l’algorithme ABT

Documents relatifs