Область рассуждения (см. рис. 12.3) представляет все, с чем наш агент может легитимно взаимодействовать. Эта область может состоять из файлов, информации от портов или устройств сбора данных. Получаемая информация должна быть представлена в виде предположений или утверждений (высказываний). Обратите внимание на существование цепи обратной связи от выходных данных агента к входным. Наш агент (см. листинг 12.4) активизируется только несколько раз в год. Следовательно, нет смысла помещать его в постоянно выполняющийся событийный цикл. Наш агент должен периодически активизироваться в течение года для выполнения своих задач. В листинге 12.5 представлен конструктор агента. При активизации агент устанавливает цели, обновляет убеждения, а затем определяет уместность отпуска. Если отпуск возможен, агент предпринимает некоторые действия и по электронной почте уведомляет об этом владельца фирмы. Если же отпуск в данное время нецелесообразен, владелец получает от агента сообщение другого содержания.
Рис. 12.3. Общий вид простого логического цикла активизации агента |
12.4.2.2. Стратегии логического вывода агента
Этот агент обладает способностями рассуждать, реализованными частично классом proposition
и частично м етодо м determineVacationAppropriate()
.Вспомните, что в классе proposition
объявлен метод operator() =0
в виде чисто виртуальной функции. Поэто м у в производно м к л ассе необходи м о реализовать м етод operator(). Мы используем этот оператор, чтобы объект предположения мог самостоятельно определить свою «суть», т. е. понять, истинно данное предположение или ложно. Это означает самодостаточность классов предположений. Именно в самодостаточности и состоит фундаментальный принцип объектно-ориентированного программирования: класс представляет собой самостоятельную конструкцию, инкапсулирующую его характеристики и поведение. Итак, одной из основных линий поведения класса предположений и его потомков является способность определять, истинно данное предположение или нет. Для реализации этого средства используется перегрузка операторов и объекты-функции. Рассмотри м фрагменты определения класса proposition
и определений его потомков.
//Листинг 12.6. Фрагменты определений класса
// proposition и его потомков
template bool proposition::operator&&(
proposition &X)
{
return((*this)() &&X());
template bool proposition::operator||(
proposition &X)
{
return((*this)() || X());
template proposition::operator void*(void) {
return((void*)(TruthValue));
bool trip__announcement::operator()(void) {
list::iterator I; if(directTrip()){
return(true);
}
I = UniverseOfDiscourse.begin();
if(validTrip(I,Origin)){
return(true);
}
return(false);
}
Операторы "||" и "&&", используемые в классах предположений, позволяют определить, истинно данное предположение или ложно. В каждом из этих определений операторов в конечном счете вызывается метод operator()
, определенный в классе-потомке. Обратите внимание на определение оператора "||" (см. листинг 12.6). Этот оператор определен следующим образом.
template bool proposition::operator||
(proposition &X)
{
return((*this)() || X());
}
Это определение позволяет использовать следующий код.
trip_announcement А;
performance_statement В;
if (А || В) {
// Какие-нибудь действия.
}
При вычис л ении выражений Аили Вбудет вызван оператор operator(). Каждый класс предположений определяет поведение оператора operator() по своему. Напри м ер, в классе trip_announcementоператор operator() определяется так.
bool trip_announcement::operator()(void) {
list::iterator I;
if(directTrip()){
return(true);
}
I = UniverseOfDiscourse.begin();
if(validTrip(I, Origin)){
return(true);
}
return(false);
}
При выполнении этого кода станет ясно, существует ли маршрут из заданного исходного пункта в некоторый пункт назнаначения. Например, предположим, что нас интересует переезд из Детройта в Колумбус, при этом область рассуждений содержит следующие данные:
Детройт - Толедо
Толедо - Колу м бус
Тогда объект класса trip_announcement«доложит» о то м, что утверждение о су щ ествовании автобусного м аршрута из Детройта в Колу м бус истинно, нес м отря на то, что область рассуждений не содержит утверждения о пря м о м маршруте:
Читать дальше