IFT6802 -- Competition inter-agent (H-2004)


Livraison de Colis

Echeance: vers le 23 avril
Valeur: 30 points (30% de note globale)
Version 1.6

Il s'agit de developper des agents qui doivent assurer la livraison de colis avec le maximum de profit dans un monde virtuel. Cet environnement sera peuple par d'autres agents qui sont en competition avec les votres et avec lesquels vous devez negocier.

La competition se jouera sur 7 journees simulees chacune de 600 coups. Le monde est represente par une grille de 20x20 cases et vos agents se deplacent d'une case a la fois. Il est prevu que le simulateur fera un coup a toutes les demi-secondes.

Au debut de chaque journee, le simulateur met $20 (simule) dans votre compte bancaire. De temps en temps, le simulateur met en vente des contrats de livraison de colis avec le protocole FIPA-Contract-Net. Le contrat est vendu au plus offrant. Un contrat specifie:

Mais vous ne savez pas les details du contrat avant de l'avoir achete. Si vous avez des colis non livres a la fin de la journee, vous devrez payer une amende egale a la valeur du colis.

Afin d'encourager le commerce, les colis on tendance a etre places pres de leur destination et la valeur d'un contrat comporte un montant fixe de $10 en plus d'un montant aleatoire qui augmente avec la distance.

Une environnement de pratique se trouve dans le repertoire du cours. Il comprend:

Plus deux robots livreurs simples sont disponibles:

Le controleur n'est qu'une ebauche de la version finale et ne gere que 3 journees de 200 coups.

Pour tester vos agents au DIRO, organiser votre $CLASSPATH pour inclure les JARs de JADE qui sont dans le repertoire dift6802/jade/lib et celui du cours, ift6802.jar, dans le repertoire ~vaucher/HTML/ift6802/Competition.

Evaluation de performance

Pour 6 points, on demande un court rapport sur le projet (2-5 pages). En particulier, la strategie que vous avez adopte pour vos agents et tout autre commentaire ou observations sur le projet. Le reste des point dependra directement de la performance economique de vos agents.
  1. D'abord, pour chaque jour ou un agent a reussit au moins une livraison et fait un profit, il gagne 1 points.
  2. Ensuite, chaque jour ou un agent a gagne plus que la moyenne, il obtient 1 points.
  3. Finalement, nous ferons le cumulatif des profit des 7 journees pour chaque equipe. L'equipe avec le maximum de profits recevra 10 points. Pour les agents moins performants, il y a deux facon de calculer les points et la formule la plus favorable sera employee:
    1. selon le rang: le premier recevant 10 points, le 2ieme 9, etc... diminuant de 1 point par place
    2. selon le profit relatif au gagnant: 10 * (profit/profit_max) [minimum = 0]

Le travail se fait en equipes de 2 personnes qui n'ont pas encore travaille ensemble. Le code devra etre remis avec "remise"

	% remise ift6802 tp4 .....les fichiers

et le rapport en main propre le jour de la competition.

Protocole de la competition

La competition aura lien dans une salle de machines au 3ieme etage du pavillon AA Probablement vendredi apres-midi le 23 avril. Nous organiserons une pre-competition une semaine avant.

Le repertoire associe au TP contient plusieurs programmes et documents utiles. En particulier la classe "JVAgent.java" qui comprend plusieurs utilitaires pour la creation de messages, l'enregistrement et la recherche dans le DF et les traces de mise au point.

0. Format des messages

Pour cette competition nous n'utiliserons pas le formattage SL (Semantic language). Nous utiliserons deux type de codage pour le contenu:
  1. une chaine utilisant un caractere donne (comme la virgule) comme delimiteur de champs [ msg.setLanguage("String") ].
  2. des objets Java (serialises) [ msg.setLanguage("Java") ]
En particulier, le contenu du message pour l'octroi de contrat avec ContractNet utilise un objet de la classe Contrat (voir le repertoire du projet).

1. Demarrage de plateforme

Au debut de la competition, le controleur ainsi que le "main" container de Jade sera demarre sur une machine dont le nom sera donne aux participants.

2. Enregistrement des agents

Chaque equipe fera demarrer un agent Livreur. Le nom local que vous lui donne servira d'identificateur pour la competition. Si vous devez faire repartir votre agent durant la competition, il est important de garder le meme NOM.

Vous pouvez aussi demarrez des "Afficheurs" pour suivre l'evolution des robots. Les agents s'enregistreront dans le DF avec les attributs suivants puis attendront le DEPART.

    Livreur:      sd.setType("Livreur")
    Controleur:   sd.setType("Controleur")
Dans chaque cas, vous devez indiquer le nom de l'equipe avec:
sd.setOwnership( "..." )
Chaque agent doit aussi engistrer une Cle cryptographique publique afin de pouvoir signer des messages. La methode "register" de JVAgent fait ceci automatiquement.

Une fois tous les agents demarres, le depart de la competition sera donne. Les etapes qui suivent represente le deroulement d'une journee de 600 coups. Ces etapes seront repetees 7 fois.

3. Identification des participants

