Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- BUYER
- /*
- * Klasa agenta kupującego książki
- *
- * Argumenty projektu (NETBEANS: project properties/run/arguments):
- * -agents seller1:BookSellerAgent();seller2:BookSellerAgent();buyer1:BookBuyerAgent(Zamek) -gui
- */
- import jade.core.Agent;
- import jade.core.AID;
- import jade.core.behaviours.*;
- import jade.lang.acl.*;
- import java.util.*;
- // Przykładowa klasa zachowania:
- class MyOwnBehaviour extends Behaviour
- {
- protected MyOwnBehaviour()
- {
- }
- public void action()
- {
- }
- public boolean done() {
- return false;
- }
- }
- public class BookBuyerAgent extends Agent {
- private String targetBookTitle; // tytuł kupowanej książki przekazywany poprzez argument wejściowy
- // lista znanych agentów sprzedających książki (w przypadku użycia żółtej księgi - usługi katalogowej, sprzedawcy
- // mogą być dołączani do listy dynamicznie!
- private AID[] sellerAgents = {
- new AID("seller1", AID.ISLOCALNAME),
- new AID("seller2", AID.ISLOCALNAME)};
- // Inicjalizacja klasy agenta:
- protected void setup()
- {
- //doWait(5000); // Oczekiwanie na uruchomienie agentów sprzedających
- System.out.println("Witam! Agent-kupiec "+getAID().getName()+" (wersja d) jest gotów!");
- Object[] args = getArguments(); // lista argumentów wejściowych (tytuł książki)
- if (args != null && args.length > 0) // jeśli podano tytuł książki
- {
- targetBookTitle = (String) args[0];
- System.out.println("Zamierzam kupić książkę zatytułowaną "+targetBookTitle);
- addBehaviour(new RequestPerformer()); // dodanie głównej klasy zachowań - kod znajduje się poniżej
- }
- else
- {
- // Jeśli nie przekazano poprzez argument tytułu książki, agent kończy działanie:
- System.out.println("Proszę podać tytuł książki w argumentach wejściowych kupca!");
- doDelete();
- }
- }
- // Metoda realizująca zakończenie pracy agenta:
- protected void takeDown()
- {
- System.out.println("Agent-kupiec "+getAID().getName()+" kończy istnienie.");
- }
- /**
- Inner class RequestPerformer.
- This is the behaviour used by Book-buyer agents to request seller
- agents the target book.
- */
- private class RequestPerformer extends Behaviour
- {
- private AID bestSeller; // agent sprzedający z najkorzystniejszą ofertą
- private int bestPrice; // najlepsza cena
- private int repliesCnt = 0; // liczba odpowiedzi od agentów
- private MessageTemplate mt; // szablon odpowiedzi
- private int step = 0; // krok\
- int i=0;
- public void action()
- {
- switch (step) {
- case 0: // wysłanie oferty kupna
- System.out.print(" Oferta kupna (CFP) jest wysyłana do: ");
- for (int i = 0; i < sellerAgents.length; ++i)
- {
- System.out.print(sellerAgents[i]+ " ");
- }
- System.out.println();
- // Tworzenie wiadomości CFP do wszystkich sprzedawców:
- ACLMessage cfp = new ACLMessage(ACLMessage.CFP);
- for (int i = 0; i < sellerAgents.length; ++i)
- {
- cfp.addReceiver(sellerAgents[i]); // dodanie adresate
- }
- cfp.setContent(targetBookTitle); // wpisanie zawartości - tytułu książki
- cfp.setConversationId("handel_lekturami"); // wpisanie specjalnego identyfikatora korespondencji
- cfp.setReplyWith("cfp"+System.currentTimeMillis()); // dodatkowa unikatowa wartość, żeby w razie odpowiedzi zidentyfikować adresatów
- myAgent.send(cfp); // wysłanie wiadomości
- // Utworzenie szablonu do odbioru ofert sprzedaży tylko od wskazanych sprzedawców:
- mt = MessageTemplate.and(MessageTemplate.MatchConversationId("handel_lekturami"),
- MessageTemplate.MatchInReplyTo(cfp.getReplyWith()));
- step = 1; // przejście do kolejnego kroku
- break;
- case 1: // odbiór ofert sprzedaży/odmowy od agentów-sprzedawców
- ACLMessage reply = myAgent.receive(mt); // odbiór odpowiedzi
- if (reply != null)
- {
- if (reply.getPerformative() == ACLMessage.PROPOSE) // jeśli wiadomość jest typu PROPOSE
- {
- int price = Integer.parseInt(reply.getContent()); // cena książki
- if (bestSeller == null || price < bestPrice) // jeśli jest to najlepsza oferta
- {
- bestPrice = price;
- bestSeller = reply.getSender();
- }
- }
- repliesCnt++; // liczba ofert
- if (repliesCnt >= sellerAgents.length) // jeśli liczba ofert co najmniej liczbie sprzedawców
- {
- step = 5;
- }
- }
- else
- {
- block();
- }
- break;
- case 5:
- ACLMessage negociate = new ACLMessage(ACLMessage.PROPOSE);
- negociate.addReceiver(bestSeller);
- negociate.setContent(targetBookTitle);
- negociate.setConversationId("handel_lekturami");
- negociate.setReplyWith(Double.toString(bestPrice*0.4));
- myAgent.send(negociate);
- mt = MessageTemplate.and(MessageTemplate.MatchConversationId("handel_lekturami"),
- MessageTemplate.MatchInReplyTo(negociate.getReplyWith()));
- i++;
- if (i>5)
- step = 2;
- break;
- case 2: // wysłanie zamówienia do sprzedawcy, który złożył najlepszą ofertę
- ACLMessage order = new ACLMessage(ACLMessage.ACCEPT_PROPOSAL);
- order.addReceiver(bestSeller);
- order.setContent(targetBookTitle);
- order.setConversationId("handel_lekturami");
- order.setReplyWith("order"+System.currentTimeMillis());
- myAgent.send(order);
- mt = MessageTemplate.and(MessageTemplate.MatchConversationId("handel_lekturami"),
- MessageTemplate.MatchInReplyTo(order.getReplyWith()));
- step = 3;
- break;
- case 3: // odbiór odpowiedzi na zamównienie
- reply = myAgent.receive(mt);
- if (reply != null)
- {
- if (reply.getPerformative() == ACLMessage.INFORM)
- {
- System.out.println("Tytuł "+targetBookTitle+" został zamówiony.");
- System.out.println("Cena = "+bestPrice);
- myAgent.doDelete();
- }
- step = 4;
- }
- else
- {
- block();
- }
- break;
- } // switch
- } // action
- public boolean done() {
- return ((step == 2 && bestSeller == null) || step == 4);
- }
- } // Koniec wewnętrznej klasy RequestPerformer
- }
- SELLER
- /*
- * Klasa agenta sprzedawcy książek.
- * Sprzedawca dysponuje katalogiem książek oraz dwoma klasami zachowań:
- * - OfferRequestsServer - obsługa odpowiedzi na oferty klientów
- * - PurchaseOrdersServer - obsługa zamówienia klienta
- *
- * Argumenty projektu (NETBEANS: project properties/run/arguments):
- * -agents seller1:BookSellerAgent();seller2:BookSellerAgent();buyer1:BookBuyerAgent(Zamek) -gui
- */
- import jade.core.Agent;
- import jade.core.behaviours.*;
- import jade.lang.acl.*;
- import java.util.*;
- import java.lang.*;
- public class BookSellerAgent extends Agent
- {
- // Katalog książek na sprzedaż:
- private Hashtable catalogue;
- // Inicjalizacja klasy agenta:
- protected void setup()
- {
- // Tworzenie katalogu książek jako tablicy rozproszonej
- catalogue = new Hashtable();
- Random randomGenerator = new Random(); // generator liczb losowych
- catalogue.put("Zamek", 400+randomGenerator.nextInt(300)); // nazwa książki jako klucz, cena jako wartość
- catalogue.put("Proces", 250+randomGenerator.nextInt(200));
- catalogue.put("Opowiadania", 110+randomGenerator.nextInt(200));
- catalogue.put("Zadanie_5d", 60+randomGenerator.nextInt(70));
- catalogue.put("Wtorek_po_poludniu", 270+randomGenerator.nextInt(90));
- doWait(2000); // czekaj 2 sekundy
- System.out.println("Witam! Agent-sprzedawca (wersja d) "+getAID().getName()+" jest gotów do handlu!");
- // Dodanie zachowania obsługującego odpowiedzi na oferty klientów (kupujących książki):
- addBehaviour(new OfferRequestsServer());
- // Dodanie zachowania obsługującego zamówienie klienta:
- addBehaviour(new PurchaseOrdersServer());
- }
- // Metoda realizująca zakończenie pracy agenta:
- protected void takeDown()
- {
- System.out.println("Agent-sprzedawca (wersja d) "+getAID().getName()+" zakończył żywot.");
- }
- /**
- Inner class OfferRequestsServer.
- This is the behaviour used by Book-seller agents to serve incoming requests
- for offer from buyer agents.
- If the requested book is in the local catalogue the seller agent replies
- with a PROPOSE message specifying the price. Otherwise a REFUSE message is sent back.
- */
- class OfferRequestsServer extends CyclicBehaviour
- {
- public void action()
- {
- // Tworzenie szablonu wiadomości (wstępne określenie tego, co powinna zawierać wiadomość)
- MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.CFP);
- // Próba odbioru wiadomości zgodnej z szablonem:
- ACLMessage msg = myAgent.receive(mt);
- if (msg != null) { // jeśli nadeszła wiadomość zgodna z ustalonym wcześniej szablonem
- String title = msg.getContent(); // odczytanie tytułu zamawianej książki
- System.out.println("Agent-sprzedawca "+getAID().getName()+" otrzymał wiadomość: "+
- title);
- ACLMessage reply = msg.createReply(); // tworzenie wiadomości - odpowiedzi
- Integer price = (Integer) catalogue.get(title); // ustalenie ceny dla podanego tytułu
- if (price != null) { // jeśli taki tytuł jest dostępny
- reply.setPerformative(ACLMessage.PROPOSE); // ustalenie typu wiadomości (propozycja)
- reply.setContent(String.valueOf(price.intValue())); // umieszczenie ceny w polu zawartości (content)
- System.out.println("Agent-sprzedawca "+getAID().getName()+" odpowiada: "+
- price.intValue());
- }
- else { // jeśli tytuł niedostępny
- // The requested book is NOT available for sale.
- reply.setPerformative(ACLMessage.REFUSE); // ustalenie typu wiadomości (odmowa)
- reply.setContent("tytuł niestety niedostępny"); // treść wiadomości
- }
- myAgent.send(reply); // wysłanie odpowiedzi
- }
- else // jeśli wiadomość nie nadeszła, lub była niezgodna z szablonem
- {
- block(); // blokada metody action() dopóki nie pojawi się nowa wiadomość
- }
- }
- } // Koniec klasy wewnętrznej będącej rozszerzeniem klasy CyclicBehaviour
- class PurchaseOrdersServer extends CyclicBehaviour
- {
- public void action()
- {
- ACLMessage msg = myAgent.receive();
- if ((msg != null)&&(msg.getPerformative() == ACLMessage.ACCEPT_PROPOSAL))
- {
- // Message received. Process it
- ACLMessage reply = msg.createReply();
- String title = msg.getContent();
- reply.setPerformative(ACLMessage.INFORM);
- System.out.println("Agent-sprzedawca (wersja d) "+getAID().getName()+" sprzedał tytuł: "+title);
- myAgent.send(reply);
- }
- if ((msg != null)&&(msg.getPerformative() == ACLMessage.PROPOSE))
- {
- // Message received. Process it
- ACLMessage reply = msg.createReply();
- String title = msg.getContent();
- reply.setPerformative(ACLMessage.INFORM);
- System.out.println(msg.getContent());
- myAgent.send(reply);
- }
- }
- } // Koniec klasy wewnętrznej będącej rozszerzeniem klasy CyclicBehaviour
- } // Koniec klasy będącej rozszerzeniem klasy Agent
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement