Читайте также: |
|
package ExampleOntology;
import jade.Boot;
import jade.core.Profile;
import jade.core.Runtime;
import jade.core.ProfileImpl;
import jade.wrapper.ContainerController;
import jade.wrapper.AgentController;
// Главная программа
public class Main
{
public Main() {}
// Запуск агентов получателя и отправителя
public static void main(String[] args)
{
// Загрузка JADE-системы
String arg[] = {"-gui"};
Boot boot=new Boot(arg);
// Создание агентного контейнера (для локального хоста)
Profile p = new ProfileImpl();
p.setParameter(Profile.MAIN_HOST, "1-fcd36d9673f14");
p.setParameter(Profile.MAIN_PORT, "1099");
p.setParameter(Profile.CONTAINER_NAME, "MyContainer");
Runtime rt = Runtime.instance();
ContainerController cc = rt.createAgentContainer(p);
// Создание и запуск агентов получателя и отправителя,
// которые содержатся в главном контейнере
try
{
AgentController agent1 = cc.createNewAgent("sender", "ExampleOntology.Sender", null);
agent1.start();
AgentController agent2 = cc.createNewAgent("receiver", "ExampleOntology.Receiver", null);
agent2.start();
}
// Обработка исключительной ситуации
catch(Exception e) {e.printStackTrace();}
}}
package ExampleOntology;
import jade.content.onto.Ontology;
import jade.content.onto.BasicOntology;
import jade.content.onto.OntologyException;
import jade.content.schema.PrimitiveSchema;
import jade.content.schema.ConceptSchema;
import jade.content.schema.ObjectSchema;
import jade.content.schema.AggregateSchema;
import jade.content.schema.PredicateSchema;
import jade.content.schema.AgentActionSchema;
// Онтология
public class PeopleOntology extends Ontology
{
// Имя онтологии
public static final String ONTOLOGY_NAME = "PEOPLE_ONTOLOGY";
// Концепты (человек, мужчина, женщина, адрес)
public static final String PERSON = "PERSON";
public static final String MAN = "MAN";
public static final String WOMAN = "WOMAN";
public static final String ADDRESS = "ADDRESS";
// Слоты
public static final String NAME = "NAME";
public static final String STREET = "STREET";
public static final String NUMBER = "NUMBER";
public static final String CITY = "CITY";
// Предикаты
public static final String FATHER_OF = "FATHER_OF";
public static final String MOTHER_OF = "MOTHER_OF";
// Роли предикатов
public static final String FATHER = "FATHER";
public static final String MOTHER = "MOTHER";
public static final String CHILDREN = "CHILDREN";
// Действия
public static final String MARRY = "MARRY";
// Аргументы действий
public static final String HUSBAND = "HUSBAND";
public static final String WIFE = "WIFE";
// Экземпляр онтологии
public static Ontology theInstance = new PeopleOntology();
// Метод доступа к экземпляру онтологии
public static Ontology getInstance() {return theInstance;}
// Конструктор
public PeopleOntology()
{
super(ONTOLOGY_NAME, BasicOntology.getInstance());
try
{
PrimitiveSchema stringSchema = (PrimitiveSchema)getSchema(BasicOntology.STRING);
PrimitiveSchema integerSchema = (PrimitiveSchema)getSchema(BasicOntology.INTEGER);
// Схема для концепта Address
ConceptSchema addressSchema = new ConceptSchema(ADDRESS);
addressSchema.add(STREET, stringSchema, ObjectSchema.OPTIONAL);
addressSchema.add(NUMBER, integerSchema, ObjectSchema.OPTIONAL);
addressSchema.add(CITY, stringSchema);
// Схема для концепта Person
ConceptSchema personSchema = new ConceptSchema(PERSON);
personSchema.add(NAME, stringSchema);
personSchema.add(ADDRESS, addressSchema, ObjectSchema.OPTIONAL);
// Схема для концепта Man
ConceptSchema manSchema = new ConceptSchema(MAN);
manSchema.addSuperSchema(personSchema);
// Схема для концепта Woman
ConceptSchema womanSchema = new ConceptSchema(WOMAN);
womanSchema.addSuperSchema(personSchema);
// Добавление схемы в онтологию и связывание с ней концепта
add(personSchema, Person.class);
add(manSchema, Man.class);
add(womanSchema, Woman.class);
add(addressSchema, Address.class);
// Схема для агрегата
AggregateSchema childrenSchema = new AggregateSchema(BasicOntology.SEQUENCE);
// Схема для предиката FatherOf
PredicateSchema fatherOfSchema = new PredicateSchema(FATHER_OF);
fatherOfSchema.add(FATHER, manSchema);
fatherOfSchema.add(CHILDREN, childrenSchema);
// Схема для предиката MotherOf
PredicateSchema motherOfSchema = new PredicateSchema(MOTHER_OF);
motherOfSchema.add(MOTHER, womanSchema);
motherOfSchema.add(CHILDREN, childrenSchema);
// Добавление схемы в онтологию и связывание с ней предиката
add(fatherOfSchema, FatherOf.class);
add(motherOfSchema, MotherOf.class);
// Схема для действия
AgentActionSchema marrySchema = new AgentActionSchema(MARRY);
marrySchema.add(HUSBAND, manSchema);
marrySchema.add(WIFE, womanSchema);
// Добавление схемы в онтологию и связывание с ней действия
add(marrySchema);
} catch(OntologyException oe) { oe.printStackTrace(); }
}
}
package ExampleOntology;
import jade.content.Concept;
// класс адрес
public class Address implements Concept
{
public String city = null;
public String street = null;
public int number = 0;
public void setCity(String city) {this.city = city;}
public void setStreet(String street) {this.street = street;}
public void setNumber(int number) {this.number = number;}
public String getCity() {return city;}
public String getStreet() {return street;}
public int getNumber() {return number;}
}
package ExampleOntology;
import jade.content.Concept;
// класс человек
public class Person implements Concept
{
public String name = null;
public Address address = null;
public void setName(String name) {this.name = name;}
public void setAddress(Address address){this.address=address;}
public String getName() {return name;}
public Address getAddress() {return address;}
}
package ExampleOntology;
// класс мужчина
public class Man extends Person {}
package ExampleOntology;
// класс женщина
public class Woman extends Person {}
package ExampleOntology;
import jade.content.Predicate;
import jade.util.leap.List;
// класс отец
public class FatherOf implements Predicate
{
public List children = null;
public Man father = null;
public void setChildren(List children){this.children=children;}
public void setFather(Man father) {this.father = father;}
public Man getFather() {return father;}
public List getChildren() {return children;}
}
package ExampleOntology;
import jade.content.Predicate;
import jade.util.leap.List;
// класс мать
public class MotherOf implements Predicate
{
public List children = null;
public Woman mother = null;
public void setChildren(List children){this.children=children;}
public void setMother(Woman mother) {this.mother = mother;}
public Woman getMother() {return mother;}
public List getChildren() {return children;}
}
package ExampleOntology;
import jade.core.Agent;
import jade.core.AID;
import jade.core.behaviours.SimpleBehaviour;
import jade.lang.acl.ACLMessage;
import jade.util.leap.List;
import jade.util.leap.ArrayList;
import jade.content.ContentManager;
import jade.content.abs.AbsConcept;
import jade.content.abs.AbsAggregate;
import jade.content.abs.AbsVariable;
import jade.content.abs.AbsPredicate;
import jade.content.abs.AbsIRE;
import jade.content.onto.Ontology;
import jade.content.onto.BasicOntology;
import jade.content.lang.Codec;
import jade.content.lang.sl.SLCodec;
import jade.content.lang.sl.SLVocabulary;
// Агент-отправитель
public class Sender extends Agent
{
// Получить идентификатор менеджера контента
public ContentManager manager = (ContentManager)getContentManager();
// Агент использует язык SL
public Codec codec = new SLCodec();
// Агент связвн с онтологией PeopleOntology
public Ontology ontology = PeopleOntology.getInstance();
// Simple-поведение агента
class SenderBehaviour extends SimpleBehaviour
{
// Признак завершения агента
public boolean finished = false;
// Конструктор
public SenderBehaviour(Agent a) { super(a); }
//Завершение агента
public boolean done() { return finished; }
// действие агента (отправка двух сообщений)
public void action()
{
try
{
// Подготовить INFORM-сообщение
System.out.println("[" + getLocalName() +
"] Creating inform message with content fatherOf(man:name John:address London, [man:name Bill:address Paris])");
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
AID receiver = new AID("receiver", false);
msg.setSender(getAID());
msg.addReceiver(receiver);
msg.setLanguage(codec.getName());
msg.setOntology(ontology.getName());
// INFORM-сообщение информирует, что:
// fatherOf(man:name "John":address "London",
// [man:name "Bill":address "Paris"])
Man john = new Man();
Man bill = new Man();
john.setName("John");
bill.setName("Bill");
Address johnAddress = new Address();
johnAddress.setCity("London");
john.setAddress(johnAddress);
Address billAddress = new Address();
billAddress.setCity("Paris");
bill.setAddress(billAddress);
FatherOf fatherOf = new FatherOf();
fatherOf.setFather(john);
List children = new ArrayList();
children.add(bill);
fatherOf.setChildren(children);
// Заполнение контента INFORM-сообщения
manager.fillContent(msg, fatherOf);
// Отправка INFORM-сообщения
System.out.println("[" + getLocalName() +
"] Sending the message...");
send(msg);
// Подготовить QUERY_REF-сообщение
System.out.println("[" + getLocalName() +
"] Creating query-ref message with content iota?x fatherOf(?x, [man:name Bill:address Paris])");
msg.setPerformative(ACLMessage.QUERY_REF);
// QUERY_REF-сообщение с контентом:
// iota?x fatherOf(?x, [man:name "Bill"
//:address "Paris"])
// Создание абстрактного дескриптора absBill
AbsConcept absBill = new AbsConcept(PeopleOntology.MAN);
absBill.set(PeopleOntology.NAME, "Bill");
// Создание абстрактного дескриптора absBillAddress
AbsConcept absBillAddress = (AbsConcept)ontology.fromObject(billAddress);
absBill.set(PeopleOntology.ADDRESS, absBillAddress);
// Создание абстрактного дескриптора absChildren
AbsAggregate absChildren = new AbsAggregate(BasicOntology.SEQUENCE);
absChildren.add(absBill);
// Создание абстрактного дескриптора absX
AbsVariable absX = new AbsVariable("x", PeopleOntology.MAN);
// Создание абстрактного дескриптора absFatherOf
AbsPredicate absFatherOf = new AbsPredicate(PeopleOntology.FATHER_OF);
absFatherOf.set(PeopleOntology.FATHER, absX);
absFatherOf.set(PeopleOntology.CHILDREN, absChildren);
// Создание абстрактного дескриптора absIRE
AbsIRE absIRE = new AbsIRE(SLVocabulary.IOTA);
absIRE.setVariable(absX);
absIRE.setProposition(absFatherOf);
// Заполнение контента QUERY_REF-сообщения
manager.fillContent(msg, absIRE);
// Отправка QUERY_REF-сообщения
System.out.println("[" + getLocalName() +
"] Sending the message...");
send(msg);
} catch(Exception e) { e.printStackTrace(); }
finished = true;
}
}
// регистрация языка и онтологии, добавление поведения агента
public void setup()
{
manager.registerLanguage(codec);
manager.registerOntology(ontology);
addBehaviour(new SenderBehaviour(this));
}
}
package ExampleOntology;
import jade.core.Agent;
import jade.core.AID;
import jade.core.behaviours.SimpleBehaviour;
import jade.lang.acl.ACLMessage;
import jade.content.ContentManager;
import jade.content.ContentElement;
import jade.content.abs.AbsContentElement;
import jade.content.abs.AbsIRE;
import jade.content.abs.AbsConcept;
import jade.content.abs.AbsPredicate;
import jade.content.onto.Ontology;
import jade.content.onto.BasicOntology;
import jade.content.lang.Codec;
import jade.content.lang.sl.SLCodec;
// Агент-получатель
public class Receiver extends Agent
{
// Получить идентификатор менеджера контента
public ContentManager manager = (ContentManager)getContentManager();
// Агент использует язык SL
public SLCodec codec = new SLCodec();
// Агент связвн с онтологией PeopleOntology
public Ontology ontology = PeopleOntology.getInstance();
// Анализируемое выражение INFORM-сообщения
public FatherOf proposition = null;
// Simple-поведение агента
class ReceiverBehaviour extends SimpleBehaviour
{
// Признак завершения агента
public boolean finished = false;
// Конструктор
public ReceiverBehaviour(Agent a) { super(a); }
//Завершение агента
public boolean done() { return finished; }
// действие агента (получение двух сообщений)
public void action()
{
for(int c = 0; c < 2; c++)
{
try
{
System.out.println("[" + getLocalName() +
"] Waiting for a message...");
ACLMessage msg = blockingReceive();
if (msg!= null)
{
switch(msg.getPerformative())
{
// если получено INFORM-сообщение
case ACLMessage.INFORM:
ContentElement p = manager.extractContent(msg);
if(p instanceof FatherOf)
{
proposition = (FatherOf)p;
System.out.println("[" + getLocalName() +
"] Receiver inform message: information stored.");
break;
}
// если получено QUERY_REF-сообщение
case ACLMessage.QUERY_REF:
AbsContentElement abs = manager.extractAbsContent(msg);
if(abs instanceof AbsIRE)
{
// Подготовить INFORM-сообщение
ACLMessage reply = msg.createReply();
reply.setPerformative(ACLMessage.INFORM);
AID sender = new AID("sender", false);
reply.setSender(getAID());
reply.addReceiver(sender);
reply.setLanguage(codec.getName());
reply.setOntology(ontology.getName());
// Создание абстрактных дескрипторов AbsIRE, AbsConcept, absEquals
AbsIRE ire = (AbsIRE)abs;
AbsConcept absFather = (AbsConcept)ontology.fromObject(proposition.getFather());
AbsPredicate absEquals = new AbsPredicate(BasicOntology.EQUALS);
absEquals.set(BasicOntology.EQUALS_LEFT, ire);
absEquals.set(BasicOntology.EQUALS_RIGHT, absFather);
// Заполнение контента INFORM-сообщения
manager.fillContent(reply, absEquals);
// Отправка INFORM-сообщения
send(reply);
System.out.println("[" + getLocalName() + "] Received query-ref message: reply sent:");
System.out.println(absEquals);
break;
}
// если сообщение плохо сформировано
default:
System.out.println("["+ getLocalName()+ "] Malformed message.");
}
}
} catch(Exception e) { e.printStackTrace(); }
}
finished = true;
}
}
// регистрация языка и онтологии, добавление поведения агента
public void setup()
{
manager.registerLanguage(codec);
manager.registerOntology(ontology);
addBehaviour(new ReceiverBehaviour(this));
}
}
Дата добавления: 2015-11-14; просмотров: 48 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пример реализации работы с протоколом FIPA-Subscribe для мультиагентной системы в программной среде JADE | | | Краткие теоретические сведения. |