Работа с JADE в Eclipse: создание первого агента (часть 2)
Автор: Алексей Скороходов
Данная статья является продолжением статьи «Работа с JADE в Eclipse: Создание первого агента!». В предыдущей статье мы рассмотрели вопросы создания программного агента на платформе JADE, но не рассмотрели вопросы коммуникации агентов и их реализации. По сути, не ответили на вопрос, как необходимо разрабатывать агента, который может взаимодействовать с другими.
Итак, агенты...
Агенты — это активные объекты (программные модули), которые могут инициировать целенаправленную деятельность по восприятию среды и воздействию на неё.
Агентам присущи следующие «ментальные» свойства (или их подмножества)*:
- знания (knowledge)-постоянные, неизменяемые в процессе функционирования знания агента о себе, среде и других агентах;
- убеждения(beliefs)-знания агента о среде (в том числе, о других агентах), которые могут стечением времени изменяться и становиться неверными;
- желания(desires)-состояния, которых агент желает достичь (могут быть противоречивыми), аналогичны целям;
- намерения(intentions)-действия, которые агент собирается выполнить вследствие своих желаний или в силу взятых на себя обязательств;
- обязательства (commitments)-задачи, решение которых агент берет на себя в рамках кооперации с другими агентами по их просьбе или поручению.
* автор вышеперечисленных свойств агентов - Тарасов В.Б.
В данной статье мы разработаем два типовых агента:
- Агента, который будет искать агентов в агентной системе (JADE) и «здороваться» с ними
- Агента, отвечающего на «приветствие».
Реализация:
Этих агентов будем разрабатывать в одном проекте среды разработки 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».
рисунок 2
На сегодня все... AgentOWL и вопросы повышения интеллектуальности агентов будут расмотрены в следующих статьях.
4 комментария к этой записи
Оставить комментарий

for (int i=0; i
явно незакончено, что там после i?
а как их оба запустить?
у меня только один пускается
пускаю так -nomtp -gui Agent_1:Agent_A.A Agent_2:Agent_B.B
У меня такой же вопрос, как в предыдущем комментарии: как запустить оба агента одновременно? Действительно, при таких опциях командной строки запускается только один агент – последний, т.е. Agent_2! С чем это связано?