Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Sb96899

.pdf
Скачиваний:
22
Добавлен:
13.02.2021
Размер:
842.94 Кб
Скачать

Респондент, получивший сообщение accept-proposal (предложение которого было принято), выполняет запрошенное действие и по его окончании отвечает сообщением inform с результатами действия или сообщением типа failure («Неудача»), если по какой-то причине не удалось выполнить запрошенное действие.

Инициатор может отменить взаимодействие по данному протоколу, послав сообщение cancel («Отмена»).

6.2. Порядок выполнения работы

1.Изучить тексты примеров, представленных в прил. 2.

2.Доработать код агента, созданного в Лабораторной работе № 4, в соответствии с вариантом задания (табл. 4.1).

6.3. Содержание отчета

1.Текст программы агента, выполняющего запросы. Пояснение работы этой программы.

2.Протокол консольных сообщений.

3.Выводы.

6.4. Вопросы для самоконтроля

1.Зачем нужны протоколы взаимодействия агентов?

2.Как создать и добавить агенту новое поведение на основе протокола?

3.Какие программные методы необходимо реализовать для агентов, выступающих в роли инициатора и респондента?

4.Какие протоколы стандартизированы FIPA? Кратко опишите последовательность действий агента (Инициатора и Респондента) для протокола.

ЛАБОРАТОРНАЯ РАБОТА № 7 Работа с сервисом «желтых страниц» DF

Цель работы: научиться использовать сервис «желтых страниц» для регистрации в нем агентов и их поиска другими агентами.

7.1. Теоретические сведения

Рассмотрим ситуацию, когда некоторому агенту необходимо получить от других агентов определенную информацию, но ему неизвестны агенты, к которым можно обратиться с соответствующим запросом. Для того чтобы

21

найти требуемых агентов, необходимо воспользоваться сервисом «желтых страниц».

Сервис «желтых страниц» позволяет агентам публиковать информацию о предоставляемых ими услугах в общедоступном реестре, где эта информация может быть найдена заинтересованными в этих услугах агентами.

В среде JADE сервис «желтых страниц» в соответствии со специфика-

цией FIPA обеспечивается агентом DF (Directory Facilitator).

Каждая FIPA-платформа по умолчанию содержит одного агента DF (с локальным именем «DF»). При необходимости могут быть активизированы другие агенты сервиса «желтых страниц». Несколько агентов сервиса «желтых страниц» могут объединяться в один распределенный каталог желтых страниц.

Согласно спецификации FIPA [4] взаимодействие с агентом «желтых страниц» осуществляется с использованием ACL-сообщений, языка содержания SL0 и онтологии FIPA-agent-management. Для упрощения этих взаимодействий в среде JADE имеется класс jade.domain.DFService, используя который можно публиковать и искать услуги, запрашивая агента DF.

7.1.1. Публикация услуги

Агент, желающий опубликовать одну или более услуг, должен сообщить DF следующую информацию:

собственный уникальный идентификатор агента – AID;

список поддерживаемых им языков коммуникации и онтологий;

список предлагаемых им услуг (сервисов).

Каждая запись о предоставляемом сервисе включает: тип сервиса, имя агента, языки и онтологии, требуемые для использования сервиса, и множество специфичных свойств сервиса.

Все перечисленные сущности поддерживаются реализованными в JADE

программными классами DFAgentDescription, ServiceDescription и Property.

Для публикации сервиса агент должен создать его описание в виде экземпляра класса DFAgentDescription и вызвать статический метод register() класса

DFService.

Как правило (но необязательно), регистрация сервиса выполняется в методе setup(). Именно такой способ регистрации использован в агенте, предоставляющем учебные курсы (прил. 3).

22

7.1.2. Поиск услуги

Агент, которому требуется найти некоторый сервис, должен предоставить агенту DF шаблон описания. Результатом поиска будет список всех описаний, соответствующих предоставленному шаблону по составу полей и содержащихся в них значений.

Для динамического поиска всех агентов, предоставляющих требуемый сервис, можно использовать статический метод search() класса DFService.

В примере, приведенном в прил. 3, выполняется поиск всех агентов, предоставляющих учебные курсы. Поскольку агенты могут добавляться и исключаться из системы динамически, перед запросом сервиса у агента требуется обновление списка известных агентов, предоставляющих требуемый сервис.

7.2. Порядок выполнения работы

1.Изучить примеры, представленные в прил. 3.

