TP 6 - Prise en main de MadKit

Démarrage et petits programmes en MadKit

proposé par Jacques Ferber - mise à jour Avril 2009

 

1. Démarrage

Installez MadKit à partir de la version stable de www.madkit.net. Dézippez, allez dans le directory bin et lancez MadKit en faisant

./desktop.sh

Téléchargez et lisez madkit pas à pas. Cela lance le desktop (sous Linux.. Sous Windows, il suffit de cliquer sur madkit.exe)

Lancez les agents 'demos' et regardez ce qui se passe en utilisant le GroupObserver.

2. Créez vos premiers agents

Utilisez l'agent 'Designer' pour créer votre premier projet MadKit. (utilisez le type 'default' comme projet).

Créez des agents Java, Python et Scheme directement dans le designer.

Modifiez le code source des agents ainsi créés et regardez leur fonctionnement.

3. Créez un projet sous Eclipse

Si vous êtes un utilisateur d'Eclipse, vous pouvez créer un projet Eclipse qui sera lié à votre projet MadKit. Il suffit de créer un projet Java et d'indiquer comme directory le dossier où se trouve le plugin.

Tout est décrit dans madkit pas à pas

Lorsqu'on compilera, il suffira ensuite de relancer le bouton 'build' du Designer, pour que le 'jar' se construise et qu'il soit rechargé dans MadKit.

4. Agent compteur

1) Créez un agent compteur.. Le code de l'agent doit contenir, dans la partie "live" le code suivant:

...
	public void live()
	{
		int n = 0;
		while(alive){
			Message m = nextMessage();
			if (m != null) 
              handleMessage(m);
              n++;
              println("compteur : "+n);
              pause(1000);
		}
	}
	
...

Faites en sorte que l'agent entre dans un groupe (ayant le nom qui vous plait) avec le rôle "compteur".

Lancez l'agent. A priori, il ne s'arrête pas, sauf si on ferme sa fenêtre.

Modifiez la méthode handleMessage de telle sorte que l'agent Compteur reçoive des messages de type StringMessage et qu'il s'arrête s'il reçoit un message dont l'intitulé est "stop". (note: la méthode getString() d'un StringMessage retourne le contenu de ce type de message).

Note: toute la documentation de MadKit se trouve dans MadKit lui-même, dans le DocBrowser. En particulier toute l'API de MadKit se trouve là. On regardera particulièrement les classes AbstractAgent et Agent qui comprennent pratiquement toutes les primitives de MadKit à utiliser dans un programme.

2) Maintenant, créez un agent un agent Controleur qui dès qu'il est lancé arrête les agents Compteur en cours de fonctionnement. Pour cela, il entre dans le groupe de l'agent Compteur, avec le rôle "stoppeur" puis il envoie le message "stop" à tous les agents ayant le rôle compteur (on utilisera la primitive broadcastMessage qui se trouve définie dans la classe AbstractAgent).

3) On veut pouvoir maintenant redémarrer les agents compteurs. Pour cela on crée une petite interface graphique comprenant deux boutons que l'on associera à l'agent Controleur. L'agent ainsi créé comprendra les méthodes suivantes:

    void stop(){
		broadcastMessage(myCommunity, myGroup,"compteur",new StringMessage("stop"));
	}

    void stop(){
		broadcastMessage(myCommunity, myGroup,"compteur",new StringMessage("start"));
	}

Note: il est facile de créer un agent disposant d'une interface graphique. A partir du Designer, cliquez sur la création d'un JavaAgent et puis sélectionnez. 'Java Agent with GUI'. MadKit crée alors deux classes, une pour votre agent et une autre pour votre interface. Il suffit ensuite de modifier ce code à votre gré.

L'interface elle-même sera associée à l'agent en définissant une méthode particulière, initGUI(), qui est appelée automatiquement par le noyau de MadKit lors de l'initialisation des agents.

GPongGUI gui;
public void initGUI() {
       gui = new ControleurGUI(this);
       this.setGUIObject(gui);
   }

L'interface graphique est une classe graphique quelconque qui hérite de JComponent :

class ControleurGUI extends JComponent{
   ... // definition d'attributs et méthodes graphiques
}

5. Un exemple plus complexe

Essayez de créer un agent Chat qui permet de communiquer entre agents. L'agent possède une petite interface graphique qui comprend au moins un JTextField. Lorsque l'utilisateur appuie sur la touche <return> (ou sur un bouton <envoyer>, c'est plus simple ainsi dans un premier temps), la chaine de caractère est transmise à l'agent qui l'envoie par broadcast à tous les agents ayant le rôle "chatter" dans le même groupe que lui...

A la fin de l'exercice on pourra vérifier que ce "chat" permet effectivement de communiquer entre plusieurs plate-formes, en utilisant le communicator.

6. Le jeu du PingPong

Le PingPong est un exemple de base dans MadKit, dont vous pourrez trouver les sources dans le plugin Demo..

On voudrait maintenant que l'on ne puisse pas avoir plus de deux joueurs par groupe. Voilà une solution assez simple..

Créer un nouveau projet avec le designer et créer des agents qui soient comme les PingPong agents (fichier <madkit>/plugins/demos/src/madkit/demos/PingPong.java).

Modifier le code source des PingPong agent de manière à ce qu'ils créent une communauté de nom "PingPong".

Stratégie: Pour entrer dans un groupe, le PingPong agent vérifie qu'il existe un groupe dans lequel il n'y a pas deux agents (ou plus). Si ce groupe existe, il entre dans le groupe en tant que "player". Sinon, il crée un nouveau groupe "pingpong-<n>" où <n> est un nombre que vous incrémentez. Faites attention de bien vérifier, quand vous le créer que ce groupe n'existe pas déjà. Et il entre dans ce groupe avec le rôle "player".