Programmation orientée agents

(FMIN108-Université de Montpellier - Département Informatique)

Resp: Jacques Ferber,

 

TP 7 - Warbot (Warlogo) #2

Dernière mise à jour : Novembre 2020

 

 

Dans ce TP nous allons développer la manière de réaliser des communications sous Warbot.Voir le cours sur les communications.

Dans Warbot, il y a deux manières d'envoyer des messages, soit directement à l'agent quand on sait à qui on veut s'adresser, soit à tous les agents d'un certain groupe: la même équipe, d'un certain type (regarder la documentation de Warbot à ce sujet).

Envois de messages :

Pour pouvoir envoyer des messages à d’autres agents, deux primitives sont à disposition :

	send-message [receiver performative content]
	broadcast-message [receivers performative content] 

La première permet d’envoyer un message à un seul agent, alors que la seconde permet d’en- voyer le même message à tous les agents d’un agentset passé en paramètre. Voici un exemple de leur utilisation :

  let enemy-base one-of percepts with [is-base? self and is-my-enemy? myself]   
let my-base one-of get-bases if enemy-base != nobody and my-base != nobody [
send-message my-base "seen-base" []
broadcast-message get-rocket-launchers "attack" [] ]

On peut utiliser les agentsSets suivants dans les envois de messages:

get-bases : renvoie l’agentset des bases amies. 
get-rocket-launchers : renvoiel’agentset des rocket-launchers amis.  
get-explorers : renvoie la liste des explorateurs amis.

Réception de messages

Tous les messages se trouvent dans la "boite aux lettres" représentée sous la forme d'une liste : incoming-queue qu'il est possible de parcourir. On peut récupérer les différents éléments de l'émetteur avec le code suivant:

	while [not empty? incoming-queue] [
 	let msg get-message
 	show get-sender msg
 	show get-performative msg
 	show get-content msg
 	show get-heading-to-sender msg
 	show get-distance-to-sender msg
 	reply msg "ok" []
 ] 

 

1. Implémentation de messages

1.a Appel à l'aide de la base

Si la base est attaquée (la primitive just-shot? permet de savoir si une unité vient juste d'être touchée), elle demande à tous les lanceurs de missiles de revenir à la base. Implémentez le système de communication de manière simple: tous les agents retournent à la base.

Note: cela signifie que, automatiquement, les agents vont se tourner vers l'envoi du message de demande d'aide.

1.b Appel à l'aide de la base avec décision des receveurs

Si la base est attaquée, elle demande à tous les lanceurs de missiles de revenir à la base. Mais maintenant, les lanceurs de missiles ne répondent que s'ils sont à une distance inférieure à un certain rayon, les autres continuent leur vie.

1.c Demande d'attaque venant des explorateurs.

Suite du précédent. Si un robot exploreur voit la base ennemie, il demande à tous les lanceurs de missiles de venir attaquer la base.

Observez ce qui se passe et ensuite modifier le code pour que seuls les lanceurs de missiles qui sont "près" de la base ennemie (inférieurs à une certaine distance) viennent la détruire.