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

Хьюз Камерон

Шрифт:

1. Эффективное и рациональное разделение работы между несколькими компонентами.

2. Координация параллельно выполняющихся программных компонентов.

3. Разработка соответствующего взаимодействия (когда это необходимо) между компонентами.

4. Обработка исключительных ситуаций, ошибок и частичных отказов (если агенты функционируют на отдельных компьютерах).

Мультиагентные параллельные архитектуры часто характеризуются как слабосвязанные, т.е. им присущ минимум взаимодействия и взаимозависимости. Каждый агент знает свою цель и обладает методами для ее достижения. В то время как п. 3 не подвластен классу агента, п. 1, 2 и 4 можно легко управлять с помощью классов агентов. Например, при использовании агентов влияние п. 2 уменьшается, поскольку каждый агент рационален, имеет цель, а также способы и средства ее достижения. Поэтому вся ответственность смещается с алгоритма координации и управления на действия каждого агента. Влияние п. 4 также уменьшается, поскольку агенты самодостаточны, рациональны и автономны, а кроме того, хорошо продуманный класс агента должен включать необходимые меры по обеспечению отказоустойчивости агентов. Поскольку состояние агента инкапсулировано, ответственность за защиту критических разделов в объекте агента целиком воалагается на класс агента. Агент должен приводить в исполнение собственные стратегии доступа к данным. Возможные стратегии доступа, из которых могут выбирать агенты, перечислены в табл. 12.2.

Таблица 12.2. Стратегии доступа

EREW Монопольное чтение, монопольная запись

(Exclusive Read Exclusive Write)

CREW Параллельное чтение, монопольная запись

(Concurrent Read Exclusive Write)

ERCW Монопольное чтение, параллельная запись

(Exclusive Read Concurrent Write)

CRCW Параллельное чтение, параллельная запись

(Concurrent Read Concurrent Write)

Класс каждого агента должен определить, какал именно стратегия доступа приемлема в мультиагентной среде. В ряде случаев реализуются не просто отдельные стратегии доступа, перечисленные в табл. 12.2, а их комбинации. Это позволяетупростить параллельное программирование, поскольку разработчик может работать на более высоком уровне и не беспокоиться о построении мьютексов, семафоров и пр. Мультиагентные решения позволяют разработчику не погружаться в детали координации вызова каждой функции и организации доступа к данным. Каждый агент имеет цель. Каждый агент рационален, а следовательно, обладает определенной логикой для достижения своей цели. Процесс программирования в этом случае больше напоминает делегирование задач, а не координацию задач, которая характерна для традиционного параллельного программирования. Поскольку агентно-ориентированное программирование — это объектно-ориентированное программирование специального вида, применительно к агентам используется более декларативный вид параллельного программирования по сравнению с традиционным процедурно-ориентированным программированием, которое часто реализуется такими языками, как Fortran или С. Разработчик лишь определяет, что нужно сделать и какие агенты должны это сделать, т.е. выходит, что параллелизм практически сам заботится о себе. При этом всегда существует некоторый объем программирования, связанного с координацией и организацией взаимодействия, но агентно-ориентированное программирование сводит этот необходимый объем к минимуму. Однако обо всех этих «плюсах» можно говорить лишь при условии существования классов агентов. Очевидно, кто-то должен спроектировать классы агентов и написать их код. Теперь самое время разобраться в том, что должен содержать класс агента.

Базовые компоненты агентов

Агент объявляется с использованием ключевого слова class. Компоненты агента должны состоять из С++-членов данных и функций-членов. Логическая структура класса агента показана на рис. 12.1.

Класс агента (см. рис. 12.1) определяет типичные методы инициализации, чтения и записи, которые должен иметь практически любой объект. В «джентльменский набор» входят конструкторы, деструкторы, операторы присваивания, обработчики исключений и т.д. Атрибуты этого класса включают переменные состояния, определяющие объект. Если же ограничиться перечнем этих атрибутов и методов, мы получим только традиционный объект. Рациональный компонент создают когнитивные структуры данных и методы рассуждений (логического вывода). А ведь именно рациональный компонент трансформирует «обычный» объект в агент.

Рис. 12.1. Логическая структура класса агента

Когнитивные структуры данных