2.Разработать код агента, выполняющего регистрацию сервиса в соответствии с вариантами табл. 7.1. Добавить дополнительно 2 пользовательских параметра по своему усмотрению.

 

 

 

Таблица 7.1

 

 

Варианты заданий

 

 

 

 

 

Вариант

Тип

Язык

Онтология

 

 

 

 

1

Course-Seller

FIPA-SL

Course-Ontology

 

 

 

 

2

Book-Seller

FIPA-SL0

Book-Ontology

 

 

 

 

3

Course-Maker

LEAP

Course-Ontology

 

 

 

 

4

Book-Annotator

FIPA-SL

Book-Ontology

 

 

 

 

5

Music-Seller

FIPA-SL0

Music-Ontology

 

 

 

 

3. Разработать код агента, выполняющего поиск требуемого сервиса. (Данный пункт задания требует от студента углубленной самостоятельной проработки.)

7.3. Содержание отчета

1.Программный код двух взаимодействующих агентов.

2.Текст с результатами поиска, выводимый в консоль агентом, выполняющим поиск сервиса.

3.Выводы.

23

7.4. Вопросы для самоконтроля

1.Зачем нужен сервис «желтых страниц»?

2.Какие параметры сервиса можно зарегистрировать у DF?

3.Как выполнить запрос к сервису?

4.Сколько DF может существовать на одной платформе?

5.Какие методы реализует класс DFServise для удобства прикладного программиста?

СПИСОК ЛИТЕРАТУРЫ

1.Пантелеев М. Г., Пузанков Д. В. Интеллектуальные агенты и многоагентные системы. СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2015. 216 с.

2.Пантелеев М. Г., Жандаров В. В. Интеллектуальные агенты и многоагентные системы: учеб. пособие. СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2009. 64 с.

3.Пантелеев М. Г., Водяхо А. И., Жандаров В. В. Технологии семантического Веб: учеб. пособие. СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2008. 64 с.

4.Сайт Foundation for Intelligent Physical Agents (FIPA). URL: http://www.fipa.org/ (дата обращения: 25.05.2018).

5.Жандаров В. В., Пантелеев М. Г. Мультиагентные системы: учеб.- метод. пособие. СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2016. 36 с.

6.Сайт Java Agent Development Framework (JADE). URL: http://jade.tilab.com/ (дата обращения: 25.05.2018).

24

ПРИЛОЖЕНИЯ

1. Листинги программ к Лабораторной работе № 5

//Файл maslabs.lab5.StudentOntology.java

/*Пользовательская онтология, связывающая понятия, предикаты и действия */ package maslabs.lab5;

import jade.content.onto.*; import jade.content.onto.basic.*; import jade.content.schema.*;

import jade.content.schema.facets.*; import maslabs.lab5.onto.*;

import java.util.*;

public class StudentOntology extends Ontology

{

/**A symbolic constant, containing the name of this ontology.*/ public static final String NAME = "student-ontology";

//VOCABULARY

//Concepts

public static final String STUDENT = "STUDENT"; public static final String INSTRUCTOR = "INSTRUCTOR"; public static final String COURSE = "COURSE";

// Actions

public static final String REGISTER = "REGISTER"; // Predicates

public static final String REGISTERED = "REGISTERED";

public static final String COURSE_AVAILABLE = "COURSE-AVAILABLE"; private static Ontology theInstance = new

StudentOntology(BasicOntology.getInstance());

/**

This method grants access to the unique instance of the employment ontology.

@return An <code>Ontology</code> object, containing the concepts of the employment ontology.

*/

public static Ontology getInstance() { return theInstance;

}

private StudentOntology(Ontology base)

{

super(NAME, base); try

{

// Adds

the roles of the basic ontology (ACTION, AID,...)

add(new

ConceptSchema(STUDENT), Student.class);

add(new

ConceptSchema(INSTRUCTOR), Instructor.class);

add(new

ConceptSchema(COURSE), Course.class);

add(new

AgentActionSchema(REGISTER), Register.class);

add(new

PredicateSchema(REGISTERED), Registered.class);

add(new

PredicateSchema(COURSE_AVAILABLE), CourseAvailable.class);

ConceptSchema cs = (ConceptSchema) getSchema(STUDENT); cs.add("name", (PrimitiveSchema) getSchema(BasicOntology.STRING)); cs.add("groupnumber", (PrimitiveSchema)

getSchema(BasicOntology.STRING));

cs = (ConceptSchema) getSchema(INSTRUCTOR);

25

cs.add("name", (PrimitiveSchema) getSchema(BasicOntology.STRING)); cs.add("dept", (PrimitiveSchema) getSchema(BasicOntology.STRING));

cs = (ConceptSchema) getSchema(COURSE);

cs.add("name", (PrimitiveSchema) getSchema(BasicOntology.STRING)); cs.add("instructor", (ConceptSchema) getSchema(INSTRUCTOR));

AgentActionSchema as = (AgentActionSchema) getSchema(REGISTER); as.add("student", (ConceptSchema) getSchema(STUDENT)); as.add("course", (ConceptSchema) getSchema(COURSE));

PredicateSchema ps = (PredicateSchema) getSchema(REGISTERED); ps.add("student", (ConceptSchema) getSchema(STUDENT)); ps.add("course", (ConceptSchema) getSchema(COURSE));

ps = (PredicateSchema) getSchema(COURSE_AVAILABLE); ps.add("course", (ConceptSchema) getSchema(COURSE));

} // End of try catch(OntologyException oe)

{

oe.printStackTrace();

}

} //end of initInstance

}

