Faire un premier projet minimaliste sous le simulateur JBotSim.
Créer un projet avec une class Main et une class Tpzero qui étend la class Node, l'algorithme distribué à proprement parlé (voir les deux aperçus de code ci-après qu'il faut copier). C'est surtout le code de Tpzero que les sommets du graphe vont exécuter.
La class Main (fichier Main.java):
import io.jbotsim.core.Topology; import io.jbotsim.ui.JTopology; import io.jbotsim.ui.JViewer; public class Main { public static void main(String[] args) { Topology T = new Topology(800,600); // fenêtre de w x h pixels T.setDefaultNodeModel(Tpzero.class); // algo des sommets = Tpzero JTopology J = new JTopology(T); new JViewer(J); // dessine la topologie T.start(); // démarre l'algorithme T.pause(); // mode pas-à-pas (clic-droit dans l'interface) } }
La class Tpzero (fichier Tpzero.java):
import io.jbotsim.core.Node; public class Tpzero extends Node { @Override // au départ public void onStart() { ;;; // ne pas oublier d'envoyer un premier message } @Override // à chaque top horloge public void onClock() { ;;; } }
La convention d'une ronde JBotSim est différente de
celle utilisée dans le cours. Les messages récupérés/reçus lors d'un
évènement onClock() sont ceux qui ont été envoyés à la
ronde précédente. Ainsi, une ronde standard consiste d'abord par
lire les messages émis à la ronde précédente (voir ci-dessous
l'aide), de les traiter, et de terminer par les envois de messages
(pour la ronde suivante). Il convient aussi d'envoyer le premier
message dans onStart() qui est appelé une seule fois au
démarrage de l'algorithme sans quoi rien ne se passera.
Pour le dire autrement, si $S_i$, $R_i$ et $C_i$ représentent les
opérations d'envoi ($S_i$), de réception ($R_i$) et de calcul
($C_i$) pour la ronde $i$ de l'algorithme distribué $A$, le cours va
représenter la sucession des rondes de $A$ selon le découpage:
$S_1/R_1/C_1$ - $S_2/R_2/C_2$ - $S_3/R_3/C_3$ - ... alors qu'en
JBotSim, c'est plutôt: $S_1$ dans onStart(), puis
le découpage $R_1/C_1/S_2$ - $R_2/C_2/S_3$ - $R_3/C_3/S_4$ - ... à
chaque évènement onClock(). Notez bien que c'est la même
chose puisque dans les deux cas les opérations seront effectuées
dans l'ordre: $S_1/R_1/C_1/S_2/R_2/C_2/S_3/R_3/C_3/...$
Aide rapide sur JBotSim:
// colorie le sommet courant setColor(Color.getColorAt(getID())); // colorie selon l'ID setColor(Color.red); // colorie en rouge setColor(Color.bleu); // colorie en bleu // envoie un message send(Node, Message); // envoie son ID à tous ses voisins int x = getID(); sendAll(new Message(x)); // lecture des messages dans onClock() for (Message m : getMailbox()) { // pour chaque msg émis à la ronde précédente y = (int) m.getContent(); // le contenu du msg m Node v = m.getSender(); // l'émetteur du msg m ;;; } // nombre de messages reçus getMailbox().size(); // donne le numéro courant de la ronde getTime(); // = 0,1,2,...