WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Planification multi-agents pour la composition dynamique

( Télécharger le fichier original )
par Brakni Ilhem
Université de Tébessa -algerie - Ingénieur d'état en informatique 2010
  

précédent sommaire suivant

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

V. Implémentation du planificateur

Le planificateur est utilisé au niveau de l'agent médiateur lui permettant de réaliser le but soumis par l'utilisateur. Or ce qui est abordé dans cette section n'est pas le planificateur dans sa globalité mais une partie de lui. Cette partie consiste au un module pour le traitement des différentes réponses venantes des agents service en réponse à un sous problème (état initial de l'utilisateur et un sous but) y envoyé par l'agent médiateur. Le module est implémenté par une fonction « traiter_réponses_AS() ».

Le principe est le suivant : l'agent médiateur après qu'il reçoit toutes les réponses des agents service à un sous problème déjà envoyé, il les met dans un vecteur pouvant contenir pour chaque agent la réponse renvoyée ainsi que son type. Il utilise puis ce vecteur comme entrée à la fonction << traiter_réponses_AS() ». Cette dernière après qu'elle traite les réponses, renvoie un autre vecteur contenant le résultat du traitement ainsi que son type.

Le vecteur d'entrée de la fonction est de dimension 3 (nombre des agents service). Pour chaque agent service ce vecteur contient sa réponse ainsi que le type de cette réponse. Le type de la réponse peut être :

- Pas_solution_trouvée : si l'agent service ne trouve pas une solution au sous problème lui est envoyé.

- Solution_trouvée : si l'agent service a trouvé une solution directe au sous problème lui est envoyé.

- Nouveaux_sousbut : si l'agent service ne trouve pas une solution directe au sous problème mais il trouve un ou plusieurs nouveaux sous but pouvant participer à son résolution. Dans ce cas ces nouveaux sous but son mets dans le vecteur en plus du type de la réponse.

Le vecteur de sortie de la fonction peut contenir le résultat retourné par la fonction ainsi que le type de ce résultat. Ce type de résultat peut être :

- Pas_solution_trouvée_pb_utilisateur : si toutes les réponses des agents service sont de

type << pas_solution_trouvée » et le graphe d'états ne contient pas de sous but à traiter.

- Nouveau_sous_but : si toutes les réponses des agents service sont de type << pas_solution_trouvée » et le graphe d'états contient encore de sous but à traiter ou dans le cas où l'une au moins des réponses est de type << Nouveaux_sousbut ». Dans ce dernier cas, le graphe d'états doit être à jour et un nouveau sous but est retourné par la fonction.

- Solution_trouvée_pb_utilisateur : dans le cas où l'une au moins des réponses est de type << solution_trouvée ». Dans ce cas un plan solution est retourné par la fonction

En fin, l'agent médiateur suite à la réception de ces résultat de traitement de la fonction, il va résonner : soit il renvoie << pas de solution au problème de l'utilisateur à l'agent utilisateur, soit envoie un nouveau sous problème aux agents service ou bien, il retourne à l'agent utilisateur un plan solution au problème de l'utilisateur.

Premièrement, dans son implémentation, l'agent médiateur doit se doter d'une variable globale représentant le graphe d'états. Ce dernier est implémenté par une structure de pile de vecteur. Chaque vecteur est de type << structure_graph » défini ci-après. Chaque vecteur doit contenir dans son premier champ un sous but ainsi que l'opérateur permettant d'y parvenir et dans les autres champs les différents sous but permettant d'aller du but de l'utilisateur (noeud principal du graphe) à ce sous but.

class Structure_graphe{

String sous_but;

String operateur;

}

//Déclaration du graphe d'états

Stack<Vector<Structure_graphe>> Graphe_Etats=new

Stack<Vector<Structure_graphe>>();

//Initialisation du graphe d'états

Structure_graphe premier_s_b=new Structure_graphe(); Vector<Structure_graphe> etat=new Vector<Structure_graphe>(); premier_s_b.sous_but=But_Utilisateur; premier_s_b.operateur="";

etat.add(premier_s_b);

Graphe_Etats.push(etat);

Notre fonction « traiter_reponses_AS() » correspond donc à ce qui suit :

