On va travailler sur ce TP sur la simulation d’agents mobiles avec le simulateur davis. Le but sera de travailler sur les algorithmes vus en cours. davis est un environnement de visualisation d’algorithmes distribués pour le simulateur JBotSim développé au LIS.
Pour que cette séance se passe bien, nous vous conseillons d’installer les logiciels suivant :
sudo apt install openjdk-8-jdk ou sudo apt install openjdk-11-jdk sous linux suivant la version voulue). Vous pouvez aussi installer le JDK 8 d’oracle.sudo apt install git sous linux)Afin de vous faciliter le travail, nous avons créer un projet déjà configuré.
Adresse du projet : https://gitlab.lis-lab.fr/davis/basic-example.git
Lancer IntelliJ, puis commencez un nouveau projet depuis un dépot git en
Check from version control depuis la fenêtre de lancement d’IntelliJFile, New, Project from version control, Git.Dans les deux cas, renseignez l’adresse du dépôt git donnée au dessus.
gradle en ligne de commandeVous pouvez sauvegarder toutes les configurations dans le fichier scénario.
src : MyAlgo.javascr/scenario et ajoutez une ligne ayant les 5 paramètres suivants : <ScenarioName> <networkGeneratorFile> <scheme> <size> <algoFile : MyAlgo.java>./gradlew runScenarioNamegradlesrc : MyAlgo.javascr/scenario et ajoutez une ligne ayant les 5 paramètres suivants : <scenarioName> <networkGeneratorFile> <scheme> <size> <algoFile : MyAlgo.java>Tasks/application du panneau gradle, votre test devrait apparaître.Les agents mobiles disposent des primitives suivantes :
void become(String state) : met l’agent dans l’état state à la ronde suivante. Il doit y avoir au moins une méthode void state(MyClass object). La méthode void state(MyClass object) correspondant à l’état state de l’agent est appelée à chaque début d’étape. Il est important qu’un appel à cette méthode n’engendre qu’un seul déplacement de l’agent.void log(String info) : affiche un message info (automatiquement précédé du toString() de l’agent).void stay() : permettant de rester sur place. Si l’agent ne doit pas se déplacer à cette étape il faut appeler cette méthode.void goRight() et void goLeft() qui permettent à l’agent de se déplacer à droite ou à gauche.boolean goRight(), boolean goLeft(), boolean goTop() et boolean goBottom() qui permettent à l’agent de se déplacer à droite, à gauche, en haut ou en bas. Si le mouvement dans cette direction n’est pas possible, la méthode retourne false et l’agent n’est pas déplacé. La méthode retourne true si le déplacement est effectué.void init() : méthode que vous devez implémenter pour initialiser l’agent : lui donner un état de départ et des valeurs initiales pour ses attributs.ìnt getID() : permet de récupérer l’identifiant de l’agent.int getTopologySize() : permet de récupérer la taille du réseau.Pour cet exercice, nous allons considérer des agents avec identifiants dans un anneau anonyme. On va considérer un anneau de taille 18 avec 2 agents disposés de manière symétrique et comme premier algorithme une marche aléatoire (une chance sur deux à chaque étape d’aller dans une direction).
On va utiliser pour cette partie le générateur de topologie RingAnon2AgentsSym.java et l’algorithme RandomWalkRing.java. On utilisera donc le scénario suivant (déjà présent dans le projet) :
RandomWalkRing RingAnon2AgentsSym.java Anonymous 18 RandomWalkRing.java
AlgorithmSizeRing.java dans lequel chaque agent effectue \(id\) tours de l’anneau dans le sens des aiguilles d’une montre dans l’anneau (se déplace \(id.n\) étapes vers la droite). Vous pouvez rajouter une classe dans Intellij avec un clic droit sur le dossier suivi de New -> Java class. On utilisera le scénario suivant : AlgorithmSizeRing RingAnon2AgentsSym.java Anonymous 16 AlgorithmSizeRing.java.AlgorithmSpeedRing.java dans lequel chaque agent tourne à vitesse \(\frac{1}{id}\) (se déplace puis attend \(id-1\) étapes) dans le sens des aiguilles d’une montre dans l’anneau. On utilisera le scénario suivant : AlgorithmSpeedRing RingAnon2AgentsSym.java Anonymous 16 AlgorithmSpeedRing.java.Pour cet exercice, nous allons considérer des agents avec identifiants dans un chemin anonyme. On va considérer un chemin de taille 18 avec 2 agents et comme premier algorithme une marche aléatoire (choix aléatoire uniforme parmi la ou les directions possibles).
On va utiliser pour cette partie le générateur de topologie RectangularTwoAgents.java et l’algorithme RandomWalkPath.java. Le générateur de topologie est écrit pour une grille mais il suffit de fixer la hauteur à un pour obtenir un chemin.
On utilisera donc le scénario suivant (déjà présent dans le projet) :
RandomWalkPath RectangularTwoAgents.java Anonymous 18*1 RandomWalkPath.java
Pour cet exercice, on va garder le générateur de topologie RectangularTwoAgents.java mais cette fois on va considérer une grille de taille \(18\times 10\). Vous utiliserez au départ l’algorithme RandomWalkRectangular.java que vous allez devoir écrire.
On utilisera donc le scénario suivant (à ajouter dans le dossier src/scenario) :
RandomWalkRectangular RectangularTwoAgents.java Anonymous 18*10 RandomWalkRectangular.java
RandomWalkPath.java, écrivez une classe RandomWalkRectangular.java effectuant une marche aléatoire dans la grille et donc prenant en compte les quatre directions possibles dans la grille.