• Aucun résultat trouvé

Nogood Based Asynchronous Forward Checking AFC-ng

ng

L’algorithme AFC-ng [EWBBB09, EWBBB13] combine l’avantage d’attribuer des valeurs compatibles avec les anciennes affectations et de propager les instancia- tions en avant de manière asynchrone. Les affectations dans AFC-ng sont effectuées par plusieurs agents à la fois, mais seulement le plus court CPA est maintenu en profondeur. L’opération de backtrack est déclenchée si un dead-end est détecté par une variable future. Les agents assignent leurs variables seulement quand ils tiennent l’affectation partielle courante (CPA) qui est envoyée par l’agent d’ordre supérieur le plus proche, et tentent de l’étendre à une solution complète en attribuant leurs variables. Cet algorithme s’exécute sur chaque agent en échangeant les types de messages suivant :

— CPA : un message qui porte l’affectation partielle courante et qui est transmis aux agents moins prioritaires. Selon l’ordre des agents, le récepteur va essayer

74 IV.3 La résolution d’un problème DisCSps d’étendre le cpa (s’il est l’agent suivant dans l’ordre) ou d’effectuer la phase de forward checking.

— NGD : message qui contient le nogood résolu qui signale l’incohérence. Il est envoyé au dernier agent affecté dans le Rhs(nogood).

— STP : message qui informe les agents soit si la solution est trouvée ou le problème est insoluble.

Le forward checking est effectuée comme suit : Chaque agent qui affecte sa va- riable, envoie des copies de cpa dans des messages CPA à tous les agents non affectés. Les agents qui reçoivent le message CPA mettent à jour leurs domaines, en enlevant toutes les valeurs non viables et seul le prochain agent dans l’ordre a le privilège d’y attribuer sa variable. Un agent qui génère un domaine vide suite à cette opération, envoie le cpa dans un message NGD, faisant ainsi un backtrack avec un nogood de résolution. Le récepteur du message NGD génère un nouveau cpa et continue la recherche. Le vieux cpa est détecté comme obsolète et jeté en utilisant la méthode time-stamp suivante :

— Le time-stamp est un tableau de compteurs, un compteur unique pour chaque agent.

— Un agent incrémente son compteur quand il effectue une affectation.

— Lorsque deux cpa sont comparés, le plus à jour est celui dont le time-stamp est le plus grand lexicographiquement.

Les algorithmes 11 et 12 présentent les principales procédures de l’algorithme AFC-ng. Tout d’abord, chaque agent génère un AgentView vide (ligne 1) avec des compteurs mis à zéro et un drapeau de consistance (initialement mis à True) qui indique si le cpa est cohérent (ligne 2). Deuxièmement, l’agent initializer (IA) lance la recherche en faisant appel à la procédure Assign() et les autres agents attendent la réception des messages pour faire appel à la procédure correspondante au type approprié au message reçu.

La procédure Assign() essaye de trouver une solution pour son problème local qu’elle n’est pas en conflit avec les affectations précédentes sur le cpa. Si l’agent réussit, il incrémente son time-stamp et envoie en avant le cpa à tous les agents non instanciés (lignes 30). Un agent annonce la solution quand le cpa contient les affectations de tous les agents du système (ligne 18). Si l’agent échoue, il fait appel à la procédure Backtrack(), après avoir mettre à jour son AgentView par le cpa reçu (ligne 31).

La procédure backtrack() est lancée par l’agent qui a détecté le dead-end. Si le nogood résolu est vide (lignes 21-22), un message STP est diffusé dans le réseau.

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

ALGORITHM 11: Algorithme AFCng (1ère partie) procedure start()

1. AgentView ← {(Aj, ∅, 0)| Aj ≺ Ai} ; 2. end ← false ;

3. AgentView.consistent ← true ; 4. if (Ai = IA) then Assign(); 5. while (¬ end) do

6. msg ← getMsg() ;

7. switch (msg.type) do

8. CPA : ProcessCPA(msg) ; 9. NGD : ProcessNGD(msg) ;

10. STP : end ← true ; if (msg.cpa Ó= ∅) then solution ← msg.cpa; procedure ProcessCPA(cpa, next)

11. if (¬ AgentView.consistent & AgentView ⊂ cpa) then 12. return

13. if (msg.cpa is stronger than AgentView) then 14. AgentView.consistent ← true ;

15. UpdateAgentView(msg.cpa) ; 16. Revise() ;

17. if (Di = ∅) then 18. Bachtrack()

19. else if (Ai = next) then 20. CheckAssign(msg.sender)

procedure ProcessNGD(msg)

21. if (Compatible(msg.Nogood, AgentView )) then 22. add(msg.nogood, NogoodStore) ; 23. if (rhs(msg.Nogood).value = vi) then 24. myValue ← empty ; 25. Assign() procedure SendCPA(cpa) 26. if (size(cpa) = n) then 27. sendMsg : STP() 28. else 29. foreach Aj ≻ Ai do 30. sendMsg : CPA(cpa) to Aj

Sinon, l’agent met à jour son AgentView et son NogoodStore et met son flag de consistance à la valeur False (lignes 24-27). Par conséquence, le Nogood résolu est envoyé dans le message NGD à l’agent coupable (c’est-à-dire Rhs(Nogood)).

Chaque fois qu’un agent reçoit un message CPA, la procédure ProcessCPA(msg) est appelée. Si le cpa n’est pas cohérent et l’AgentView est un sous-ensemble du cpa, cela signifie que Ai a déjà fait un backtrack(), donc Ai ne fait rien (ligne 10).

76 IV.3 La résolution d’un problème DisCSps est le plus récent, alors Ai met à jour son AgentView (stocke le cpa) et le marque

cohérent. Ensuite, Ai appelle la fonction Revise() pour filtrer son domaine initial

en utilisant l’heuristique HPLV (ligne 12) qui stocke pour chaque valeur enlevée le meilleur nogood. Quand toutes les valeurs de la variable/agent Ai sont exclues (ligne

13), la procédure Backtrack() est déclenchée. Autrement, Ai appelle la procédure

CheckAssig(msg.sender) pour vérifier s’il est l’agent suivant dans l’ordre (ligne 14). La procédure updateAgentView() est appelée quand un cpa en forward est reçue.

Ai adapte son AgentView et le NogoodStore pour être compatible avec l’affectation

partielle reçues (lignes 34-39).

Si l’agent Ai reçoit un message NGD, il examine la validité du cpa reçu en

utilisant le statut AgentView et le time-stamp (ligne 15). Une fois le nogood est accepté, Ai l’ajoute dans son NogoodStore, supprime sa dernière affectation et puis

appelle la procédure Assign() (ligne 17).

Documents relatifs