Le controleur expediera a chaque Livreur un message INFORM l'informant de son numero d'identification, de sa position sur la grille ainsi que la duree de la competition en JOURS et en Heures/jour:
INFORM: ID=<id>,<X>,<Y>,<NJOURS>,<NHEURES>
L'agent devrait noter l'identite de l'expediteur (le controleur) afin de pouvoir creer des template plus tard pour identifier les messages venant du Controleur.

4. Deroulement de la journee

Apres chaque coup, le controleur expediera a chaque agent un message indiquant l'heure, la position de l'agent et la nature de son environnement immediat.
        INFORM: STATE=<jour>,<heure>,<X>,<Y>,....contenu des 8 cases environnantes ...
        
ou le contenu est:  A-<id>    pour un agent
                    C-<owner> pour un colis
                    X      pour un mur
                   'blanc'  si la case est vide
Exemple: premiere journee, t=34, l'agent 3 est a la case <1,5> avec l'agent 6 juste en haut et un colis libre a droite et un colis appartenant a l'agent 6 en dessous:
   STATE=1,34,1,5,X,A-6, ,C-0, ,C-6,X,X
Le premier message recu sera pour Jour=1 et Heure=1. Le dernier message recu sera pour heure=600, puis l'agent recevra un message de fin de journee:
	INFORM: STOP=<nom1>/<argent1>,<nom2>/<argent2>,....
Ce message donne en ordre decroissant les montants gagnes durant la journee par tous les participants.

Une minute plus tard, la prochaine journee debutera. La position et l'identificateur de l'agent ne changera pas mais tous les colis auront disparu.

5. Fin de la competition

Les agents recevront un message du type:
	INFORM: FIN=<nom1>/<argent_cumul1>/<points1>,<nom2>/<argent_cumul2>/<points2>,....
Ce message donne en ordre decroissant les montants cumulatifs et les points accordes.

Acquisition de Colis

De temps en temps, le Controleur met en vente des contrats de livraison. Pour ceci on utilisera le protocole ContractNet de Jade. Voir les exemples dans le repertoire protocols. Plus exactement, le contenu du message expedie est un string avec le format suivant:
	CFP:  CONTRACT=<conID>
ou conID est un numero de contrat. Pour reagir, vous devez utiliser une sous-classe de ContractNetResponder. Pour soumissioner, il suffit de retourner un PROPOSE avec comme contenu un entier qui denote le prix propose (en dollar).
	PROPOSE:   <prix>
Si vous avez gagne l'enchere (et que votre credit est bon), vous recevrez un ACCEPT_PROPOSAL dont le contenu sera un OBJET de classe CONTRAT.

A tout moment il y aura un nombre limite de contrats en jeu. Ce nombre varie d'une journee a l'autre entre 2 fois et 7 fois le nombre d'agents.

Un agent peut detenir un nombre quelconque de contrats. De part la suite, il peut les revendre a d'autres agents ou remplir le contrat en allant chercher le colis et en l'amenant a destination. Une fois qu'un colis a ete ramasse, il ne peut plus etre revendu.

Une autre facon d'acquerir un contrat est de se deplacer sur la case ou se trouve un colis sans proprietaire. Dans ce cas, s'il y a encore de la place a bord du robot, le colis sera automatiquement charge et , en plus, l'agent recevra un ACCEPT_PROPOSAL [comme plus haut] lui disant les details du colis. NOTE IMPORTANTE: Ce message aura le champ protocole mis a "Pickup". Ceci est necessaire afin de distinguer ce message du ACCEPT_PROPOSAL de CONTRACT NET et ceux du protocole "NEGO_6802_H04"

Deplacement

A tout moment, l'agent peut expedier au Controleur un REQUEST avec un entier [0-7] denotant la direction dans laquelle, il veut aller. Le resultat sera visible dans le prochain STATE.
   REQUEST: MOVE=<dir>

Notez que vous ne pouvez pas avancer dans une case

La charge maximum est de 3 colis.

Pour livrer un colis, il faut aller sur la case de destination puis expedier un message au Controleur:

	REQUEST: LIVRER
Si vous etes au bon endroit, tous les colis pour cette destination seront decharges et votre compte bancaire sera credit de la valeur du contrat.

Si votre agent occupe un des 4 coins trop longtemps, il recevra une amende de $10 et sera relocalise a un endroit aleatoire.

Negotiation entre agents

Le protocole de negotiation pour la vente et l'achat de contrat doit etre elabore par la classe. Les propositions et votes seront fait par courriel comme pour l'elaboration de normes du WWW par RFC (Request for Comment). La participation a l'elaboration de la norme pour la negotiation compte dans les points de participation.

Competition Policies

Beyond the rules of the game itself, competition organizers reserve the right to disqualify agents violating the spirit of the competition: your agents may negotiate in bad faith, lie and cheat BUT they must do so within the rules. In particular, the following behaviors are strictly prohibited:
  • Modifying another agent's DF or AMS entry.
  • Communication with the agent during a game. Agents may obtain runtime game information only via the defined auction API.
  • Denial-of-service attacks. Agents may not employ API operations for the purpose of occupying or loading the game servers.
  • Jean Vaucher
    15 mars 2004