//Файл maslabs.lab5.Course.java

/*Класс, содержащий информацию о понятии «курс»*/ package maslabs.lab5.onto;

import jade.content.*;

public class Course implements Concept

{

private String name = null;//name of course

private Instructor instructor = null;//name of instructor public void setName(String n) {name=n;}

public String getName() {return name;}

public void setInstructor(Instructor i) {instructor=i;} public Instructor getInstructor() {return instructor;}

}

//Файл maslabs.lab5.CourseAvailable.java

/*Класс, содержащий информацию о предикате «курс доступен»*/ package maslabs.lab5.onto;

import jade.content.*;

public class CourseAvailable implements Predicate

{

private Course course = null;

public void setCourse(Course c) {course=c;} public Course getCourse() {return course;}

}

//Файл maslabs.lab5.Instructor.java

/*Класс, содержащий информацию о преподавателе*/ package maslabs.lab5.onto;

import jade.content.*;

public class Instructor implements Concept

{

private String name = null;//instructor name

private String dept = null;//department and faculty info public void setName(String n) {name=n;}

26

public String getName() {return name;} public void setDept(String d) {dept=d;} public String getDept() {return dept;}

}

//Файл maslabs.lab5.Register.java

/*Класс, содержащий информацию о действии «Зарегистрировать студента как слушателя курса»*/

package maslabs.lab5.onto; import jade.content.*;

public class Register implements AgentAction

{

private Student _student = null; private Course _course = null;

public Course getCourse(){ return _course; } public Student getStudent(){ return _student; }

public void setCourse(Course course) { this._course = course; } public void setStudent(Student student) { this._student = student; }

}

//Файл maslabs.lab5.Registered.java

/*Класс, содержащий информацию о предикате «Зарегистрирован студент Х как слушатель курса Y»*/

package maslabs.lab5.onto; import jade.content.*;

public class Registered implements Predicate

{

private Student student = null; private Course course = null;

public Course getCourse() { return course; } public Student getStudent() { return student; }

public void setCourse(Course course) { this.course = course; } public void setStudent(Student student) { this.student = student; }

}

//Файл maslabs.lab5.Student.java

/*Класс, содержащий информацию о студенте*/ package maslabs.lab5.onto;

import jade.content.*;

public class Student implements Concept

{

private String name = null; private String groupnumber = null;

public String getName() {return name;} public void setName(String n) {name=n;}

public String getGroupNumber() {return groupnumber;} public void setGroupNumber(String gn) {groupnumber=gn;}

}

//Файл maslabs.lab5.SenderAgent.java

/*Класс агента, посылающего запрос на регистрацию студента как слушателя курса*/

package maslabs.lab5;

import java.io.*; import java.util.*; import jade.core.*;

import jade.core.behaviours.*; import jade.lang.acl.*;

import jade.content.lang.sl.*; import jade.domain.*;

27

import jade.content.onto.basic.*; import jade.content.onto.*; import jade.content.*;

import jade.content.abs.*; import jade.content.lang.*; import maslabs.lab5.onto.*;

public class SenderAgent extends Agent

