Добавить в цитаты Настройки чтения

Страница 129 из 181

bool trip_a

list<trip_a

if(directTrip()){

return(true);

}

I = UniverseOfDiscourse.begin();

if(validTrip(I, Origin)){

return(true);

}

return(false);

}

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

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

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

Тогда объект класса trip_a

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

Объект класса trip_a

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_a

{

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

}

else{

trip_a

} 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_a

list<trip_a

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_a

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()

Этот метод передает контейнер UniverseOfDiscourse каждому из объектов предположен и й. После это г о он использует утверждение, выраженное в следую щ ей форме: (А v В v С) ^ (Q v R v S) --> W

Это выражение можно озвучить так: если хотя бы одно из утверждений каждой группы истинно, то элемент W примет значение ИСТИНА. Для наше г о а г ента это означает, что если дости г нута хотя бы одна из целей эффективности бизнеса и существует хотя бы один из приемлемых автобусных м аршрутов, то отпуск м ожно планировать. Определение м етода determineVacationAppropriate () представлено в листинге 12.10.

// Листинг 12.10. Второй метод рассуждений

bool agent::determineVacationAppropriate(void) {

bool TruthValue;

Managerl.universe(PerformanceBeliefs);

Manager2.universe(PerformanceBeliefs);

Manager3.universe(PerformanceBeliefs);

Tripl.universe(TripBeliefs);

Trip2.universe(TripBeliefs);

Trip3.universe(TripBeliefs);

TruthValue = ((Managerl || Manager2 || Manager3) &&

(Tripl || Trip2 || Trip3)); return(TruthValue);

}

Обратите внимание на то, что списки TripBeliefs и PerformanceBeliefs являются аргументами метода universe() объектов Trip и Manager. Именно здесь объекты предположений получают информацию из предметной области (UniverseOfDiscourse). Прежде чем объект класса proposition вызовет оператор operator(), его контейнер UniverseOfDiscourse должен заполниться имеющимися у агента данными. В листинге 12.10 при вычислении выражения

((Managerl || Manager2 || Manager3) && (Tripl || Trip2 || Trip3));

оценивается шесть предположений (посредством выполнения оператора "||"). Оператор " | |" для каждого предположения выполняет оператор operator (), который для определения истинности предположения использует список UniverseOfDiscourse. Слелует иметь в виду, что классы trip_a