Работа с JADE в Eclipse: создание первого агента (часть 2)

Автор: Алексей Скороходов

Данная статья является продолжением статьи «Работа с JADE в Eclipse: Создание первого агента!». В предыдущей статье мы рассмотрели вопросы создания программного агента на платформе JADE, но не рассмотрели вопросы коммуникации агентов и их реализации. По сути, не ответили на вопрос, как необходимо разрабатывать агента, который может взаимодействовать с другими.

Итак, агенты…

Агенты — это активные объекты (программные модули), которые могут инициировать целенаправленную деятельность по восприятию среды и воздействию на неё.

Агентам присущи следующие «ментальные» свойства (или их подмножества)*:

  • знания (knowledge)-постоянные, неизменяемые в процессе функционирования знания агента о себе, среде и других агентах;
  • убеждения(beliefs)-знания агента о среде (в том числе, о других агентах), которые могут стечением времени изменяться и становиться неверными;
  • желания(desires)-состояния, которых агент желает достичь (могут быть противоречивыми), аналогичны целям;
  • намерения(intentions)-действия, которые агент собирается выполнить вследствие своих желаний или в силу взятых на себя обязательств;
  • обязательства (commitments)-задачи, решение которых агент берет на себя в рамках кооперации с другими агентами по их просьбе или поручению.

* автор вышеперечисленных свойств агентов — Тарасов В.Б.

В данной статье мы разработаем два типовых агента:

  1. Агента, который будет искать агентов в агентной системе (JADE) и «здороваться» с ними
  2. Агента,  отвечающего на «приветствие».

Реализация:
Этих агентов будем разрабатывать в одном проекте среды разработки Eclipse, но в разных Package  — так что мы сможем создавать в JADE столько копий нужного агента, сколько нам потребуется.

Реализация агента 1 (A.java) представлена в листинге ниже:

package Agent_A;

import jade.core.Agent;
import jade.core.AID;
import jade.domain.AMSService;
import jade.domain.FIPAAgentManagement.*;
import jade.core.behaviours.*;
import jade.lang.acl.*;

public class A extends Agent{
protected void setup()
{
addBehaviour(new CyclicBehaviour(this) // Поведение агента исполняемое в цикле
{
public void action()
{
ACLMessage msg = receive();
if (msg!=null) {
System.out.println( » — » +
myAgent.getLocalName() + » received: » +
msg.getContent() );
}//Вывод на экран локального имени агента и полученного сообщения
block();//Блокируем поведение, пока в очереди сообщений агента не появится хотя бы одно сообщение
}
});
AMSAgentDescription [] agents = null;
try
{
SearchConstraints c = new SearchConstraints();
c.setMaxResults (new Long(-1));
agents = AMSService.search( this, new AMSAgentDescription (), c );
}
catch (Exception e)
{
System.out.println( «Problem searching AMS: » + e );
e.printStackTrace();
}

for (int i=0; i < agents.length; i++)
{
AID agentID = agents[i].getName();
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
msg.addReceiver(agentID);// id агента которому отправляем сообщение
msg.setLanguage(«English»);//Язык
msg.setContent(«Ping»);//Содержимое сообщения
send(msg);//отправляем сообщение
}
}
}

Реализация агента 2 (B.java) представлена в листинге ниже:

package Agent_B;

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

public class B extends Agent{
protected void setup()
{
addBehaviour(new CyclicBehaviour(this)
{
public void action()
{
ACLMessage msg = receive();
if (msg!=null) {
System.out.println( » — » +
myAgent.getLocalName() + » received: » +
msg.getContent() );
//Вывод на экран локального имени агента и полученного сообщения
ACLMessage reply = msg.createReply();
reply.setPerformative( ACLMessage.INFORM )
//set the performative of this ACL message object to the passed constant. Remind to use the set of constants (i.e. INFORM, REQUEST, … ) defined in this class
reply.setContent(«Pong»);Содержимое сообщения
send(reply);//отправляем сообщения
}
block();
}
});
}
}

Как видно из рисунка 1, агент ххх отправил сообщение ”Ping” сам его же получил и вывел на экран.Также получил и вывел принятое сообщение агент ууу, после чего отправил сообщение ”Pong” это был ответ на полученное сообщение. Далее агент ххх получив сообщение ”Pong”, выводит его. (xxx,yyy -экземпляры соответствующих классов (агентов))



Сообщения между агентами

рисунок 1


Далее, с помощью снифера, который встроен в платформу Jade мы можем видеть какие сообщения и кому были отправлены. Так на рис 2. наш агент «xxx» отправил сообщение всем агентам запущенным в данный момент на платформе  JADE  (включая и себя) это связано с тем, что при поиске агентов мы «c.setMaxResults (new Long(-1));»  установили равным «-1».


Сниффер  JADE

рисунок 2

На сегодня все… AgentOWL и вопросы повышения интеллектуальности агентов будут расмотрены в следующих статьях.

4 Responses to Работа с JADE в Eclipse: создание первого агента (часть 2)

  1. Yaroslav:

    for (int i=0; i
    явно незакончено, что там после i?

  2.  for ( int i=0; i < agents.length; i++ )
  3. igo:

    а как их оба запустить?
    у меня только один пускается
    пускаю так -nomtp -gui Agent_1:Agent_A.A Agent_2:Agent_B.B

  4. Margarita:

    У меня такой же вопрос, как в предыдущем комментарии: как запустить оба агента одновременно? Действительно, при таких опциях командной строки запускается только один агент — последний, т.е. Agent_2! С чем это связано?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


Ответить с помощью ВКонтакте: