Многоагентная система, использующая шаблон «производитель-потребитель»? - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь реализовать шаблон Producer-Consumer, который использует мультиагенты в качестве рабочих вместо многопоточности.

Как я понимаю, типичная многопоточная реализация использует BlockingQueue, где один *Поток 1005 * помещает информацию в очередь, и несколько потоков Consumer извлекают данные и выполняют некоторые функции обработки.

Таким образом, следуя той же логике, мой проект будет использовать агент Producer, который генерирует данные и отправляет их нескольким Consumer агентам.На первый взгляд, я подумал, что должен использовать shared BlockingQueue между Consumer агентами, и чтобы агенты обращались к очереди и извлекали данные.Но я не знаю, легко ли это сделать 1016 *, потому что я не думаю, что у агентов есть общая память, и гораздо проще напрямую отправить информацию агентам Consumer в виде сообщений ACL.

Это важно учитывать, потому что мой мультиагентный дизайн будет обрабатывать много данных.Итак, мой вопрос в Jade, что произойдет, если я отправлю много сообщений ACL одному агенту?будет ли агент игнорировать другие сообщения?

В этом сообщении есть ответ, который предлагает ".. В рамках JADE агенты имеют функцию" Входящие "для ACLMessages, в основном объект BlockingQueue, который содержит список полученных сообщений. агент может наблюдать за своим списком и обрабатывать его по мере прохождения жизненного цикла. Контейнеры не имеют этой возможности ... ".Это утверждение правильно?Если это так, то другие сообщения просто ожидают в очереди, и для моего дизайна было бы идеально отправлять информацию непосредственно агентам Consumer, но я не увидел никаких BlockingQueues в классе ACLMessage.

1 Ответ

0 голосов
/ 24 июня 2018

Да, сообщения будут в очереди, и агент не будет их игнорировать.

ACLMessage - это просто объект сообщения, который передается между агентами.Каждый агент имеет свою собственную очередь сообщений (jade.core.MessageQueue) и несколько методов для обработки связи.

Если вы проверяете документацию класса Agent, вы можете найти такие методы, как

  • receive() - неблокирующий прием, возвращает первое сообщение в очереди или null, если очередь пуста
  • receive(MessageTemplate pattern) - ведет себя так же, как и предыдущий, но вы также можете указать шаблон для сообщения, как, например, конкретный AID отправителя, идентификатор разговора, также комбинации.
  • blockingReceive() - получение блокировки, блокирует агента до появления сообщения в очереди
  • blockingReceive(MessageTemplate pattern) - получение блокировки, с шаблоном

а также есть методы для блокировки приема, где вы можете установить время ожидания.

Также важно отметить, что если вы определяете логику своего агента в Behaviour классе, вы также можете просто заблокировать только поведение,вместо того, чтобы блокировать весь агент.

ACLMessage msg = agent.receive();    
if (msg != null) {
    // your logic
} else {
    block();            
}

Разница в том, что метод block() в поведении просто помечает ваше поведение как заблокированное и удаляет его из агента 's активный пул поведения (он добавляется обратно в активный пул, когда сообщение получено или поведение восстанавливается с помощью метода restart()), что позволяет выполнять поведение другого агента, и blockingReceive() полностью блокирует вашего агента и все его поведения, пока он не получит сообщение.

...