{

private ContentManager manager = (ContentManager) getContentManager();

//This agent "speaks" the SL language private Codec codec = new SLCodec();

//This agent "knows" the Music-Shop ontology

private Ontology ontology = StudentOntology.getInstance();

protected void setup()

{

manager.registerLanguage(codec);

manager.registerOntology(ontology);

System.out.println("Sender agent "+this.getName()+" is started."); System.out.print("Please enter the name of the receiver agent (default is

'receive'):");

try

{

BufferedReader buff = new BufferedReader(

new InputStreamReader(System.in)); String receiverName = buff.readLine();

if (receiverName.equalsIgnoreCase("") ) receiverName="receive";

AID receiver=new AID(receiverName, false);//name of the receiver agent //initialization of message to be sent

Register reg=new Register(); Instructor instr=new Instructor(); instr.setName("Panteleev"); instr.setDept("CS");

Course crs=new Course(); crs.setName("MAS Course"); crs.setInstructor(instr); Student stud=new Student(); stud.setName("Ivanov"); stud.setGroupNumber("8307"); reg.setStudent(stud); reg.setCourse(crs);

ACLMessage msg=new ACLMessage(ACLMessage.REQUEST); msg.setSender(getAID()); msg.addReceiver(receiver); msg.setOntology(ontology.getName()); msg.setLanguage(codec.getName());

Action a = new Action(); a.setActor(receiver); a.setAction(reg);

// Write the action in the :content slot of the message try

{

manager.fillContent(msg, a);

}

catch (Exception pe)

{

pe.printStackTrace();

}

SenderBehaviour b=new SenderBehaviour(this, msg);

28

addBehaviour(b);

System.out.println("The following message is being sent:\n"+ msg.toString());

}

catch(Exception fipaonto)

{

fipaonto.printStackTrace();

}

}

}

//Файл maslabs.lab5.ReceiverAgent.java

/*Класс агента, получающего запрос на регистрацию студента как слушателя курса*/

package maslabs.lab5;

import java.io.*; import java.util.*;

import jade.core.*;

import jade.core.behaviours.*; import jade.lang.acl.*;

import jade.content.lang.sl.*; import jade.domain.*;

import jade.content.*; import jade.content.onto.*;

import jade.content.onto.basic.*; import jade.content.abs.*;

import jade.content.lang.*;

import maslabs.lab5.onto.*;

public class ReceiverAgent extends Agent

{

private ContentManager manager = (ContentManager) getContentManager();

//This agent "speaks" the SL language private Codec codec = new SLCodec();

//This agent "knows" the Music-Shop ontology

private Ontology ontology = StudentOntology.getInstance();

protected void setup()

{

manager.registerLanguage(codec);

manager.registerOntology(ontology);

//System.out.println("Receiver agent "+this.getName()+" is started."); //initialization for receive

try

{

MessageTemplate mt = MessageTemplate.MatchOntology(ontology.getName()); ACLMessage recmsg = blockingReceive(mt);

System.out.println("The following message is received:\n"+ recmsg.toString());

//analysis of the received message

// System.out.println(manager.extractContent(recmsg)); Action a = (Action)manager.extractContent(recmsg); if(a.getAction() instanceof Register)

{

Register proposition = (Register)a.getAction(); System.out.println("Course information received.");

29

Course c=(Course) proposition.getCourse(); String courseName=c.getName();

Instructor i=c.getInstructor(); String instrName=i.getName();

System.out.println("Course name: "+courseName+", Instructor: "+instrName);

}

}

catch (Exception oe)

{

oe.printStackTrace();

}

}//setup()

}

2. Листинги программ к Лабораторной работе № 6

//Файл maslabs.lab6.FIPARequestInitiatorAgent.java /*Агент, высылающий запрос по протоколу FIPARequest

В качестве параметров запуска агента указываются агенты-респонденты*/ package maslabs.lab6;

import jade.core.Agent; import jade.core.AID;

import jade.lang.acl.ACLMessage; import jade.proto.AchieveREInitiator; import jade.domain.FIPANames;

import java.util.Date; import java.util.Vector;

public class FIPARequestInitiatorAgent extends Agent

{

private int nResponders; protected void setup()

{

// Read names of responders as arguments Object[] args = getArguments();

if (args != null && args.length > 0)

{

nResponders = args.length;

System.out.println("Requesting dummy-action to "+nResponders + "responders.");

// Fill the REQUEST message

ACLMessage msg = new ACLMessage(ACLMessage.REQUEST); for (int i = 0; i < args.length; ++i)

{

msg.addReceiver(new AID((String) args[i], AID.ISLOCALNAME));

}

msg.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST); // We want to receive a reply in 10 secs

msg.setReplyByDate(new Date(System.currentTimeMillis() + 10000)); msg.setContent("dummy-action");

addBehaviour(new AchieveREInitiator(this, msg)

{

protected void handleInform(ACLMessage inform)

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]