Под структурой данных пони м ается набор правил, при м еняе м ых д ля логической организации данных, а также правила доступа к этой логической организации. Именно метод организации определяет, как данные должны быть концептуально структурированы и какие операции доступа могут быть применены к этой структуре. Если для типов данных вообще и абстрактных типов данных (abstract datatypes — ADT) в частности важно, что хранить, то для структур данных важно, как хранить. Напри м ер, целочисленный тип данных определяет некоторую «сущность», которая характеризуется наличием компонента данных и некоторого количества арифметических операций (например, сложение, вычитание, умножение, деление и т.д.). Этот компонент данных не имеет дробной части и состоит из отрицательных и положительных чисел. Спецификация типа данных ничего не «говорит» о том, как целые числа нужно использовать или как к ним получить доступ. Однако спецификация структуры данных (например, стека) определяет список элементов, сохраняемых по принципу «последним прибыл — первым обслужен» (last-in-first-out— LIFO). Структура данных стека также определяет, что элементы из нее можно извлекать только по одному за раз и причем только из вершины стека. Другими словами, элемент, помещенный в стек последним, должен быть извлечен из него раньше остальных элементов. Это означает, что структура данных стека определяет не только характер организации элементов, но и характер доступа к ним (т.е. как элементы можно помещать в структуру, опрашивать, изменять, удалять и т.п.). Когнитивные структуры данных ограничивают правила организации данных и доступа к ним такими, которые относятся к области логики и эпистемологии. Особенности когнитивных структур данных определяются правилами логического вывода, методами рассуждений (т.е. делукцией, индукцией иабдукцией), понятиями эпистемологических данных, знания, обоснования, убеждений, посылок, высказываний, ошибочных доказательств и заключений. [21]

Тогда как для традиционных структур данных вполне обычными являются, например, алгоритмы сортировки и поиска, то для когнитивных структур данных более приемлемы методы рассуждений. Абстрактные типы данных, используемые вместе с когнитивными структурами данных, часто включают следующие:

вопросы события

факты вре м я

предположения заблуждения

убеждения цель

утверждени я обоснование

заключения

Безусловно, с когнитивными структурами данных можно сочетать и другие типы данных, но приведенные выше являются характеристиками программ, которые используют такие рациональные программные компоненты, как агенты. Эти абстрактные типы обычно реализуются как типы данных, объявленные с помощью ключевых слов struct или class. Напри м ер, так.

struct question{

class justification{

//...

//...

string RequiredInformation;

time EventTime;

target_object QuestionDomain;

bool Observed;

string Tense;

bool Present;

string Mood;

//...

//... };

};

Шаблонные и контейнерные С++-классы можно использовать для организации таких когнитивных структур данных, как знания, например, так.

class preliminary_knowledge{ //.. .

map<question,belief> Opinion;

map<conclusion, justification> SimpleKnowledge;

set<propositions> Argument; //.- .

};

Методы рассуждений

Под методами рассуждений (см. рис. 12.1) пони м ают дедукцию, индукцию и абдукцию. (Краткое описание этих методов приведено в параграфе 12.1.) Несмотря на то что в агентно-ориентированной архитектуре требуется их использование, не существует конкретных ссылок на то, как они реализуются. Делукция, индукция и абдукция относятся к процессам высокого уровня. Подробности реализации этих процессов — личное дело разработчика ПО. Рассуждение — это процесс выведения логического заключения на основании посылок, истинность которых предполагается или точно установлена. Не существует единственно правильного способа реализации процесса рассуждений, ино г да называе м о г о машиной (и л и м еха н из м о м) логического вывода. При этом на практике приме н яется н еско л ько распростра н е н ных способов реализации это г о процесса. Напри м ер, можно испо л ьзовать методы прямого построения цепочки (рассуждений от исходных посылок к целевой гипотезе) или обратного построения цепочки (рассуждений от целевой гипотезы к исходным посылкам). Нашли здесь применение методы анализа целей и средств, а также такие алгоритмы обхода графов, как «поиск вглубь» (Depth First Search — DFS) и «поиск в ширину» (Breadth First Search — BFS). Существует также целал совокупность методов доказательства теорем, которые можно использовать для реализации методов рассуждений и механизмов логического вывода. Здесь важно отметить, что класс агента может иметь один или несколько методов рассуждений. Описание самых основных способов их реализации приведено в табл. 12.3.

  • Читать дальше
  • 1
  • ...
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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