Вход/Регистрация
Параллельное и распределенное программирование на С++
вернуться

Хьюз Камерон

Шрифт:

if(determineVacationAppropriate){

displayTravelPlan; scheduleVacation;

cout « «Сообщение о возможности отпуска.» « endl;

} else {

cout « «В данное время отпуск нецелесообразен.» « endl;

}

Цикл активизации агента

Многие определения агентов включают требования непрерывности и автономности. Идея состоит в том, что агент должен непрерывно выполнять поставленные перед ним задачи без вмешательства оператора. Агент обладает способностью взаимодействовать со своей средой и (до некоторой степени) контролировать ее благодаря наличию цепи обратной связи. Непрерывность и автономность часто реализуются в виде событийного цикла, при выполнении которого агент постоянно получает сообщения и информацию о событиях. Эти сообщения и события агент использует для обновления своей внутренней модели мира, намерений и предпринимаемых действий. Однако непрерывность и автономность — понятия относительные. Одни агенты должны активизироваться каждую микросекунду, в то время как другие — лишь один раз в год. А в случае программного обеспечения полетов в дальний космос агент может иметь цикл даже больше одного года. Поэтому мы не будем акцентировать внимание на физических событийных циклах и постоянно активных очередях сообщений. Такая организация может подходить для одних агентов, но оказаться непригодной для других. Мы пришли к выводу, что лучше всего здесь применить понятие логического цикла. Логический цикл может (или не может) быть реализован как событийный. Логический цикл может длиться от одной наносекунды до некоторого количества лет. Общий вид простого логического цикла активизации агента показан на рис. 12.3.

Область рассуждения (см. рис. 12.3) представляет все, с чем наш агент может легитимно взаимодействовать. Эта область может состоять из файлов, информации от портов или устройств сбора данных. Получаемая информация должна быть представлена в виде предположений или утверждений (высказываний). Обратите внимание на существование цепи обратной связи от выходных данных агента к входным. Наш агент (см. листинг 12.4) активизируется только несколько раз в год. Следовательно, нет смысла помещать его в постоянно выполняющийся событийный цикл. Наш агент должен периодически активизироваться в течение года для выполнения своих задач. В листинге 12.5 представлен конструктор агента. При активизации агент устанавливает цели, обновляет убеждения, а затем определяет уместность отпуска. Если отпуск возможен, агент предпринимает некоторые действия и по электронной почте уведомляет об этом владельца фирмы. Если же отпуск в данное время нецелесообразен, владелец получает от агента сообщение другого содержания.

Рис. 12.3. Общий вид простого логического цикла активизации агента

12.4.2.2. Стратегии логического вывода агента

Этот агент обладает способностями рассуждать, реализованными частично классом proposition и частично м етодо м determineVacationAppropriate . Вспомните, что в классе proposition объявлен метод operator =0 в виде чисто виртуальной функции. Поэто м у в производно м к л ассе необходи м о реализовать м етод operator . Мы используем этот оператор, чтобы объект предположения мог самостоятельно определить свою «суть», т. е. понять, истинно данное предположение или ложно. Это означает самодостаточность классов предположений. Именно в самодостаточности и состоит фундаментальный принцип объектно-ориентированного программирования: класс представляет собой самостоятельную конструкцию, инкапсулирующую его характеристики и поведение. Итак, одной из основных линий поведения класса предположений и его потомков является способность определять, истинно данное предположение или нет. Для реализации этого средства используется перегрузка операторов и объекты-функции. Рассмотри м фрагменты определения класса proposition и определений его потомков.

//Листинг 12.6. Фрагменты определений класса

// proposition и его потомков

template <class C> bool proposition<C>::operator&&(

proposition &X)

{

return((*this) &&X);

template <class C> bool proposition<C>::operator||(

proposition &X)

{

return((*this) || X);

template<class C> proposition<C>::operator void*(void) {

return((void*)(TruthValue));

bool trip__announcement::operator(void) {

list<trip_announcement>::iterator I; if(directTrip){

return(true);

}

I = UniverseOfDiscourse.begin;

if(validTrip(I,Origin)){

return(true);

}

return(false);

}

Операторы "||" и "&&", используемые в классах предположений, позволяют определить, истинно данное предположение или ложно. В каждом из этих определений операторов в конечном счете вызывается метод operator , определенный в классе-потомке. Обратите внимание на определение оператора "||" (см. листинг 12.6). Этот оператор определен следующим образом.

template <class C> bool proposition<C>::operator||

(proposition &X)

{

return((*this) || X);

}

Это определение позволяет использовать следующий код.

trip_announcement А;

performance_statement В;

if (А || В) {

// Какие-нибудь действия.

}

При вычис л ении выражений А или В будет вызван оператор operator . Каждый класс предположений определяет поведение оператора operator по своему. Напри м ер, в классе trip_announcement оператор operator определяется так.

bool trip_announcement::operator(void) {

list<trip_announcement>::iterator I;

if(directTrip){

return(true);

}

I = UniverseOfDiscourse.begin;

if(validTrip(I, Origin)){

return(true);

}

return(false);

}

При выполнении этого кода станет ясно, существует ли маршрут из заданного исходного пункта в некоторый пункт назнаначения. Например, предположим, что нас интересует переезд из Детройта в Колумбус, при этом область рассуждений содержит следующие данные:

Детройт - Толедо

Толедо - Колу м бус

Тогда объект класса trip_announcement «доложит» о то м, что утверждение о су щ ествовании автобусного м аршрута из Детройта в Колу м бус истинно, нес м отря на то, что область рассуждений не содержит утверждения о пря м о м маршруте:

Детройт - Колу м бус

  • Читать дальше
  • 1
  • ...
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: