PD Stefan Bosse
Universitรคt Bremen, FB Mathematik & Informatik
SS 2020
Version 2020-07-15 sbosse@uni-bremen.de |
Agent-Agent und Agent-Welt Kommunikation
Agenten sind parallele und verteilte Systeme!
Eine der einfachsten Kommunikationsmodelle und Architekturen fรผr parallele Systeme ist der geteilte Speicher.
Das Shared-Memory-Modell ist ein hรคufig verwendetes Interprozesskommunikationsparadigma fรผr parallele, weniger fรผr verteilte Systeme. Es ist eng verwandt mit dem Parallelregister und Random-Access-Maschine (PRAM),
Das PRAM-Modell nimmt n identische Verarbeitungseinheiten (PU) an, die mit einer Shared-Memory-Ressource รผber Direktzugriff (SRAM) verbunden sind.
Tupel-Rรคume stellen ein assoziiertes Shared-Memory-Modell dar, wobei die gemeinsam genutzten Daten als Objekte mit einer Reihe von Operationen betrachtet werden, die den Zugriff der Datenobjekte unterstรผtzen
Tupel sind in Rรคumen organisiert, die als abstrakte Berechnungsumgebungen betrachtet werden kรถnnen.
Ein Tupelraum verbindet verschiedene Programme, die verteilt werden kรถnnen, wenn der Tupel-Space oder zumindest sein operativer Zugriff verteilt ist.
Das Tupelraum Organisations- und Zugangsmodell bietet generative Kommunikation, d.h. Datenobjekte kรถnnen in einem Raum durch Prozesse mit einer Lebensdauer รผber das Ende des Erzeugungsprozesses hinaus gespeichert werden.
Ein bekanntes Tupelraum-Organisations- und Koordinationsparadigma ist Linda [GEL85].
Die Daten sind mit Tupeln organisiert.
Ein Tupel ist eine lose gekoppelte Verbindung einer beliebigen Anzahl von Werten beliebiger Art /Typ/
Ein Tupel ist ein Wert und sobald es in einem Tupelraum gespeichert ist, ist es persistent.
Tupeltypen รคhneln den Datenstrukturtypen, sie sind jedoch dynamisch und kรถnnen zur Laufzeit ohne statische Beschrรคnkungen erstellt werden.
Auf die Elemente von Tupeln kann nicht direkt zugegriffen werden, was รผblicherweise Mustererkennung und musterbasierte Dekomposition erfordert, im Gegensatz zu Datenstrukturtypen, die einen benannten Zugriff auf Feldelemente bieten, obwohl die Behandlung von Tupeln als Arrays oder Listen diese Beschrรคnkung lรถsen kann.
Ein Tupel mit n Feldern heiรt n-stellig und wird in der Notation <v1, v2, ..> angegeben.
<'SENSOR',1000>
<'SENSOR2',[10,100,2]>
<1,3,5,7,11>
<'SLEEPMODE',True,2500.34>
<0,'OFF'>
<1,'ON'>
Ein Suchmuster kann ein Wildcard (⊥) anstelle von formalen Parametern verwenden.
Jedes Tupel t hat eine Typsignatur Sig (t) = St = <T1; T2; …; Tn>, ein Tupel mit der gleichen Stelligkeit wie t, das den Typ jedes Tupelfeldes angibt.
Ein Tupel kann nur durch seine Verknรผpfung mit Templates p angesprochen werden.
Definition 1.
Sei t = <d1, d2, .., dn> ein Tupel, p = <dt1, dt2, .., dtm> eine Vorlage; dann wird t durch p abgedeckt (bezeichnet durch match (t, p) = true), wenn die folgenden Bedingungen gelten: (i) m = n. (ii) ∀ dti = di oder dti = ⊥, 1 ≤ i ≤ n. Bedingung (1) prรผft, ob t und p die gleiche Stelligkeit haben, wรคhrend (2) prรผft, ob jedes Nicht-Wildcard-Feld von p gleich ist dem entsprechenden Feld von t.
out("Sensor",1,100); out("Sensor",2,121);
Die Ausfรผhrung der Eingabeoperation entfernt ein Tupel t aus dem Tupelraum, der der Mustervorlage p entspricht. Wenn kein passendes Tupel gefunden wird fรผhrt das zu einer Blockierung des aufrufenden Prozesses bis ein passendes Tupel eingestellt wird.
Beispiel: inp("Sensor",1,s1?); inp("Sensor",i?,s?);
Die Ausfรผhrung der Leseoperation gibt eine Kopie eines Tupels t zurรผck, dass der Vorlage p entspricht, entfernt sie jedoch nicht. Wenn kein passendes Tupel gefunden wird fรผhrt das zu einer Blockierung des aufrufenden Prozesses bis ein passendes Tupel eingestellt wird.
Beispiele: rd("Sensor",1,s1?); rd("Sensor",i?,s?);
Nichtblockierende Version von inp/rd. Wird kein passendes Tupel gefunden wird die Operation ergebnislos terminiert.
Beispiel: res:=inp?('SENSOR',a?,b?);
Teilblockierende Version von inp/rd, Wird einer Zeit von tmo kein passendes Tupel gefunden wird die Operation abgebrochen.
Beispiel: res:=inpw?(1000,'SENSOR',a?,b?);
Alternative Implementierung mit eval (Klientenseite) und listen und reply Operationen (Serverseite):
P1: eval("square",2,y?)
P2: def sq = fun x -> x*x;
listen("square",x?,?);
y=sq(x);
reply("square",x,y);
Ein Produzent erzeugt ein Tupel, das von einem Konsumentenprozess entfernt werden kann.
Ein Verbraucher-Prozess wird blockiert, wenn die Anfrage nicht bearbeitet werden kann, wenn im Tupel-Bereich tatsรคchlich kein passendes Tupel vorhanden ist.
Nachdem ein รผbereinstimmendes Tupel im Tupelraum gespeichert wurde, wird es sofort einen der wartenden Verbraucherprozesse zugewiesen.
Daher ist die Eingabeoperation immer synchron. Einzige Ausnahme sind die nicht permanent blockierenden Versionen, die das Warten auf eine obere Zeitgrenze begrenzen (Timeout).
Es gibt keine anfรคngliche zeitliche Anordnung von Erzeuger- und Verbraucheroperationen.
Die Verteilung von Tupel-Rรคumen auf verschiedenen Rechnerknoten impliziert Synchronisationsprobleme und erfordert normalerweise eine zuverlรคssige Gruppenkommunikation, die in Rechnernetzwerken nicht erwartet werden kann.
Die Verteilung von Tupel-Rรคumen bedeutet die Verteilung und asynchrone Ausfรผhrung einer Menge von Tupelraum-Servern anstelle eines einzelnen Servers.
Ein Tupelraum-Server bietet die notwendige Koordination fรผr gleichzeitige oder verschachtelte In / Out-Anfragen.
Signale sind einfache Nachrichten die
Ein Signal besteht aus einem Signaltyp (Nummer, Zeichenkette usw.) und einem (optionalen) Datenteil (Signalargument)
Ein Signal kann gesendet und empfangen werden.
Hรคufig wird auf den Empfang eines Signals nicht aktiv gewartet sondern mittels Signalhandlern, die eingehende Signale asynchron verarbeiten.
Ein Agent kann verschiedene Signale aus einer Menge S=[Sig1,Sig2,..} verarbeiten
Fรผr jedes Signal muss ein Signalhandler installiert werden!
signal SIGNAL1,SIGNAl2;
Ag1:
on(SIGNAL1, function (arg,from) {
do process signal SIGNAL1 from sender });
on(SIGNAL2, function (arg,from) {
do process signal SIGNAL2 from sender });
Ag2:
send(Ag1,SIGNAL,ε;
Signale sind gekennzeichnet durch das Tupel
<Absender,Empfรคnger,Name,Wert>
Nachteil gegenรผber Tupeln: Der Agent kann die eingehenden Nachrichten nicht filtern bezรผglich
Signale adressieren mobile Agenten die ihren Standort, d.h. die Plattform, wechseln kรถnnen
Der Vermittlung (Routing) der Signalnachrichten kommt daher besondere Bedeutung zu.
Eine Mรถglichkeit eine Signalnachricht zwischen zwei Agenten A und B zu vermitteln ist die Vermittlung entlang des Pfades von A und B (Spuren)
Kommunikation als Sprache kann aktionsorientiert und wissensbasiert sein!
Nachrichten verfolgen Absichten und sollen beim Empfรคnger Aktionen auslรถsen.
Das Ziel einer Anfrage/Ersuchens (Request) eines Sprechers ist die Ausfรผhrung einer Aktion des Zuhรถrers.
Das Erreichen der Ziele รผber Sprachkommunikation hรคngt von Wissen und Planung des Sprechers und des Zuhรถrers ab.
Agentenkommunikationssprachen spielen daher eine wesentliche Rolle bei der Planung und Aktionsausfรผhrung wissensbasierte Agenten (deduktive)
KQML ist eine nachrichtenbasierte Sprache fรผr die Agentenkommunikation. Daher definiert KQML ein allgemeines Format fรผr Nachrichten. Eine KQML-Nachricht kann grob als Objekt betrachtet werden (im Sinne objektorientierter Programmierung): Jede Nachricht hat eine Performative (Zusammenhang zwischen Sprechen und Handeln, die man sich als die Klasse der Nachricht vorstellen kann) und eine Anzahl von Parametern (Attribut / Wert Paare, die man sich als Instanzvariablen vorstellen kann).
Diese Sprache รคhnelt oberflรคchlich KQML: Sie definiert eine “รคuรere” Sprache fรผr Nachrichten, definiert 20 Performativen (wie z.B. inform), um die beabsichtigte Interpretation von Nachrichten zu definieren, und es ist keine spezifische Sprache fรผr den Nachrichteninhalt vorgegeben. Darรผber hinaus รคhnelt die konkrete Syntax fรผr FIPA-ACL-Nachrichten weitgehend der von KQML.
(evaluate
:sender A :receiver B
:language KIF :onto1ogy motors
: reply-with q1 :content (val (torque ml)))
(reply
:sender B :receiver A
:language KIF :ontology motors
:in-reply-to ql :content (= (torque ml) (scalar 12 kgf)))
(stream-about
:sender A :receiver B
:language KIF :ontology motors
:reply-with q1 :content m1)
(tell
:sender B :receiver A
:in-reply-to q1 :content (= (torque ml) (scalar 12 kgf)))
(tell
:sender B :receiver A
:in-rep1y-to q1 :content (= (status ml) normal))
(eos
:sender B :receiver A :in-reply-to q1)
wichtig fรผr ein zielgerichtete Emergenzverhalten von Agenten.
Ontologien kรถnnen die Informationen und Inhalte die ausgetauscht werden beschreiben und klassifizieren sowie Strukturen (Zusammenhรคnge) zwischen Elementen beschreiben.
Auch Ontologien benรถtigen eine geeignete Beschreibungssprache, z.B. im XML/JSON Format, oder die OWLโ The web ontology language
Ontologien beschreiben u.A. bzw. bestehen aus:
Eine Anwendungsontologie definiert Konzepte, die von einer bestimmten Anwendung verwendet werden. Es wird typischerweise auf einer Domain-Ontologie und wiederum auf einer oberen Ontologie aufbauen.
Konzepte aus einer Anwendungsontologie werden normalerweise nicht wiederverwendbar sein: Sie sind typischerweise nur in der Anwendung relevant, fรผr die sie definiert wurden.
Eine Domain-Ontologie definiert Konzepte, die fรผr eine bestimmte Anwendungsdomรคne geeignet sind.
Domain-Ontologien sind in der Regel auf Konzepten einer รผbergeordneten Ontologie aufbaut → Wiederverwendung von Ontologien ist sehr wichtig, da je mehr Anwendungen eine bestimmte Ontologie verwenden, desto mehr รbereinstimmung herrscht รผber Terme.