TP zéro


Objectif

Faire un premier projet minimaliste sous le simulateur JBotSim.

Démarrage

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() {
        ;;;
    }

}

Spécificités du simulateur

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,...