Il s'agit d'implémenter l'algorithme vu en cours et disponible sur les notes de cours sur la page de cours. On rappelle qu'il comporte 3 phases. Les deux premières sont des rondes classiques alors que la troisième correspond à l'envoi d'un ensemble d'identifiants.
Vous devez créer un projet avec une class Main et une class DetecC34 qui étend la class Node, l'algorithme distribué à proprement parler (voir les deux aperçus de code ci-après). C'est surtout le code de DetectC34 que vous allez devoir éditer. À la fin de l'algorithme, il faudra visualiser en coloriant différemment les sommets lors des différentes sorties possibles, à minima ceux avec leur variable detect=true et ceux avec detect=false. Mais il sera intéressant de distinguer les autres cas: sommets qui sont bleus (variable b=true) ou rouges (b=false) à la fin de la ronde 1, sommet qui détecte un C4, un C3, ou de manière indéterminée un C3 ou un C4. Il faudra bien sûr tester votre algorithme sur plusieurs topologies. Le graphe croix-n25 est un bon example. Pour ce faire, vous pourrez: (1) commenter les trois lignes du Main après T.setDefaultNodeModel(), (2) éditer un graphe particulier (avec des parties plus ou moins denses), (3) le sauvegarder dans un fichier pour pouvoir le charger avec T.getFileManager().read("...").
Votre class Main devrait ressembler à ceci:
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(680,540); // fenêtre de w x h pixels
T.setDefaultNodeModel(DetectC34.class); // algo des sommets = DetectC34
String s = T.getFileManager().read("grille-2x7"); // lecture du fichier
T.getSerializer().importFromString(T,s); // construction du graphe
T.shuffleNodeIds(); // permutation aléatoire des IDs dans [0,n[
DetectC34.n = T.getNodes().size(); // calcule n pour tous les sommets
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)
}
}
Votre class DetectC34 devrait ressembler à ceci:
import io.jbotsim.core.Node;
//import io.jbotsim.core.Color;
public class DetectC34 extends Node {
public static int n; // constante commune à tous les sommets
@Override // au départ
public void onStart() {
;;;
// ne pas oublier d'envoyer un premier message
}
@Override // à chaque top horloge
public void onClock() {
;;;
}
}
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
;;;
}
// donne le numéro courant de la ronde
getTime(); // = 0,1,2,... (=0 au 1er appel de OnClock())
// liste des voisins (ne devrait pas être utilisée)
getNeighbors();
getNeighbors()[0]; // 1er voisin de la liste