3. Algorithmes de recherche dans les systèmes à agents
3.3. Le problème de la satisfaction des contraintes (PSC)
3.3.3. L`algorithme de recherche par engagement minimum (REM)
Il se ressemble à l'algorithme précédent avec les
différences suivantes
- la priorité de chaque agent peut se modifier durant l`exécution
de l`algorithme;
- chaque agent envoie sa valeur vers tous les nœuds avec lesquels il
est lié par un arc de contrainte, quelle que soit la priorité
(dans l'algorithme Retour en arrière asynchrone, la valeur courante
était transmise seulement par les nœuds ayant une priorité
inférieure à celle du nœud émetteur)
- les messages de type “correcte_?” communiquent la valeur courante
ainsi que la priorité du nœud émetteur ;
- - si un agent ne peut pas obtenir la consistance (il y a des contraintes
non satisfaites avec des variables de priorités plus grandes),
alors il va choisir pour sa variable propre la valeur qui minimise le
nombre de contraintes non satisfaites avec les agents de priorité
plus faible
- si on ne trouve aucune valeur consistante avec la liste état_des_voisins,
l`agent incréments sa priorité (+1).
Le processus de traitement des messages peut être représenté
par le pseudo code suivant.
Procédure Réception_correcte_?_ (xj,
dj, priorité) est
// La procédure est appelée à l`arrivée d`un
message
// de type “correcte_?” émis par le nœud xj qui transmet
// sa nouvelle valeur dj et sa priorité au nœud courant
(xi)
// qui a un rôle d'évaluateur de contrainte
//
Insert (état_des_voisins, (xj, dj
, priorité) )
Vérifie_état_des_voisins()
Fin
La procédure Réception_incorrect_ (xj
, E) est
// La procédure est appelée à l`arrivée d`un
message
// de type incorrect émis par le nœud xj qui a un rôle
// d`évaluateur de contrainte pour le nœud courant (xi)
// E = {(xk, dk, pk)/ dk est
une valeur incorrecte pour le nœud xk
// pk est la priorité de xk
}
pour *) "(xk, dk)ÎE faire
Insert ( valeurs_refusées, (xk,
dk , pk ) )
si *) le nœud (xk) n`est pas
voisin du nœud courant (xi) alors
*) insérer le nœud (xk) dans la liste
des voisins de (xi)
Insert (état_des_voisins,
(xk, dk, pk) )
fin si
fin pour
Vérifie_état_des_voisins()
Fin
Procédure Vérifie_état_des_voisins() est
si *)la valeur_courante n`est pas consistante avec la liste
état_des_voisins alors
si *)aucune valeur de Di n`est consistante
avec la liste état_des_voisins alors
RetourEnArrière()
sinon
valeur_courante = Choix_valeur_consistante_Min (Di
, état_des_voisins)
pour *) "(xj) Î voisins(xi)
faire
Envoyer (“correcte_?”, xj, (xi
, valeur_courante, priorité_courante ))
fin pour
fin si
fin si
Fin
Procédure RetourEnArrière() est
F = { A / A un sous-ensemble inconsistant qui se trouve dans
l`état_des_voisins }
si F = f alors
*) émet des messages aux autres agents en annonçant
qu`il n`existe pas de solution
*) termine l`algorithme
fin si
pour *) "A Î F non-envoyé par xi
jusqu`à ce moment faire
Insert (incorrecte_envoyés, A)
pour *) "(xj, dj,
pj) Î A faire
Envoyer (incorrect, xj, (xi ,
A))
fin pour
fin pour
pmax = max ({pj / (xj, dj,
pj) Î état_des_voisins })
priorité_courante = pmax + 1
valeur_courante = Choix_valeur_consistante_Min (Di
, état_des_voisins)
pour *) "(xj) Î voisins(xi)
faire
Envoyer (“correcte_?”, xj, (xi , valeur_courante,
priorité_courante))
fin pour
Fin
La fonction Choix_valeur_consistante_Min (Di , état_des_voisins)
cherche une valeur consistante avec les contraintes où sont impliquées
les variables qui se trouvent dans les nœuds de priorité plus grande
que le nœud courant et qui minimisent le nombre de contraintes non satisfaites
avec les variables des agents de priorité plus petite.
Analyse de l`algorithme R.E.M.
Complétude – l`algorithme est complet ;
Complexité en temps – exponentielle dans le nombre des variables,
n ;
Complexité en espace – exponentielle en n ;
Pour montrer que l`algorithme est complet il faut observer qu`à
un certain moment les priorités ne se modifient plus. Si les priorités
sont stables alors
- il n'existe pas d'agents avec des variables qui ne satisfont pas les
contraintes
- il n`existe pas de cycles infinis par la transmission répétée
de messages.
L`algorithme s `arrêtera en temps fini s`il a trouvé
une solution où s`il n`y a pas de solution.
Question.
Comment peut-on justifier l`affirmation que les priorités deviennent
stables à un certain moment ?
Exemple. On considère le problème de la disposition
des reines sur un échiquier de 4x4. L`état initial est présenté
figure 3.3.7. Les positions des reines sont données par les valeurs
courantes des quatre agents x1, x2, x3,
x4 qui ont initialement des priorités nulles.
Figure 3.3.7. L`état initial
du système à agents pour la résolution du problème
à 4 reines
Dans l`état initial seulement la valeur courante de l`agent x4
n`est pas consistante. Ensuite le processus se déroule
conformément à la description qui suit.
L`agent x4
- exécute la procédure RetourEnArrière() et envoie
des messages de type incorrect aux agents x1 et x2
- sa priorité devient 1 (pmax=0)
- valeur_courante = Choix_valeur_consistante_Min([0,3],état_des_voisins)
(la seule valeur possible est 2, qui ne respecte qu`une seule contrainte
– avec l`agent x3)
- communique aux voisins, par messages de type “correcte_?”, sa nouvelle
valeur courante et sa priorité.
Les agents x1 et x2
- reçoivent le message de type incorrect et celui de type “correcte_?”
émis par l`agent x4;
- on suppose que le deuxième message est arrivé suffisamment
vite pour que la procédure Vérifie_état_des_voisins()
soit démarrée après l`arrivée du message
de type “correcte_?”; en ce cas la procédure observe que
les valeurs courantes sont consistantes.
Remarque. Après la réception du message de type
incorrect l`activité de ces deux agents peut se dérouler
simultanément avec l`activité de l`agent x4
L`agent x3
- reçoit le message de type “correcte_?” émis par l`agent x4
et constate que sa valeur courante ne vérifie pas une contrainte
avec un agent plus prioritaire (x4)
- on appelle la procédure RetourEnArrière() et envoie
un message de type incorrect à l`agent x4
- sa priorité devient 2 (pmax=1, la priorité de x4);
parce que l`agent x4 a communiqué par un message
de type “correcte_?”, sa nouvelle priorité, la détermination
de pmax est locale et ne nécessite pas d'autres ressources
de communication
- valeur_courante = Choix_valeur_consistante_Min([0,3],état_des_voisins)
(deux valeurs sont possibles, 0 et 1, qui minimisent le nombre de
contraintes non satisfaites avec les agents x1,x2
et x4: on suppose que la valeur 0 est sélectée)
- communique aux voisins, par messages de type “correcte_?”, sa
nouvelle valeur courante et sa priorité
L`agent x4
- reçoit le message de type incorrect et celui de type "correcte_?"
émis par l'agent x3; leur arrivée est supposée
séparée par un très petit délai, de sorte
que l'effet du premier message est annulé par le deuxième.
L`agent x1
- reçoit le message de type incorrect et celui de type “correcte_?”
émis par l`agent x3;
- exécute la procédure Vérifie_état_des_voisins()et
modifie sa valeur à 1; on a alors trouvé une solution
du problème
Remarque. Il n`est pas obligatoire que le fonctionnement du réseau
de communication et la procédure de sélection Choix_valeur_consistante_Min()
soient identiques dans tous les cas. Il peut exister des différences
entre les successions des événements, mais l`algorithme
se terminera avec le même résultat.
Question.
La complexité exponentielle en espace mémoire peut engendrer
des problèmes aux systèmes avec beaucoup d'agents. Comment
croyez-vous qu'on peut lever cet obstacle ?
|