Nous définissons encore une autre variable globale « Dernier_sousbut_choisi » qui peut contenir le dernier sous but choisi et traité pour l'utiliser en suite dans la fonction de traitement. C'est une variable de type « Vector<Structure_graphe> » :

Vector<Structure_graphe> Dernier_sousbut_choisi=new

Vector<Structure_graphe>();

Définissons maintenant la structure des deux vecteurs d'entrée et de sortie de la fonction « traiter_reponses_AS() » :

class Structure_entree_sortie{

String type_reponse;

ArrayList<String> objet_reponse=new ArrayList<String>();

}

//Reponses_AS est un vecteur pour contenir les réponses des agents // service et sera utilisé comme entrée à la fonction de traitement Vector<Structure_entree_sortie> Reponses_AS=new

Vector<Structure_entree_sortie>();

//Reponse_AM est un vecteur utilisé pour récuperer le résultat de la //fonction de traitement

Vector<Structure_entree_sortie> Reponse_AM=new

Vector<Structure_entree_sortie>();

Maintenant, il nous reste à présenter notre fonction de traitement « traiter_reponses_AS() » :

/****************************************************/
/* Définition de la fonction "traiter_reponses_AS() */
/****************************************************/

public Vector<Structure_entree_sortie> Traiter_reponses_AS(Vector<Structure_entree_sortie> Reponses_AS)

{

//Déclaration des variables locales

// parcours le vecteur de réponses pour compter le nombre des // différents types de réponses

ListIterator<Structure_entree_sortie>

iter=Reponses_AS.listIterator();

while(iter.hasNext()){

if((iter.next().type_reponse).equalsIgnoreCase("pas_solution")) nbre_pas_solution++;

if((iter.next().type_reponse).equalsIgnoreCase("soluion_trouvee")) nbre_soluion_trouvee++;

if((iter.next().type_reponse).equalsIgnoreCase("nouveaux_sousbut")) nbre_nouveaux_sousbut++;

}

// Maintenant, le type du traitement à effectuer dépend de ces // nombres comptés :

// 1. Si toutes les réponses des agents service sont de type

// "pas_solution"(nbre_pas_solution=3),un test sur l'état du

// graphe d'états est effectué :

// 1.1. Si il est vide, le résultat à retourner sera

// "pas_solution_pb_utilisateur"

// 1.2. Si il n'est pas vide, le résultat à retourner sera un

// nouveau sous but à résoudre

// 2. Si nbre_solutiontrouvee>=1, alors le résultat à retourner sera // un plan solution

// 3. Si les deux cas précédent ne sont pas trouvés (nbre_nouveaux

// _sousbut>=1), alors le graphe d'états sera met à jour et le

// résultat à retourner sera un nouveau sous but à résoudre

if(nbre_pas_solution==3){

if(Graphe_Etats.isEmpty()){ type_reponse_retour="pas_solution_pb_utilisateu"; objet_reponse_retour.clear();

} else {

type_reponse_retour="nouveau_sous_but";

objet_reponse_retour.add(nouv_sousbut);

}

}

else //pas toutes les réponses sont de type"pas_solution" {

if(nbre_soluion_trouvee>=1) {

type_reponse_retour="solution_trouvee_pb_utilisateur";

objet_reponse_retour.add(iter3 .next().operateur);

}

else // aucune "solution_trouvee" n'est trouvee // => il existe au moins une réponse de type { // "nouveaux_sousbut"

type_reponse_retour="nouveau_sousbut";

objet_reponse_retour.add(nouv_sousbut);

}

}

//************************************************************ // mettre les valeurs des deux variables "type_reponse_retour" // et "objet_reponse_retour" associés dans le traitement

// précédent au vecteur "Resultat_a_retourner" à retourner par // la fonction

//************************************************************

Resultat_a_retourner.firstElement().type_reponse

=type_reponse_retour; Resultat_a_retourner.firstElement().objet_reponse

=objet_reponse_retour;

return(Resultat_a_retourner);

}

/****************************************************/

/* Fin de la fonction "traiter_reponses_AS() */

/****************************************************/

précédent sommaire suivant






Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy








"Il faudrait pour le bonheur des états que les philosophes fussent roi ou que les rois fussent philosophes"   Platon