IFT6802 -- Competition inter-agent =================================== version 1.0 - 23 mars. 2003 1er tour: mardi 15 avril 2003 (14h00) Finale: mardi 22 avril 2003 (14h00) 30 points Approvisionnement de restaurants --------------------------------- Il s'agit de concevoir deux sortes d'agents: des Grossistes et des Restaurants qui cherchent a maximiser leurs profits. Chaque jour les Restaurants doivent s'approvisionner en viande, fruits et legumes. La preparation de 6 repas exige 1 caisse de chaque sorte d'aliment et le restaurant charge $15/repas. Les frais fixes d'un restaurant sont de $300/jour et un restaurant peut preparer un maximum de 200 repas par jour. Les Grossistes fournissent un seul type de produit qu'ils achetent des "producteurs" au debut de la journee. Ils achetent en lot de 10 caisses au cout de $120 + $60 par lot de 10 caisses. Les grossistes n'ont pas de frais fixes. Les Restaurants peuvent aussi acheter directement des producteurs; mais ca leur coutent $30/caisse. Competition ------------ Pour la competition, chaque equipe mettra en lice un restaurant et un grossiste. Nous simulerons 10 journees de 8 heures. Toute equipe qui realise au moins une transaction durant la competition recevra 4 points. De plus, pour chaque jour ou un agent (restaurant ou grossiste) fait un profit, il gagne 0.5 points. Finalement, il y a deux competitions paralleles: celle des restaurants et celle des grossistes. Nous ferons le cumulatif du profit des 10 journees. Le restaurant avec le maximum de profits recevra 8 points et le grossiste le plus performant recevra 8 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 8 points, le 2ieme 7.5, etc... diminuant de 0.5 point par place 2) selon le profit relatif au gagnant: 8 * (profit/profit_max) Protocole de la competition ---------------------------- Dans ce qui suit, nous avons seulement specifie les interactions qui concernent le controlleur. Pour les autres negotiations, c'est a la classe a elaborer des protocoles par le mecanisme des RFC. - Nous utiliserons la version la plus recente de JADE (3.0b) 1) Le "main" container de Jade sera demarre. 2) Chaque equipe fera demarrer UN container avec son restaurant et son grossiste. Les agents s'enregistreront dans le DF avec les services suivants puis attendront le DEPART. Restaurant: sd.setType("Restaurant") Grossiste: sd.setType("Grossiste") Dans chaque cas, vous devez indiquer le nom de l'equipe avec: sd.setOwnership( "..." ) 3) Controle d'identite: Une fois toutes les equipes pretes, nous ferons demarrer le "controlleur" qui va expedier a chaque participant un QUERY_REF dont le contenu sera "ping" et s'attendra a recevoir un message INFORM-REF de classe class Pong: type: "Restaurant" ou "Grossiste" (String) owner: Nom de l'equipe (String) NOTE: seul les agents qui repondent pourront enreistrer des contrats avec le controlleur. 4) Le controlleur decide quel produit va etre vendu pas chaque grossiste et l'informe avec un message INFORM dont le contenu est class Produit: type: String [ viande, legume, fruit, fleur ] Note: les produits de chaque grossiste seront determine de facon aleatoire a chaque jour. Une fois durant la competition, un grossiste sera en position de monopole et une fois il sera "exclu" avec le produit "fleur" pour lequel il n'y a pas de marche (il aura son 0.5 point de profit assure). 5) Le controlleur informe tous les participants du nombre de participants: INFORM: Participants( n_restaurants, n_viandes, n_legumes, n_fruits: int ) A partir de ce moment, les agents peuvent commencer a echanger des messages 6) Une minute plus tard, la competition commence avec le premier "top" d'horloge, un INFORM: Time { tournoi: int // # du tournoi jour: int (1..10) heure: int (0..8 ) } Neuf (9) tels messages seront expedies a toutes les minutes (une minute representant une heure ). - Les grossistes peuvent passer leurs commandes durant les deux premieres "heures" - Apres le dernier message ( 8h00 ) aucune transaction ne sera enregistree. - Durant la journee, le controlleur peut recevoir les messages suivants: 7) Demande d'approvisionnement de la part d'un grossiste REQUEST: Action ( qui: AID quelconque, quoi: class Provision { produit: String [ viande,legume,fruit ] quantite: Int } Acceptable si: 1) vient d'un grossiste "enregistre" 2) produit est celui qu'il est acredite a vendre 3) la quantite est un multiple de 10 dans quel cas, on repond avec AGREE: ( TRUE ) Sinon REFUSE: ( (probleme msg: "......" )) Les messages possibles sont: "1. Pas un grossiste enregistre" "2. Mauvais produit" "3. Pas un multiple de 10" "4. Trop tard" 8) Enregistrement d'une offre de transfert de propriete (achat/vente). L'expedition d'un message REQUEST avec un "Transfert" comme action a un autre agent avec COPIE an controlleur represente le mecanisme formel pour les offres d'achat ou de vente, soit tout de suite ou dans le futur. Si le controlleur recoit copie d'un message AGREE du destinataire au proposeur avec les memes conditions et dans la plage horaire specifiee alors la transaction a lieu: l'argent et les biens sont transferres. REQUEST dest: "destinataire" et controlleur content: Action ( qui: ... quoi: ) class Transfert { acheteur: AID vendeur: AID proposeur: AID numero: Int produit: String [ viande, legume, fruit ] prix: Double quantite: Int heure1: Double ( Optionnel ) heure2: Double ( Optionnel ) } Le proposeur doit apparaitre comme "vendeur" ou "acheteur" et le destinataire doit etre l'autre participant. Le "numero" est fixe par le proposeur. - heure1: heure (simulee) a partir de laquelle l'offre est valide - heure2: heure (simulee) apres laquelle l'offre n'est plus valide Note: le temps est exprime en heure et fraction d'heures simulees Dans ce qui suit, on denote par le contenu du REQUEST: (action ..qui ..quoi ) == Le destinataire peut repondre: AGREE: ( TRUE ) REFUSE: ( (probleme msg: "......" )) Si la requete est valide, l'offre est retiree du carnet des offre en suspend du controlleur. == Tant que le destinataire n'a pas reagit, le proposeur peut annuler son offre avec : CANCEL: Pour que ces actions (AGREE, REFUSE, CANCEL) soient valides, il faut qu'il y ait copie a l'autre participant et au controlleur. S'il y a probleme avec un de ces messages on repond avec un INFORM: INFORM: (probleme msg: "......" )) Les messages possibles sont: "4. Trop tard" "5. Trop tot" "6. Agent illegal" "7. Offre introuvable" "8. Offre ne correspond pas" "99. Autre raison" Ontologie ========= Concepts: ---------- Pong: type: "Restaurant" ou "Grossiste" (String) owner: Nom de l'equipe (String) Produit: type: String [ viande, legume, fruit, fleur ] Probleme: msg: (String) Participants: n_restaurants, n_viandes, n_legumes, n_fruits: int Time: tournoi: int // # du tournoi jour: int (1..10) heure: int (0..8 ) Actions: -------- Transfert acheteur: AID vendeur: AID proposeur: AID numero: Int produit: String [ viande, legume, fruit ] prix: Double quantite: Int heure1: Double ( Optionnel ) heure2: Double ( Optionnel ) Provision produit: String [ viande,legume,fruit ] quantite: Int ================================================================================ Bien que la specification precedente se veut correcte et suffisante, si des erreurs serieuses y sont sont trouvees, elle pourra etre modifiee. Jean Vaucher 23 mars 2003