IFT6802 - TP1: Agent reactif (5% de note finale) (version 1.2 : 15 janv. ) Echeance: 17h00 Vendredi le 30 janv. 2004 Modifications: (15 janv ) = Hotel.jar accepte autre parametre: le delais en secondes entre chaque coup = L'ordre des adresses , a ete corrige dans les exemples On vous demande de concevoir un agent qui peut agir de facon constructive dans monde simule. Plus exactement, votre robot represente un "aspirateur" qui doit se deplacer dans les pieces d'un "Hotel" afin de ramasser la poussiere qui s'y trouve. On jugera votre performance par le volume de poussiere ramasse dans un temps donne. Votre robot doit pouvoir operer en presence d'autres agents; mais la presence d'autres robots ne vous nuit pas car, plus il y a de robots, plus il y a de poussiere et toute poussiere ramassee donne lieu a de la nouvelle poussiere a un autre endroit. L'espace de l'hotel est une grille de 12x12 positions sur laquelle le robot se deplace comme le roi au echec: d'une case a chaque coup. L'origine est en haut a gauche. Dans cette espace il y a 2 mur horizontaux et 2 murs verticaux. Initialement, votre robot sera place au hasard sur une case libre et cette position vous est inconnue. A chaque coup, le programme qui gere la simulation vous indique le contenu des cellules immediatement voisines et c'est a vous d'indiquer par un message dans quelle direction vous desirez aller. Si votre destination n'est pas libre, vous restez ou vous etes. La communication se fait par l'echange de datagrammes, soit prives soit publiques. La communication publique se fait par multicast a l'adresse suivante: host: 230.0.0.1 port: 7777 Note: pour vous permettre de tester vos agents sans interference avec les programmes d'autres etudiants, le simulateur tout comme le robot modele accepte un autre numero de PORT comme parametre. Chaque intervenant devra gerer 2 sockets datagrammes: un multicast pour les messages publiques et un socket individuel pour les messages prives. Afin de vous aider a demarrer, on vous fournit le code source pour deux robots primitifs, "Robot.java" et RobotAleatoire.java" ainsi qu'un simulateur compacte dans un fichier JAR, "Hotel.jar" ). A simulateur prend optionellement 2 parametres: le premier, un entier, est le PORT publique (7777 par defaut ou si on mets "0"). Le deuxieme est le delais en secondes (et fraction) entre chaque coup. Quel que soit le delais specifie, l'affichage se fait au maximum une fois par seconde. Pour executer le simulateur avec le PORT public et delais standards, on execute: % java -jar Hotel.jar Pour executer le simulateur avec le PORT public 1234 on execute: % java -jar Hotel.jar 1234 Pour executer le simulateur avec le PORT standard et un delais de 0.2 sec, on execute: % java -jar Hotel.jar 0 0.2 Pour compiler et executer le Robot (avec port=1234), faire: % javac Robot.java % java Robot 1234 Protocole: ---------- Tout les messages sont des lignes de textes convertis en "bytes". Avec les datagrammes, il n'y a pas besoin de terminer les messages avec un caractere special (comme "/n") car le datagramme donne la longueur du message. Tous les message sauf l'enregistrement on la meme structure de champs separes par des virgules: ,,,...reste du message... ou = allo, env, go, new, pos, fin et (dest> et sont des entiers ou "0" denote l'Hotel et "999" est utilise pour un message publique (multicast) Pour debuter, le Robot doit s'enregistrer en expediant a l'Hotel un message "allo" avec son adresse privee (host+port). le format est: "allo,," [ Les guillements ne font pas partie du message ] L'Hotel ne repond pas tout de suite mais expediera a chaque tour suivant un message prive d'information sur les voisins ou le champ indiquera l'identificateur de l'agent. L'Hotel alloue des numeros consecutifs aux agents. Le schema suivant indique les codes utilises pour indiquer la direction d'uyn deplacement (ou "x" indique la position de l'agent): 0 1 2 7 X 3 6 5 4 Pour rester immobile, on utilise la direction "8". A chaque tour, l'Hotel expedie un message prive a l'agent indiquant le voisinage par une chaine de 8 caracteres indiquant les occupants des cases 0,...7. Voici le sens des caracteres: ' ': case vide '*': mur '.': poussiere ( votre but est de la ramasser en passant dessus) '%': porte de sortie qui est normalement a X=1, Y=1 '#': chien qui se balade au hasard dans l'hotel '1','2',....'9' : un autre robot La situation suivante - vous etes le robot 1 pres d'un mur avec de la poussiere a droite et le robot 2 en dessous: *********** 1. 2 serait communiquee par le message suivant ("env" pour environnement): "env,1,0,***. 2 " Votre robot doit repondre avec un message (prive) de type "go" avec votre direction. Dans ce cas, il est desirable d'aller ramasser la poussiere a droite (dir=3) ce qui donnerait le message suivant ( de "1" a "0"): "go,0,1,3" Messages publiques: ------------------- POS: de temps en temps, l'Hotel informe tous de la position de certains objets en donnant le caractere approprie et les coordonnees X et Y Ex: "pos,999,0,#,2,3" Le chien est a x=2, y=3 NEW: L'arrivee de chaque nouveau robot donne lieu a un message avec son numero Ex: "new,999,0,3" FIN: Pour signaller la fin de la simulation Ex: "fin,999,0" Modalites: ---------- Le TP se fera individuellement en Java. Soumettez votre solution avec "remise" avant 17h00 Vendredi le 30 janv. 2004 % remise ift6802 tp1 [ ...] Tout retard d'un jour (ou moins) sera penalise d'un point. Jean Vaucher (14 jan 2004)