2010-11-24 Systemy wieloagentowe 1
Systemy wieloagentowe (MAS) – zasady tworzenia systemów wieloagentowych za pomocą
technologii MASE i JADE- część 2
http://www.MultiAgent.com
Autor:
Zofia Kruczkiewicz
2010-11-24 Systemy wieloagentowe 2
Struktura prezentacji
Zastosowanie techniki MASE do wykonania modeli analizy i projektowania przykładu MAS – przykład 2
Zastosowanie techniki JADE do implementacji przykładu MAS – przykład 2
Charakterystyka techniki JADE
Zakończenie
Wprowadzenie do MAS
Zastosowanie inżynierii odwrotnej do wykazania
spójności modeli projektowego i implementacji
2010-11-24 Systemy wieloagentowe 3
Struktura prezentacji
Wprowadzenie do MAS
2010-11-24 Systemy wieloagentowe 4
Przykłady narzędzi do tworzenia MAS
• AgentBuilder®
• AgenTalk
• AgentTool
• Agent Building Environment
• Agent Development Environment
• Agentx
• Aglets
• Concordia
• DirectIA SDK
• Gossip
• Grasshopper
• Infosleuth
• iGEN
• Intelligent Agent Factory
• Intelligent Agent Library
• JACK Intelligent Agents
• JADE
• Jumping Beans Engineering
• Kafka
• LiveAgent
• Microsoft Agent
• Swarm
• Versatile Intelligent Agents (VIA)
• Voyager
2010-11-24 Systemy wieloagentowe 5
Techniki tworzenia MAS
2010-11-24 Systemy wieloagentowe 6
Struktura prezentacji
Charakterystyka techniki MASE
Wprowadzenie do MAS
2010-11-24 Systemy wieloagentowe 7 Początkowy kontekst
systemu Hierarchia celów
Przypadki użycia (Use Cases)
Diagramy sekwencji Zadania
współbieżne Role
Klasy agentów
Konwersacje
Architektura agentów Diagramy
wdrożenia
Określenia celów
Określenia przypadków użycia
Konstruowanie konwersacji Grupowanie klas
agentów Projektowanie
systemu
Tworzenie klas agentów Udoskonalanie ról
Projekt Analiza
2010-11-24 Systemy wieloagentowe 8
Proces transformacji modelu ról (analizy) do modelu projektowego
2010-11-24 Systemy wieloagentowe 9
2010-11-24 Systemy wieloagentowe 10
Struktura prezentacji
Charakterystyka techniki MASE
Charakterystyka techniki JADE
Wprowadzenie do MAS
2010-11-24 Systemy wieloagentowe 11
Infrastruktura fizyczna MAS – System JADE
oparty na specyfikacji FIPA
System Zarządzania Agentami (AMS)
Katalog Usług (DF)
Platforma Agenta (AP)
System transportu wiadomości (MTS) Agent
System transportu wiadomości (MTS) Platforma Agenta (AP)
IIOP, HTPP
RMI
2010-11-24 Systemy wieloagentowe 12
Rozproszona AP w systemie
JADE
2010-11-24 Systemy wieloagentowe 13
MAS – mobilny (3 komputery)
MySQL Server Container 1 Searcher 1
Container 2 Host 2
MySQL Server Container 3
Host 3
Container 4 Searcher 2 AMS DF
Host 1
doMove()
doMove()
Manager
Main Container Agent
Platform
2010-11-24 Systemy wieloagentowe 14
2010-11-24 Systemy wieloagentowe 15
2010-11-24 Systemy wieloagentowe 16
2010-11-24 Systemy wieloagentowe 17
2010-11-24 Systemy wieloagentowe 18
Środowisko graficzne JADE
2010-11-24 Systemy wieloagentowe 19
2010-11-24 Systemy wieloagentowe 20
Struktura prezentacji
Charakterystyka techniki MASE
Charakterystyka techniki JADE
Wprowadzenie do MAS
Zastosowanie inżynierii odwrotnej do wykazania
spójności modelu projektowego i implementacji
2010-11-24 Systemy wieloagentowe 21 Komponenty agenta - odwzorowanie (2)
ConversationI_1
Konwersacje typu proste zdarzenia komunikacyjne typu nadawanie lub odbiór wiadomości - odwzorowanie (3)
MASE (1)
Klasa agenta - odwzorowanie (1)
2010-11-24 Systemy wieloagentowe 22 Przekształcenie
komponentów do obiektów typu Behaviour -
odwzorowanie(2)
^send1_4
Odwzorowanie zbioru zdarzeń komunikacyjnych typu nadawanie lub odbiór do zbioru metod nadawania i odbioru – odwzorowanie (3)
JADE (1)
Klasa agenta - odwzorowanie (1)
2010-11-24 Systemy wieloagentowe 23 Proste zdarzenia komunikacyjne
typu nadawanie lub odbiór wiadomości - odwzorowanie (5)
Rys.5. Model Agenta MASE
Konwersacje typu proste zdarzenia komunikacyjne typu nadawanie lub odbiór wiadomości (3)
Konwersacja opisana złożonym diagramem stanu – odwzorowanie (4)
Komponenty agenta – odwzorowanie (2)
ConversationI_1
MASE (2)
Klasa agenta -odwzorowanie (1)
2010-11-24 Systemy wieloagentowe 24
Rys. 6. Model agenta JADE
Odwzorowanie zbioru zdarzeń
komunikacyjnych typu nadawanie lub odbiór do zbioru metod nadawania i odbioru – odwzorowanie (3)
Przekształcenie komponentów do obiektów typu Behaviour –
odwzorowanie (2)
Odwzorowanie złożonej konwersacji do klasy typu Behaviours –odwzorowania (4) oraz odwzorowania zbioru zdarzeń
komunikacyjnych typu nadawanie lub odbiór do zbioru metod nadawania i odbioru – odwzorowanie (5)
JADE (2)
Klasa agenta - odwzorowanie (1)
2010-11-24 Systemy wieloagentowe 25
Struktura prezentacji
Charakterystyka techniki MASE
Charakterystyka techniki JADE
Zastosowanie techniki MASE do wykonania modeli analizy i projektowania przykładu MAS – przykład2
Wprowadzenie do MAS
Zastosowanie inżynierii odwrotnej do wykazania
spójności modelu projektowego i implementacji
2010-11-24 Systemy wieloagentowe 26
MASE- aplikacja Client-Seller Sprzedaz2MASE
przykład 2 - sprzedaz2-v1.83.maml
• Analiza
2010-11-24 Systemy wieloagentowe 27
Diagram celów
2010-11-24 Systemy wieloagentowe 28
Diagram ról
2010-11-24 Systemy wieloagentowe 29
Diagram use case
2010-11-24 Systemy wieloagentowe 30
Diagram sekwencji
2010-11-24 Systemy wieloagentowe 31
MASE- aplikacja Client-Seller Sprzedaz2MASE
przykład 2 - sprzedaz2-v1.83.maml
• Projekt
2010-11-24 Systemy wieloagentowe 32
Diagram Agent Template Diagram
2010-11-24 Systemy wieloagentowe 33
Architektura typu ClientAgent
2010-11-24 Systemy wieloagentowe 34
Komponenty agenta typu ClientAgent (1)
2010-11-24 Systemy wieloagentowe 35
Komponenty agenta typu ClientAgent (2)
2010-11-24 Systemy wieloagentowe 36
Seller Agent – architektura i komponenty (taki sam jak w Sprzedaz1)
2010-11-24 Systemy wieloagentowe 37
Informacja o weryfikacji protokołów komunikacjina etapie projektowania
Języki formalne i narzędzia do automatycznej weryfikacji systemów komunikacji
1. Procesy Sekwencyjnej Komunikacji (CSP – Communicating Sequential Processes – 1978 r.
C.A.R.Hoare)
2. Usuwanie Błędów Rozbieżności (FDR2-Failure-Divergence Refinement 2 – 1997 r.)
3. Rachunek Systemów Komunikacyjnych (CCS-Calculus of Communicating Systems – 1972 r.) 4. Równoległe Narzędzie Pracy (CWB-Concurency WorkBench – 1998 r.)
5. Meta Język Procesów (Promela – Process Meta Language – 1997 r.: konwersacje są modelowane jako procesy, ścieżki konwersacji jako kanały, testowane są zmienne i parametry konwersacji)
6. Spin
Spin jest narzędziem automatycznej weryfikacji opracowanym przez Bell Labs, opartym na języku modelowania Promela. Jest on przeznaczony do weryfikacji oprogramowania systemów
rozproszonych i protokołów komunikacyjnych (1997).
Spin wykrywa:
• blokadę (deadlock)
• wstrzymanie (livelock)
• warunki naruszania przebiegu komunikacji
• inne błędy komunikacji Spin wspiera komunikację:
• synchroniczną
• asynchroniczną – zastosowanie kanałów do przesyłania komunikatów i buforów kanałów (rozmiar bufora równy 0 oznacza komunikację synchroniczną)
Spin umożliwia różne typy symulacji:
• losową
• sterowaną
i określa warunki występowania błędów.
2010-11-24 Systemy wieloagentowe 38
Testowanie protokołu komunikacji przed procesem
implementacji za pomocą narzędzia Spin
2010-11-24 Systemy wieloagentowe 39
Diagram klas jako efekt inżynierii odwrotnej dla modelu MASE (Sprzedaz1MASE)
2010-11-24 Systemy wieloagentowe 40
Metoda run komponentu typu Wysylanie_zadania_ofert
public void run() { int state = 0;
boolean notDone = true;
final int StartState = 0;
final int Idle = 1;
final int StartState_out = 2;
final int Idle_out = 3;
while (notDone) { switch (state) {
case StartState : state = StartState_out; break;
case StartState_out : state = Idle; break;
case Idle : n = 3;
sellers = newList(n);
state = Idle_out; break;
case Idle_out : // /Conversation5_1(<sellers>) Conversation5_1(sellers);
notDone = false; break;
} }
}
2010-11-24 Systemy wieloagentowe 41
Metoda run komponentu typu Wybor_najtanszej_oferty
public void run()
{int state = 0; boolean notDone = true; final int StartState = 0;
final int Choice = 1; final int StartState_out = 2; final int Choice_out = 3;
while (notDone) { switch (state) {
case StartState : state = StartState_out; break;
case StartState_out : n = 3; ///n = 3; bestPrice = 9999; bestOffer = null bestPrice = 9999;
bestOffer = null;
state = Choice; break;
case Choice : [offer_bestPrice]/bestOffer = Seller;
[offer_bestPrice]//bestPrice = offer;
state = Choice_out; break;
case Choice_out : m = checkExternal();
if(m != null){ // receive(replay(), Seller)[n>0 && timeout >0] /Conversation6_1(Seller); n--() if(m.performative.equals("replay")){
if(n>0 && timeout >0) { Conversation6_1(Seller);
n--();
state = Choice;} } }
else { // [!(n>0 && timeout>0)] ^bestOffer() if(!(n>0 && timeout>0)) {
m = new Message();
m.performative = "bestOffer";
notDone = false; } } break;
} } }
2010-11-24 Systemy wieloagentowe 42
Metoda run komponentu typu Drukowanie_ofert
public void run()
{ int state = 0; boolean notDone = true; final int StartState = 0;
final int Printing = 1; final int StartState_out = 2; final int Printing_out = 3;
while (notDone) { switch (state) {
case StartState : state = StartState_out; break;
case StartState_out :m = checkInternal();
if(m != null)
{ // bestOffer()[n>0 && bestOffer!=null] /wiersz = <"Nie, wszyscy, sprzedajacy, odpowiedzieli">
if(m.performative.equals("bestOffer")){
if(n>0 && bestOffer!=null) {
wiersz = "Nie_wszyscy_sprzedajacy_odpowiedzieli";
state = Printing; } }
// bestOffer()[n==0 && bestOffer!=null] /wiersz = <"Best, price"+bestPrice>
else if(m.performative.equals("bestOffer")){
else if(n==0 && bestOffer!=null) { wiersz = "Best_price"+bestPrice;
state = Printing; } }
else if(m.performative.equals("bestOffer")) { // bestOffer()[bestOffer==null]
else if(bestOffer==null) {
state = Printing; } } } break;
case Printing : print(wiersz);
state = Printing_out; break;
case Printing_out : notDone = false; break;
} } }
2010-11-24 Systemy wieloagentowe 43
Metoda run komponentu typu Przygotowanie_ofert (taki sam w Sprzedaz1)
public void run() { int state = 0;
boolean notDone = true;
/* state constant definitions */
final int StartState = 0;
final int Oferta = 1;
final int Oferta_out = 2;
final int StartState_out = 3;
while (notDone) { switch (state) {
case StartState : state = StartState_out; break;
case StartState_out : m = checkExternal();
if(m != null)
if(m.performative.equals("msg")) { Conversation5_1(Client);
state = Oferta; } break;
case Oferta : oferta = set(msg);
state = Oferta_out; break;
case Oferta_out : m = new Message();
m.performative = "oferta";
notDone = false; break;
} } }
2010-11-24 Systemy wieloagentowe 44
Metoda run komponentu typu Opoznione_wysylanie_ofert (taki sam w Sprzedaz1)
public void run() { int state = 0;
boolean notDone = true;
/* state constant definitions */
final int StartState = 0;
final int Delay = 1;
final int StartState_out = 2;
final int Delay_out = 3;
while (notDone) { switch (state) {
case StartState : state = StartState_out; break;
case StartState_out : m = checkInternal();
if(m != null)
if(m.performative.equals("oferta"))
state = Delay; break;
case Delay : timeout(t);
state = Delay_out; break;
case Delay_out : if(timeout<=0) {
Conversation6_1(Client);
notDone = false; } break;
} } }
2010-11-24 Systemy wieloagentowe 45
Struktura prezentacji
Charakterystyka techniki MASE
Charakterystyka techniki JADE
Zastosowanie techniki MASE do wykonania modeli analizy i projektowania przykładu MAS – przykład2
Wprowadzenie do MAS
Zastosowanie techniki JADE do implementacji przykładu MAS – przykład2
Zastosowanie inżynierii odwrotnej do wykazania
spójności modelu projektowego i implementacji
2010-11-24 Systemy wieloagentowe 46
Projekt JADE
przykład 2 - Sprzedaz2JADE
2010-11-24 Systemy wieloagentowe 47
Q u erry_ ref
Info rm C lient1 :
C lientA g ent
S eller1
:S ellerA g ent
Diagram protokołu interakcji (PD)
client_sellers-net typu user-defined w JADE 3
0..3
2010-11-24 Systemy wieloagentowe 48
Diagram klas jako efekt inżynierii odwrotnej dla aplikacji JADE
(Sprzedaz2JADE)
2010-11-24 Systemy wieloagentowe 49
Agent Jade typu ClientAgent
import jade.core.Agent;
import jade.core.behaviours.*;
import jade.core.AID;
import jade.lang.acl.*;
public class ClientAgent extends Agent {
private int N=3;
private MessageTemplate template;
private Wybor_najtanszej_oferty odbior;
private Wysylanie_zapytania_o_oferte pytanie;
private Drukowanie_ofert drukowanie;
private Oferta oferta = new Oferta(N);
public Oferta getOferta() { return oferta; }
public void setOferta(Oferta oferta) { this.oferta = oferta; }
2010-11-24 Systemy wieloagentowe 50
protected void setup() {
SequentialBehaviour seq = new SequentialBehaviour(); //główne zach.sekw.
ACLMessage msgs[] = new ACLMessage[3];
addBehaviour(seq); //dodano główne zachowanie sekwencyjne
SequentialBehaviour seq1 = new SequentialBehaviour(); //1-e zachowanie
for (int i=0; i<3;i++) //sekwencyjne
{ msgs[i] = newMsg(ACLMessage.QUERY_REF, "",
new AID("Sprzedajacy"+(i+1), AID.ISLOCALNAME));
pytanie = new Wysylanie_zapytania_o_oferte(msgs[i]);
seq1.addSubBehaviour(pytanie);
} //1-e zachowanie sekwencyjne zawiera 3 zachowania wysyłania zapytania o ofertę
seq.addSubBehaviour(seq1); //dodano 1-go zachowanie sekwencyjne
ParallelBehaviour par = new ParallelBehaviour(); //2-ie zachowanie równoległe
seq.addSubBehaviour(par); //dodano 2-ie zachowanie równoległe
for (int i=0;i<3;i++)
{ template = MessageTemplate.and(
MessageTemplate.MatchPerformative(ACLMessage.INFORM),
MessageTemplate.MatchConversationId(msgs[i].getConversationId()));
odbior = new Wybor_najtanszej_oferty(this, 1000, template);
par.addSubBehaviour(odbior);
//2-ie zachowanie zawiera 3 równoległe zachowania wyboru najtańszej wiadomości
}
drukowanie = new Drukowanie_ofert(this);
seq.addSubBehaviour(drukowanie); } //3-ie zachowanie drukuje ofertę
2010-11-24 Systemy wieloagentowe 51 // ========== Utility methods Jade Primer=========================
// --- generating Conversation IDs --- protected static int cidCnt = 0;
String cidBase = null;
String genCID() { if (cidBase == null) {
cidBase = getLocalName() + hashCode() + System.currentTimeMillis() % 10000 + "_";
}
return cidBase + (cidCnt++);
}
// --- Methods to initialize ACLMessages --- ACLMessage newMsg(int perf, String content, AID dest) {
ACLMessage msg = newMsg(perf);
if (dest != null) {
msg.addReceiver(dest);
}
msg.setContent(content);
return msg; }
ACLMessage newMsg(int perf) {
ACLMessage msg = new ACLMessage(perf);
msg.setConversationId(genCID());
return msg;
} }
2010-11-24 Systemy wieloagentowe 52
Pomocniczy obiekt Oferta
public class Oferta {
private int oferta = 1000;
private int n;
private int bestPrice = 999;
public int getBestPrice() { return bestPrice; }
public void setBestPrice(int bestPrice) { this.bestPrice = bestPrice; } public int getN() { return n; }
public void setN(int n) { this.n = n; } public void DecN() { --n; }
public int getOferta() { return oferta; }
public void setOferta(int oferta) { this.oferta = oferta; } public Oferta(int N) { n = N; }
public void ustaloferte(int q) {
if (q < getOferta() && q < getBestPrice() && q > 0) setOferta(q);
DecN();
}
public String ocenaoferty() { String wiersz=null;
if (getN() == 0 && getOferta() < 1000)
wiersz = "Najlepsza oferta: " + getOferta();
else if (getN() > 0 && getOferta() < 1000)
wiersz = "Oferta bez " + (getN()) + " wynosi: " + getOferta() + "\n";
else if (getOferta() == 1000) wiersz = "Brak oferty";
return wiersz; } }
2010-11-24 Systemy wieloagentowe 53
import jade.core.behaviours.*;
import jade.lang.acl.*;
// (taki sam w Sprzedaz1)
class Wysylanie_zapytania_o_oferte extends OneShotBehaviour { ACLMessage msg;
int state = 0; //arybut, który „pamięta”, w którym miejscu zakończyła się metoda action
public Wysylanie_zapytania_o_oferte(ACLMessage m) { msg = m; } public void action() {
boolean notDone = true; final int StartState = 0;
final int Idle = 1; final int StartState_out = 2; final int Idle_out = 3;
while (notDone) { switch (state) {
case StartState: state = StartState_out; break;
case StartState_out: state = Idle; break;
case Idle: //msg = newMsg(Querry_ref);
state = Idle_out; break;
case Idle_out: // /Conversation5_1(Seller)
System.out.println("\n" + myAgent.getLocalName() +
" wysyla wiadomosc:\n\n" + msg);
myAgent.send(msg);
notDone = false; break;
} } } /*koniec metody action*/
}
2010-11-24 Systemy wieloagentowe 54
import jade.core.Agent;
import jade.core.behaviours.SimpleBehaviour;
import jade.lang.acl.*;
public class Wybor_najtanszej_oferty extends SimpleBehaviour { private MessageTemplate template;
private long timeOut, wakeupTime;
private boolean finished = false;
private ACLMessage msg = null;
int state = 0; //arybut, który „pamięta”, w którym miejscu zakończyła się metoda action
public Wybor_najtanszej_oferty(Agent a, int millis, MessageTemplate mt) { super(a);
timeOut = millis;
template = mt; }
public void handle(ACLMessage msg) { if (msg == null) {
System.out.print("\n" + myAgent.getLocalName() + ": Czas zostal przekroczony: ");
System.out.println(timeOut); }
else System.out.println("\n" + myAgent.getLocalName() +
" odebral wiadomosc:\n\n" + msg); } public void onStart() {
wakeupTime=(timeOut < 0 ?Long.MAX_VALUE:System.currentTimeMillis()+timeOut);}
public boolean done() { return finished; }
2010-11-24 Systemy wieloagentowe 55
public void action() {
long dt = 0; boolean notDone = true; final int StartState = 0;
final int Choice = 2; final int StartState_out = 1; final int Choice_out = 3;
while (notDone) { switch (state) {
case StartState: state = StartState_out; break;
case StartState_out: state = Choice;; break;
case Choice : state = Choice_out; break;
case Choice_out:
msg = myAgent.receive(template);
if (msg != null) {
String p[]=(msg.getContent()).split(" ");
int q=Integer.parseInt(p[2]);
((ClientAgent)myAgent).getOferta().ustaloferte(q);
finished=true;
handle(msg); } else {
dt = wakeupTime - System.currentTimeMillis();
if (dt > 0) block(dt);
else
{ handle(msg);
finished=true; }
} notDone = false; break;
} } } /*koniec metody action*/ }
2010-11-24 Systemy wieloagentowe 56
import jade.core.Agent;
import jade.core.behaviours.SimpleBehaviour;
import jade.lang.acl.*;
public class Drukowanie_ofert extends SimpleBehaviour {
private boolean finished = false;
private String wiersz;
int state = 0;
//arybut, który „pamięta”, w którym miejscu zakończyła się metoda actionpublic Drukowanie_ofert(Agent a) { super(a); }
public boolean done()
{ return finished; }
2010-11-24 Systemy wieloagentowe 57
public void action() {
boolean notDone = true; long dt = 0; final int StartState = 0;
final int Printing = 2; final int StartState_out = 1; final int Printing_out = 3;
while (notDone) { switch (state) {
case StartState: state = StartState_out;
break;
case StartState_out:
wiersz = ((ClientAgent) myAgent).getOferta().ocenaoferty();
state = Printing;
break;
case Printing: System.out.println(wiersz);
state = Printing_out;
break;
case Printing_out:
finished = true;
notDone = false;
break;
} } } //koniec metody action
}
2010-11-24 Systemy wieloagentowe 58
Definicja klasy SellerAgent taka sama jak
w przykładzie Sprzedaz1
2010-11-24 Systemy wieloagentowe 59
Agent Jade typu SellerAgent
import jade.core.Agent;
import jade.lang.acl.*;
public class SellerAgent extends Agent {
private Przygotowanie_oferty oferta;
private MessageTemplate template =
MessageTemplate.MatchPerformative(ACLMessage.QUERY_REF);
protected void setup() {
oferta = new Przygotowanie_oferty(this, template);
addBehaviour(oferta);
}
}
2010-11-24 Systemy wieloagentowe 60
import jade.core.Agent;
import jade.core.behaviours.*;
import jade.lang.acl.*;
import java.util.Random;
public class Przygotowanie_oferty extends SimpleBehaviour { private Opoznione_wysylanie_ofert oferta_o;
private ACLMessage reply;
private MessageTemplate template;
private Random rnd = new Random();
private boolean finished = false;
int state = 0;
//arybut, który „pamięta”, w którym miejscu zakończyła się metoda actionpublic Przygotowanie_oferty(Agent a, MessageTemplate t) { super(a);
template = t;
}
public boolean done()
{ return finished; }
2010-11-24 Systemy wieloagentowe 61
public void action() {
ACLMessage msg = null;
int delay = 0;
boolean notDone = true;
final int StartState = 0;
final int Oferta = 1;
final int Oferta_out = 2;
final int StartState_out = 3;
2010-11-24 Systemy wieloagentowe 62
while (notDone) { switch (state) {
case StartState: state = StartState_out; break;
case StartState_out: //receive/Conversation5_1(Client);
msg = myAgent.receive(template);
state = Oferta; break;
case Oferta: // we create the reply if (msg != null)
{ reply = msg.createReply();
reply.setPerformative(ACLMessage.INFORM);
reply.setContent("cena oferty: " + rnd.nextInt(100));
delay = rnd.nextInt(2000);
System.out.println("\n" + myAgent.getLocalName() + " odebral wiadomosc:\n\n"
+msg + "\n\n i odpowie po uplywie czasu " + delay);
state = Oferta_out; // but only send it after a random delay
} else { block();
state= StartState_out; //zapamiętanie, że metodę action należy rozpocząć od case StartState_out
notDone = false; } break;
case Oferta_out: // ^oferta() but only send it after a random delay
oferta_o = new Opoznione_wysylanie_ofert(myAgent, delay, reply);
myAgent.addBehaviour(oferta_o);
finished = true;
notDone = false; break;
} } } /*koniec metody action*/ }
2010-11-24 Systemy wieloagentowe 63
import jade.core.Agent;
import jade.core.behaviours.SimpleBehaviour;
import jade.lang.acl.*;
public class Opoznione_wysylanie_ofert extends SimpleBehaviour { private ACLMessage replay;
private long timeout, wakeupTime;
private boolean finished = false;
int state = 0; //arybut, który „pamięta”, w którym miejscu zakończyła się metoda action
public Opoznione_wysylanie_ofert(Agent ag, int delay, ACLMessage r) { super(ag);
timeout = delay;
replay = r;
}
public void onStart() { wakeupTime = System.currentTimeMillis() + timeout; } public boolean done() { return finished; }
public void handleElapsedTimeout() {
System.out.println("\nOpoznienie " + timeout + " minelo");
System.out.println("\n"+myAgent.getLocalName()+" wysyla wiadomosc:\n\n"+replay);
myAgent.send(replay);
}
2010-11-24 Systemy wieloagentowe 64
public void action() {
boolean notDone = true; long dt = 0;
final int StartState = 0; final int Delay = 1;
final int StartState_out = 2; final int Delay_out = 3;
while (notDone) { switch (state) {
case StartState: state = StartState_out; break;
case StartState_out: state = Delay; break;
case Delay:
dt = wakeupTime - System.currentTimeMillis();
state = Delay_out; break;
case Delay_out:
if (dt <= 0) {
finished = true;
// /Conversation6_1(Client);
handleElapsedTimeout(); } else
{ block(dt);
state = Delay; }
notDone = false; break;
} }
} //koniec metody action }
2010-11-24 Systemy wieloagentowe 65
Sprzedaz2JADE- przykład działania 1 (a)
2010-11-24 Systemy wieloagentowe 66
Sprzedaz2JADE- przykład działania 1 (b)
2010-11-24 Systemy wieloagentowe 67
Sprzedaz2JADE- przykład działania 2 (a)
2010-11-24 Systemy wieloagentowe 68
Sprzedaz2JADE- przykład działania 2 (b)
2010-11-24 Systemy wieloagentowe 69
Sprzedaz2JADE- przykład działania 3 (a)
2010-11-24 Systemy wieloagentowe 70
Sprzedaz2JADE- przykład działania 3 (b)
2010-11-24 Systemy wieloagentowe 71
Sprzedaz2JADE- przykład działania 4
2010-11-24 Systemy wieloagentowe 72
Struktura prezentacji
Charakterystyka techniki MASE
Charakterystyka techniki JADE
Zastosowanie techniki MASE do wykonania modeli analizy i projektowania przykładu MAS – przykład 2
Wprowadzenie do MAS
Zakończenie
Zastosowanie techniki JADE do implementacji przykładu MAS – przykład 2
Zastosowanie inżynierii odwrotnej do wykazania
spójności modelu projektowego i implementacji
2010-11-24 Systemy wieloagentowe 73