Чтение онлайн

ЖАНРЫ

Параллельное и распределенное программирование на С++
Шрифт:

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 «доложит» о то м, что утверждение о су щ ествовании автобусного м аршрута из Детройта в Колу м бус истинно, нес м отря на то, что область рассуждений не содержит утверждения о пря м о м маршруте:

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

Объект класса trip_announcement действительно проверит, существует ли прямой маршрут из Детройта в Колумбус. Если он существует, объект возвратит значение ИСТИНА. В противном случае он попытается найти обходной путь. Подобное поведение реализуется так.

if(directTrip){

return(true);

}

I = UniverseOfDiscourse.begin;

if(validTrip(I,Origin)){

return(true);

}

«Самоопределением» истинности объект обязан оператору operator класса trip_anouncement. Метод directTrip довольно прост, и его работа заключается в последовательном просмотре области рассуждений на предмет существования следующего утверждения:

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

Метод validTrip , чтобы узнать, существует ли обходной путь, использует технологию поиска вглубь (Depth First Search— DFS). Определения методов validTrip и directTrip приведены в листинге 12.7.

// Листинг 12.7. Определения методов validTrip и // directTrip

bool trip_announcement::validTrip(list<trip_announcement>::iterator I, string TempOrigin)

{

if(I == UniverseOfDiscourse.end){ if(Candidates.empty){ TruthValue = false; return(false);

}

else{

trip_announcement Temp; Temp = Candidates.top; I = find(UniverseOfDiscourse.begin, UniverseOfDiscourse.end,Temp); UniverseOfDiscourse.erase(I); Candidates.pop; I = UniverseOfDiscourse.begin; if(I != UniverseOfDiscourse.end){ TempOrigin = Origin;

} else {

TruthValue = false; return(false);

}

}

>

if((*I).origin == TempOrigin &&

(*I).destination == Destination){ Candidates.push(*I); TruthValue = true; return(true);

}

if((*I).origin == TempOrigin){ TempOrigin = (*I).destination; Candidates.push(*I);

}

I++;

return(validTrip(I,TempOrigin));

bool trip_announcement: :directTrip(void) {

list<trip_announcement>::iterator I; I = find(UniverseOfDiscourse.begin,

UniverseOfDiscourse.end, *this); if(I == UniverseOfDiscourse.end){

TruthValue = false;

return(false);

}

TruthValue = true; return(true);

В

обоих методах validTrip и directTrip используется алгоритм find из стандартной библиотеки С++. UniverseOfDiscourse — это контейнер, который содержит убеждения агента и подготовленные для него утверждения. Вспомните, что одним из первых действий, предпринимаемых агентом, является вызов метода updateBeliefs, который заполняет контейнер UniverseOfDiscourse. Определение метода updateBeliefs приведено в листинге 12.8.

// Листинг 12.8. Обновление убеждений

void agent::updateBeliefs(void) {

performance_statement TempP;

TempP.sales(203.0);

TempP.perHour(10 0.0);

TempP.bays(4);

PerformanceBeliefs.push_back(TempP);

trip_announcement Temp;

Temp.origin(«Detroit»);

Temp.destination(«LA»);

TripBeliefs.push_back(Temp);

Temp.origin(«LA»);

Temp.destination(«NJ»);

TripBeliefs.push_back(Temp);

Temp.origin(«NJ»);

Temp.destination(«Windsor»);

TripBeliefs.push_back(Temp);

}

На практике убеждения обычно поступают из среды выполнения агента ( т.е. из файлов, от датчиков, портов, устройств сбора данных и пр.). В листинге 12.8 инфор м ация, поступающая в списки TripBeliefs и PerformanceBeliefs, представляет новые высказывания, которые агент получает о приемлемых маршрутах и эффективности авторемонтной мастерской. Эти высказывания оцениваются относительно директив, выданных агенту. Установкой директив агента зани м ается м етод setGoals . (Его опреде л ение приведено в л истинге 12.9.)

// Листинг 12.9. Метод установки целей агента

void agent::setGoals(void) {

Managerl.perHour(15.0);

Managerl.bays(8);

Managerl.sales(123.2 3);

Manager2.perHour(2 5.3 4);

Manager2.bays(4);

Manager2.sales(12.33);

Manager3.perHour(3 4.3 4);

Manager3.sales(100000.12);

Manager3.bays(10);

Trip1.origin(«Detroit»);

Tripl.destination(«Chicago»);

Trip2.origin(«Detroit»);

Trip2.destination(«NY»);

Trip3.origin(«Detroit»);

Trip3.destination(«Windsor»);

}

Эти директивы сообщают агенту о том, что его владелец хотел бы отправиться в отпуск из Детройта в Чикаго, из Детройта в Нью-Йорк или из Детройта в Виндзор. Помимо маршрутов, также устанавливаются финансовые цели. Чтобы отпуск состоялся, необходимо достижение одной или нескольких таких целей. После установки целей агент обновляет свои убеждения, и его следующая задача будет определена в зависимости от целей и убеждений при условии возможности планирования отпуска. И тогда вызывается второй компонент методов рассуждений агента: determineVacationAppropriate

Поделиться с друзьями: