Войти
Образовательный портал. Образование
  • Что показывает коэффициент обеспеченности финансовых обязательств активами Обеспеченность обязательств финансовыми активами в бюджетном учреждении
  • Как приготовить классические вареники с творогом
  • Как сделать тесто для яблочной шарлотки Как приготовить шарлотку с яблоками песочное тесто
  • Отечественной войны 2 степени
  • День полного освобождения Ленинграда от фашистской блокады
  • Манная каша на молоке: пропорции и рецепты приготовления Манная каша 1 порция
  • Виды страховых агентов. Формирование каналов распределения Правоотношения между агентом и принципалом

    Виды страховых агентов. Формирование каналов распределения Правоотношения между агентом и принципалом

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

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

    факты вре м я

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

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

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

    заключения

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

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

    class preliminary_knowledge{ //.. .

    map Opinion;

    map SimpleKnowledge;

    setArgument; //.- .

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

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

    Таблица 12.3. Основные способы реализации методов рассуждений

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

    Прямое построение цепочки Управляемый данными метод, который начинается с анализа имею щ ихся данных или фактов и приходит к определенным выводам

    Анализ целей и средств Использует множество операторов для последовательного решения подзадач до тех пор, пока не будет решена вся задача в целом

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

    P = Если су щ ествует автобусный маршрут из Детройта в Нью-Йорк, Q = Джон поедет в отпуск.

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

    Толедо-Кливленд Детройт-Чикаго Янгстаун-Нью-Йорк

    Кливленд-Колумбус Цинциннати-Детройт Детройт-Толедо

    Колумбус-Нью-Йорк Цинциннати-Янгстаун

    Каждый из этих маршрутов представляет обязательство, взятое на себя компанией ABC Bus Company. Если наш агент получит доступ к расписанию автобусных маршрутов этой компании, то приведенный выше список маршрутов можно будет использовать для представления некоторой части убеждений нашего агента. Возникает вопрос: как перейти от списка маршрутов к убеждениям? Для начала попробуем разработать простую структуру утверждений.

    Затем попытаемся использовать контейнерный класс для представления убеждений нашего агента в отношении автобусных маршрутов.

    set BusTripKnowledge ;

    Если определенный автобусный маршрут содержится в множестве BusTripKnowledge, то наш агент убежден в том, что в указанное время автобус непременно отправится по этому маршруту из пункта отправления в пункт назначения. Итак, мы можем зафиксировать любой маршрут в соответствии с заданной структурой.

    Trip. From. append (" Toledo ") ;
    Trip.To.append(«Cleveland») ;
    BusTripKnowledge. insert(Trip) ;

    Если мы поместим каждый маршрут в множество BusTripKnowledge, то убеждения нашего агента об автобусных перевозках компании ABC Bus Company будут полностью описаны. Обратите внимание на то, что прямого маршрута из Детройта в Нью-Йорк не существует. Но Джон может добраться в Нью-Йорк из Детройта более сложным путем, осуществив следующие переезды автобусом:

    из Детройта в Толедо; из Толедо в Кливленд; из Кливленда в Кол^мбус; из Колумбуса Нью-Йорк.

    Поэтому, несмотря на то, что компания ABC Bus Company не предоставляет прямого маршрута (из пункта А в пункт Б), она позволяет совершить переезд с большим количеством промежуточных остановок. Задача состоит в следую щ ем: как об этом может узнать наш агент? Агент на основе своих знаний об автобусных маршрутах должен обладать некоторым алгоритмом генерирования вывода о том, су щ ествует ли маршрут из Детройта в Нью-Йорк. Мы используем простой цепной метод. Просматриваем элементы множества BusTripKnowledge и находим первый маршрут из Детройта- из Детройта в Чикаго. Опрашиваем атрибут То этого элемента. Если бы он был равен значению «Нью-Йорк», процесс поиска был бы прекращен, поскольку мы нашли нужный маршрут. В противном случае сохраняем найденный (промежуточный) маршрут в стеке. Затем ищем маршрут с атрибутом From, равным «Чикаго». При этом может оказаться, что таких маршрутов не прелусмотрено вообще. Поскольку далее хранить элемент множества, соответствующий маршруту «Детройт-Чикаго», нет никакого смысла, мы удаляем его из стека, сделав пометку, что этот маршрут уже был рассмотрен. Затем повторяем поиск маршрута с отправлением из Детройта. Находим такой маршрут: «Детройт-Толедо». Проверяем, не равен ли его атрибут То значению «Нью-Йорк», и поскольку наши надежды не оправдались, сохраняем этот элемент в стеке. Затем ищем маршрут с атрибутом From, равным «Толедо». Находим маршрут «Толедо-Кливленд» и также помещаем его на хранение в стек. После это г о просматриваем маршруты в надежде найти элемент, у которого атрибут From был бы равен значению «Кливленд». Для каждо го найденного маршрута проверяем значение атрибута То. Если он равен значению " Нью-Йорк» , то промежуточные маршруты, помещенные в стек, представляют в целом маршрут из Детройта в Нью-Йорк, начало которого находится на «дне» стека, а его конечный пункт - в вершине. Если мы пройдем по всему списку маршрутов и не найдем ни одного с атрибутом То, равным значению «Нью-Йорк», или иссякнут возможные варианты проверки атрибута То для верхнего элемента стека, то мы, извлекал верхний элемент из стека, будем искать следующий элемент, значение атрибута From которого совпадает со значением атрибута То элемента, расположенного в вершине стека. Этот процесс повторяется до тех пор, пока стек не опустеет или мы все-таки не най дем нужный маршрут. Для определения, существует ли маршрут из пункта А в пункт Б, используется в данном случае упрощ ен ный метод DFS (Depth First Search - «поиск вглубь»).

    Наш простой агент будет использовать этот DFS-метод для выяснения, существует ли маршрут из Детройта в Нью-Йорк. Выяснив этот факт, агент может обновить свои убеждения насчет Джона. Теперь агент убежден, что Джон поедет в отпуск. Предположим, мы внесли дополнительное прелусловие относительно отпуска Джона.

    Если Джон обслужит 15 или больше новых клиентов, его доходы превысят (>) 150000.

    Если доходы Джона превысят 150000 и существует маршрут из Детройта в Нью-Йорк, то Джон отправится в отпуск.

    Теперь агент должен выяснить, превышают ли доходы Джона лумму 150000 и существует ли маршрут из Детройта в Нью-Йорк. Чтобы выяснить положение дел насчет доходов Джона, агент должен сначала узнать, обслужил ли Джон хотя бы 15 новых клиентов. Предположим, мы уверяем программного агента в том, что Джон обслужил 23 новых клиента. Затем агент должен убедиться в том, что его доходы превышают 150000. На основе содержимо г о множества BusTripKnowledge агент сумел прийти к выволу о существовании маршрута из Детройта в Нью-Йорк. На основании убеждений об автобусных маршрутах и 23 новых клиентах агент использует процесс прямого построения цепочки (т.е. рассуждений от исходных посылок к целевой гипотезе) и приходит к заключению, что Джон таки поедет в отпуск. Формат рассуж-дений этого процесса имеет такой вид.

    А -> В (В и С) -> D А С

    А=ЕслиДжон обслужит не менее 15 новых клиентов, В = Доходы>150000,

    С = Су щ ествует автобусный маршрут из Детройта в Нью-Йорк, D = Джон поедет в отпуск.

    В этом примере агент убеждается, что эле м енты А и С истинны. С использование м правил ведения рассуждений агент заключает, что эле м енты В и D равны значению ИСТИНА. Следовательно, агент делает вывод о том, что Джон поедет в отпуск. Подобный вид обработки имеющихся данных можно было бы применить к агенту в ситуации, когда у директора фирмы в подчинении находятся сотни или даже тысячи служащих, и он хотел бы, чтобы агент регулярно составлял почасовой график работы для своих служащих. Директор намерен затем получать от агента справку о том, кто работал, кто находился в отпуске по болезни, а кто - в очередном отпуске и т.д. Агент должен обладать знаниями и полномочиями устанавливать график работы. Каждую неделю агент должен представлять ряд приемлемых графиков работы, очередных отпусков и сведений о пропусках по болезни. Агент в этом случае для получения результата использует простой метод прямого построения цепочки и метод DFS. Чтобы реализовать этот вид рассуждений, мы использовали такие типы данных, как struct и классы стеков и множеств. Эти классы используются для хранения знаний, предположений иметодов рассуждений. Они позволяют реализовать когнитивные структуры данных (Cognitive Data Structures - CDS). Для поддержки процесса рассуждений, а именно при опросе наших структур данных (стека и множества) мы использовали DFS-методы.

    При сочетании метода прямого построения цепочки и метода DFS создается процесс, в соответствии с которым одно предположение может быть подтверждено на основе уже принятых предыдущих. Это очень важный момент, поскольку наш агент при достижении цели должен знать, что в действительности следует считать корректным. Такой подход также влияет на отношение к вопросам параллельного программирования. Тот факт, что агент рационален и действует в соответствии с правилами построения рассуждений, позволяет разработчику сосредоточиться на корректном моделировании задачи, выполняемой агентом, а не на стремлении явно управлять параллелизмом в программе. Минимальные требования параллелизма, выражаемые тремя «китами» - декомпозицией, взаимодействием и синхронизацией (decomposition, communication, synchronization - DCS), - по большей части относятся к архитектуре агента. Каждый агент для своего поведения имеет логическое обоснование. Это обоснование должно опираться на хорошо определенные и хорошо понимаемые правила ведения рассуждений. Декомпозиция зачастую выражается в простом назначении агенту одного или нескольких основных указаний (директив). Декомпозиция работ в этом случае должна иметь естественный характер и в конце концов выразиться в параллельных или распределенных программах, которые нетрудно поддерживать и развивать. Взаимодействие агентов проще представить, чем взаимодействие анонимных модулей , поскольку границы между агентами более четки и очевидны. Каждый агент имеет цель, которая лежит на поверхности. Знания, или информация, необходимые каждому агенту для достижения его цели, в этом случае легко определяются. Чтобы позволить агентам взаимодействовать, разработчик может использовать простые MPI-функции или средства взаимодействия объектов, которые являются частью любой CORBA-реализации. При обеспечении взаимодействия агентов самыми сложными являются следующие моменты:

    Посредством чего должно происходить взаимодействие;

    Кому нужно взаимодействовать;

    Когда должно происходить взаимодействие;

    Какой формат должно иметь взаимодействие.

    Ответы на эти вопросы должны быть изначально заложены в проект агентов. Теперь осталось лишь определиться с физической реализацией взаимодействия агентов. Для этого можно воспользоваться библиотеками, которые поддерживают параллелизм. Наконец, что касается проблем синхронизации, то с ними можно легко справиться, поскольку именно логическое обоснование агента сообщает ему, когда он может и должен выполнять действия. Следовательно, сложные вопросы синхронизации сводятся к простым вопросам сотрудничества. Благодаря этому упрощается и задача разработчика в целом. Теперь рассмотрим базовую структуру агента и возможности его реализации в С++.

    Реализация агентов в С++

    Рассмотрим упрощенный вариант предыдущего примера агента и продемонстрируем, как его можно реализовать в С++. Цель этого агента - составлять график отпусков и выполнять подготовку к поездкам владельца компании ABC Auto Repair Company. В компании работают десятки служащих, и поэтому у хозяина нет времени заботиться о проведении своего очередного отпуска. Кроме того, если хозяин не получит определенного объема прибыли, об отпуске не может быть и речи. Поэтому владельцу компании хотелось бы, чтобы агент распланировал его отпуска равномерно по всему голу при условии процветания фирмы. По мнению владельца компании, главное, чтобы агент работал автоматически, т.е. после инсталляции на компьютере о нем можно было не беспокоиться. Когда агент определит, что подошло время для отпуска, он должен предъявить план проведения отпуска, забронировать места в отеле и проездные билеты, а затем по электронной почте представить хозяину маршрут. Владелец должен побеспокоиться только о формировании задания для агента. Он должен указать, куда желает отправиться и какой объем прибыли необходимо получить, чтобы запланированная поездка состоялась. Теперь рассмотрим, как можно спроектировать такой агент. Вспомним, что рациональный компонент (см. рис. 12.1) класса агента состоит из когнитивных структур данных и методов рассуждений (стратегий логического вывода). Когнитивные структуры данных (CDS) позволяют хранить убеждения, предположения, знания, заблуждения, факты и пр. Для доступа к этим когнитивным структурам данных в процессе решения проблемы и выполнения задач класс агента использует стратегии логического вывода. Для реализации CDS-структур данных и методов построения рассуждений можно использовать ряд контейнерных классов и алгоритмов, которые содержатся в стандартной библиотеке С++.

    Типы данных предположений и структуры убеждений

    Этот агент обладает убеждениями о показателях авторемонтной мастерской. Убеждения составляют информацию о том, сколько клиентов обслуживается в час, какова загрузка ремонтных секций в день и общий объем продаж (запчастей и услуг) за некоторый период времени. Кроме того, агент знает, что владелец фирмы любит путешествовать только автобусами. Поэтому агент хранит информацию об автобусных маршрутах, которые могут для отпускника оказаться привлекательными. В программе, насыщенной математическими вычислениями, используются в основном целочисленные значения и числа с плавающей точкой. В графических программах участвуют пиксели, линии, цвета, геометрические фигуры и пр. В агентно-ориентированной программе основными типами данных являются предположения, правила, утверждения, литералы и строки. Для построения типов данных, свойственных агентно-ориентированному программированию, мы будем опираться на объектно-ориентированную поддержку, прелусмотренную в С++. Итак, рассмотрим объявление класса предположения (листинг 12.1).

    // Листинг 12.1. Объявление класса предположения
    template class proposition {
    bool TruthValue; public-virtual bool operator()(void) = О;
    bool operator&&(proposition &X);
    bool operator||(proposition &X);
    bool possible(proposition &X);
    bool necessary(proposition &X);

    Предположение представляет собой утверждение, тема (предмет) которого подтверждается или отрицается предикатом. Предположение может принять значение ИСТИНА или ЛОЖЬ. Предположение можно использовать для фиксации одного убеждения, которое есть у агента. Кроме того, в качестве предположения может быть представлена некоторая другая информация, которая предлагается агенту и которую агент необязательно воспринимает как убеждение. Для представления предположений используется когнитивный тип данных, который должен быть таким же функциональным в агентно-ориентированной программе, как целочисленные и вещественные типы данных в математических программах. Поэтому, чтобы обеспечить некоторые основные операторы, применимые к предположениям, мы используем C++-средства перегрузки операторов. В табл. 12.4 показано, как такие операторы преобразуются в логические.

    Класс proposition (см. листинг 12.1) представляет собой упрощенную версию (с сокращённым набором функциональных возможностей). Назначение этого класса- сделать использование типа данных proposition таким же простым и естественным, как использование любого другого С++-типа данных. Обратите внимание на слелующее объявление в классе proposition: virtual bool operator()(void) = 0;

    Таблица 12.4. Преобразование операторов влогические

    Пользовательские C++onepamopы Распространенныелогические операторы

    Это объявление чисто виртуального метода. Если в классе объявлен чисто виртуальный метод, это означает, что данный класс - абстрактный, и из него нельзя создавать объекты, поскольку в нем отсутствует определение этого метода. Метод лишь объявлен, но не определен. Абстрактные классы используются для определения стратегий и являются своего рода проектами производных классов. Производный класс должен определить все виртуальные функции, которые он наслелует от абстрактного класса. В данном случае класс proposition используется для определения минимального набора возможностей, которыми может обладать класс-потомок. Необходимо также отметить еще одну важную особенность класса proposition (см. листинг 12.1): это шаблонный класс. Он содержит такой член данных: list UniverseOfDiscourse;

    Этот член данных предполагается использовать для хранения значения предметной области, к которой относится предположение. В логике область рассуждения содержит все легальные сущности, которые могут рассматриваться при обсуждении. Здесь мы используем контейнер list. Поскольку в общем случае темы обсуждения могут быть самыми разными, мы используем контейнерный класс. Список UniverseOfDiscourse мы объявляем защищенным (protected), а не закрытым (private), чтобы к нему могли получить доступ все потомки класса proposition. Классу proposition также «знакомы» такие понятия модальной логики, как логическая необходимость и вероятность, которые весьма полезны в агентно-ориентированном программировании. Модальнал логика позволяет агенгу различать такие определения, как «вероятно, ИСТИНА» и «несомненно, ИСТИНА». Основные операторы, используемые для выражения логической необходимости и вероятности, перечислены в табл. 12.4. Мы определяем эти методы только в описательных целях; их реализация выходит за рамки рассмотрения в этой книге. Но они являются частью классов предположений, которые мы успешно применяем на практике. Чтобы сделать класс proposition «годным к употреблению», выведем из него новый класс и назовем его trip_announcement. Класс trip_announcement представляет собой утверждение о существовании автобусного маршрута из некоторого исходного пункта (отправления) в пункт назначения. Например, предположим, что существует автобусный маршрут из Детройта в Толедо. Эта информация позволяет сформулировать высказывание, которое может быть либо истинным, либо ложным. Если бы нас интересовало, когда это высказывание истинно или ложно, мы бы воспользовались понятиями временной логики. Временняя логика- это логика времени. Агенты также применяют обоснования, зависящие от времени. Но в данном случае все предположения относятся к текущему времени. Это утверждение декларирует, что в данное вре м я существует автобусный м аршрут из Детройта в Толедо. Агент должен «у м еть» удостовериться в этом и либо «довериться» это м у факту, либо отвергнуть его как ложное высказывание. Теперь м ожно расс м отреть объявление класса trip_armouncement, представленное в листинге 12.2.

    // Листинг 12.2. Объявление класса trip_announcement
    publiс proposition{
    string Origin; string Destination;
    stack Candidates; public:
    bool operator==(const trip_announcement &X) const;
    bool validTrip(list::iterator I,
    stack candidates(void);
    friend bool operator||(bool X,trip_announcement &Y);
    friend bool operator&&(bool X,trip_announcement &Y);

    Обратите вни м ание на то, что класс trip_armouncement наследует класс proposition. Вспо м ните, что класс proposition является шаблонным и требует задания параметра, определяющего тип. Объявление

    class trip_announcement:

    public proposition

    {... } ;

    обеспечивает класс proposition требуе м ы м типо м. Кро м е того, важно от м етить, что класс trip_announcement определяет операторный м етод operator (). Следовательно, наш класс trip_armouncement - конкретный, а не абстрактный. Теперь мы можем объявить и использовать предположение типа trip_announcement непосредственно в программе агента. В классе trip_announcement определены слелую-щие дополнительные члены данных: Origin Destination Candidates

    Эти члены данных используются для указания пунктов отправления и назначения автобусного маршрута. Если автобусный маршрут требует пересадки с одного автобуса надругой и несколько остановок в пути, то член данных Candidates будет содержать полный путь следования. Следовательно, объект класса trip_armouncement представляет собой утверждение об автобусном маршруте и пути следования. В классе trip_armouncement также определены некоторые дополнительные операторы. Эти операторы позволяют уравнять класс trip_announcement «в правах» со встроенны м и типа м и данных языка С++. Помимо убеждений относительно автобусных м аршрутов, агент также обладает убеждения м и, связанны м и с показателя м и успешности функционирования расс м атривае м ой ко м пании. Эти убеждения отличаются по структуре, но в основном содержат высказывания, которые могут быть истинными либо ложными. Итак, мы снова испо л ьзуе м класс proposition в качестве базового. Влистинге 12.3 представлено объявление класса p eformance_statement.

    // Листинг 12.3. Объявление класса performance_statement
    public proposition{
    bool operator==(const performance__statement &X) const;
    friend bool operator||(bool X,performance_statement &Y);
    friend bool operator&&(bool X,performance_statement &Y); //. . .

    Обратите вни м ание на то, что этот класс также обеспечивает шаблонный класс proposition параметром .

    class performance_statement:

    public proposition {...}

    Благодаря это м у объявлению класс proposition теперь определен д ля объектов типа performance_statement. Класс performance_statement используется для представления убеждений об объе м е продаж, количестве обслуженных клиентов (в час) и загрузке ре м онтных секций в день. Для каждого из перечисленных убеждений о том, что агент имеет в соответствующей области, существует отдельное высказывание. Эта инфор м ация хранится в таких членах данных:

    Такие высказывания, как «По секции 1 объе м продаж составил 300тыс. долл., обслужено 10 клиентов в час, а коэффициент загрузки равен 4», м ожно представить с по м о щ ью объекта класса performance_statement. Итак, наш класс агента и м еет две категории убеждений, реализованных в виде данных, тип которых выведен из класса proposition. На рис. 12.2 представлена UML-диагра мм а классов trip_announcement и performance__statement. Эти классы предназначены для хранения структуры убеждений агента.

    Класс агента

    Классы, представленные на рис. 12.2, образуют фундаментдля когнитивных структур данных агента, которые делают агента рациональным. Именно рационализм класса агента отличает его от других типов объектно-ориентированных классов. Рассмотрим объявление класса агента, приведенное в листинге 12.4.

    // Листинг 12.4. Объявление класса agent
    list TripBeliefs;
    listPerformanceBeliefs;
    bool determineVacationAppropriate(void);

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

    li s t TripBeliefs;

    listPerformanceBeliefs;

    Контейнеры типа list - это стандартные С++-списки. Каждый список используется для хранения коллекции текущих убеждений агента. «Мировоззрение» нашего простого агента ограничено знаниями об автобусных маршрутах и характеристиках успешности его владельца. Содержимое этих двух контейнеров представляет полные знания агента и набор его убеждений. Если в этих списках есть утверждения, в которые агент больше не верит, их следует удалить. Если в процессе рассуждений агент обнаруживает новые утверждения, они добавляются в список уже существующих убеждений. Агент имеет постоянный доступ к информации об автобусных маршрутах и эффективности ведения бизнеса его владельца и при необходимости может обновлять свои убеждения. Помимо убеждений, агент имеет цели, которые иногда представляются как желания в модели убеждений, желаний и намерений (Beliefs, Desires, Intentions - BDI). Цели поддерживают основные директивы, выдаваемые агенту клиентом. В нашем случае цели сохраняются в высказываниях, приведенных ниже.

    performance_statement Manager1;

    performance_statement Manager2;

    performance_statement Manager3;

    trip_announcement Trip1;

    trip_announcement Trip2;

    trip_announcement Trip3;

    С л едует иметь в виду, что мы значительно упрощаем представление целей и директив в классе агента. Но все же этого достаточно, чтобы понять, как построены эти структуры. Три Manager -утверждения содержат цели, связанные с эффективностью бизнеса, которые должны быть удовлетворены, прежде чем владелец фирмы сможет хотя бы подумать об отпуске. Три Trip -утверждения содержат автобусные маршруты, по которым владелец фирмы хотел бы прокатиться при условии успешности его бизнеса. Убеждения вместе с директивами образуют базовые когнитивные типы данных, которыми располагает агент. Используемые агентом стратегии логического вывода вместе с этими когнитивными типами данных образуют когнитивную структуру данных агента (Cognitive Data Structure - CDS). На базе CDS формируются рациональный компонент и характерные особенности класса агента. Помимо контейнеров, в которых хранятся убеждения и структуры, которые в свою очередь хранят директивы и цели, большинство классов агентов имеют контейнеры, предназначенные для хранения намерений, обязательств или планов агента. Агент получает директивы от своего клиента, а затем использует свою способность делать выводы и совершать действия, направленные на выполнение этих директив. Результат рассуждений и выполнения агентом действий часто сохраняется в контейнере с его намерениями, обязательствами или планами. Что касается нашего простого агента, то для хранения намерений или планов отдельного контейнера не ему требуется. Однако он должен зафиксировать путь следования (с пересадками и остановками) предполагаемой отпускной поездки на автобусе. Эта информация хранится в контейнере Candidates.

    Намерения или планы должны быть обработаны аналогичным образом. Если агент может выполнить директивы, он распланирует поездку и по электронной почте подробно сообщит об этом своему владельцу. Агент приступает к своим обязанностям в момент создания объекта. Фрагмент конструктора агента представлен в листинге 12.5

    // Листинг 12.5. Конструктор класса agent

    agent: :agent(void) {

    setGoals();

    updateBeliefs () ;

    if(determineVacationAppropriate()){

    displayTravelPlan(); scheduleVacation();

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

    } else {

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

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

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

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

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

    Этот агент обладает способностями рассуждать, реализованными частично классом

    и частично м етодо м . Вспомните, что в классе объявлен метод в виде чисто виртуальной функции. Поэто м у в производно м к л ассе необходи м о реализовать м етод operator (). Мы используем этот оператор, чтобы объект предположения мог самостоятельно определить свою «суть», т. е. понять, истинно данное предположение или ложно. Это означает самодостаточность классов предположений. Именно в самодостаточности и состоит фундаментальный принцип объектно-ориентированного программирования: класс представляет собой самостоятельную конструкцию, инкапсулирующую его характеристики и поведение. Итак, одной из основных линий поведения класса предположений и его потомков является способность определять, истинно данное предположение или нет. Для реализации этого средства используется перегрузка операторов и объекты-функции. Рассмотри м фрагменты определения класса и определений его потомков.
    //Листинг 12.6. Фрагменты определений класса
    // proposition и его потомков
    template bool proposition::operator&&(
    template bool proposition::operator||(
    template proposition::operator void*(void) {
    bool trip__announcement::operator()(void) {
    list::iterator I; if(directTrip()){

    Операторы "||" и "&&", используемые в классах предположений, позволяют определить, истинно данное предположение или ложно. В каждом из этих определений операторов в конечном счете вызывается метод

    , определенный в классе-потомке. Обратите внимание на определение оператора "||" (см. листинг 12.6). Этот оператор определен следующим образом.
    template bool proposition::operator||

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

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

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

    bool trip_announcement::operator()(void) {
    list::iterator I;
    I = UniverseOfDiscourse.begin();

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

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

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

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

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

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

    I = UniverseOfDiscourse.begin();

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

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

    , чтобы узнать, существует ли обходной путь, использует технологию поиска вглубь (Depth First Search- DFS). Определения методов и приведены в листинге 12.7.
    // Листинг 12.7. Определения методов validTrip() и // directTrip()
    bool trip_announcement::validTrip(list::iterator I, string TempOrigin)
    if(I == UniverseOfDiscourse.end()){ if(Candidates.empty()){ TruthValue = false; return(false);
    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;
    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);
    return(validTrip(I,TempOrigin));
    bool trip_announcement: :directTrip(void) {
    list::iterator I; I = find(UniverseOfDiscourse.begin(),
    UniverseOfDiscourse.end(), *this); if(I == UniverseOfDiscourse.end()){
    TruthValue = true; return(true);

    В обоих методах

    и используется алгоритм find() из стандартной библиотеки С++. UniverseOfDiscourse - это контейнер, который содержит убеждения агента и подготовленные для него утверждения. Вспомните, что одним из первых действий, предпринимаемых агентом, является вызов метода updateBeliefs(), который заполняет контейнер UniverseOfDiscourse. Определение метода updateBeliefs () приведено в листинге 12.8.
    // Листинг 12.8. Обновление убеждений
    void agent::updateBeliefs(void) {
    PerformanceBeliefs.push_back(TempP);
    Temp.destination(«Windsor»);

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

    // Листинг 12.9. Метод установки целей агента
    Tripl.destination(«Chicago»);
    Trip3.destination(«Windsor»);

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

    determineVacationAppropriate()

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

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

    // Листинг 12.10. Второй метод рассуждений
    bool agent::determineVacationAppropriate(void) {
    Managerl.universe(PerformanceBeliefs);
    Manager2.universe(PerformanceBeliefs);
    Manager3.universe(PerformanceBeliefs);
    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_announcement Hperformance_statement наследуют довольно много функций класса proposition. В листингах 12.6 и 12.7 было показано, как определяется оператор operator() для класса trip_announcement, а в листинге12.11 приведено определение оператора operator () для класса performance_statement.

    // Листинг 12.11. Класс performance_statement
    bool performance_statement::operator()(void) {
    list::iterator I;
    I = UniverseOfDiscourse.begin();
    while(I != UniverseOfDiscourse.end() && !Satisfactory) {
    if(((*I).bays() >= Bays) || ((*I).sales() >= Sales)
    || ((*I).perHour() >=PerHour)){ Satisfactory = true;

    Оператор operator () для каждого класса proposition играет «свою» роль в способности класса агента делать логические выводы. В листинге 12.6 показано, как вызывается оператор operator () при каждом вычислении оператора " || " или "&&" для класса proposition или для одного из его потомков. Именно такое сочетание методов operator (), определенных в proposition-классах, и методов класса agent образует стратегии логического вывода для класса agent. В дополнение к операторам "||" и "&&", определенным в классе proposition, классы trip_announcement и performance_statement содержат свои определения.

    friend bool operator||(bool X,trip_announcement &Y); friend bool operator&&(bool X,trip_announcement &Y);

    Эти friend -объявления позволяют использовать предположения в более длинных выражениях. Сделаем следующие объявления.

    trip_announcement А, В, С; bool X;

    При этом объекты А и В будут объединены с помощью операции ИЛИ, а результат этой операции будет иметь тип bool. Затем мы попробуем с помощью той же операции ИЛИ получить значение типа bool и объект типа trip_announcement: bool || trip_announcement

    Без приведенных выше friend -объявлений такая операция была бы недопустимой. Определение этих функций-«друзей» показано влистинге 12.12.

    // Листинг 12.12. Перегрузка операторов "||" и "&&"
    bool operator||(bool X,trip_announcement &Y) {
    bool operator&&(bool X,trip_announcement &Y) {

    Обратите внимание на то, что в определении этих функций-«друзей» (благодаря ссылке на элемент Y ()) также используется вызов функции operator (). Эти функции определяются и в классе performance_statement. Наша задача - сделать использование proposition-классов таким же простым, как использование встроенных типов данных. В классе proposition также определен другой оператор, который позволяет использовать предположение естественным образом. Рассмотрим следующий код.

    //... Некоторые действия.

    Как в этом случае компилятор тестирует объект А? При выполнении инструкции if () компилятор стремится найти в скобках значение целочисленного типа данных или типа bool. Но тип объекта А совсем другой. Мы хотим, чтобы ко м пилятор восприни м ал объект А как высказывание, которое м ожет быть либо истинны м, либо ложны м. При таких обстоятельствах функция operator () не вызывается. Поэто м у для получения нужного эффекта м ы определяем оператор void*. Эту функцию-оператор можно определить следующим образом.

    template proposition::operator void*(void) {

    Это определение позволяет предположение любого типа, представленное «в единственном числе», протестировать как значение истинности. Например, когда наш класс agent собирается отправить по электронной почте владельцу фирмы сообщение, содержащее путь следования, агенту нужно определить, какой маршрут отвечает заданным требованиям. В листинге 12.13 представлен еще один фрагмент из методов обработки автобусных маршрутов.

    // Листинг 12.13. Метод displayTravelPlan()
    void agent::displayTravelPlan(void) {
    stack Route;
    cout << Route.top().origin() << " TO "« Route.top().destination() « endl; Route.pop();

    Обратите внимание на то, что объекты Tripl, Trip2 и Trip3 тестируются так, как будто они имеют тип bool. Метод candidates () просто возвращает путь следования, соответствующий заданному маршруту. Таким образом, разработка стратегий логического вывода и когнитивных структур данных становится проще благодаря использованию перегрузки операторов и С++-шаблонов. Именно стратегии логического вывода и когнитивные структуры данных делают объект рациональным. C++-программист для разработки агентов использует конструкцию класса, а для реализации когнитивных сгруктур данных (CDS) - контейнерные объекты в сочетании со встроенными алгоритмами. Класс, который содержит CDS-структуры, становится рациональным, а рациональный класс - агентом.

    Простая автономность

    Поскольку наш простой класс агента не требует выполнения традиционного «цикла активизации», нам нужны другие средства, которые бы периодически активизировали агент без вмешательства человека. Возможны ситуации, когда агент нужно запускать на выполнение лишь иногда или только при определенных условиях. Среды UNIX/Linux оснащены утилитой crontab, которая представляет собой пользовательский интерфейс «хрон-систе м ы» (xpon- это де м он ОС UNIX, исполняющий предписанные команды в соответствии со строго определенными значениями даты и времени, указанными в спе циально м файле с именем crontab). Утилита crontab позволяет организовать периодическое выполнение одной или нескольких программ. Задания для утилиты crontab можно назначать с указанием месяца, дня недели, дня (месяца), часов и минут. Для использования утилиты crontab в нашем случае необходимо создать текстовый файл, который будет содержать график активизации агента. Записи этого файла должны иметь следующий формат:

    м инуты часы день м есяц день недели ко м анда

    Каждый эле м ент записи м ожет прини м ать следую щ ие значения:

    минуты 0-59

    день недели 1-7 (1 - понедельник, 7 - воскресенье)

    команда может быть любой UNIX/Linux-командой, а также именем файла,

    который содержит агенты

    Созданный в таком формате текстовый файл передается «хрон-системе» с помощью слелующей команды:

    $crontab NameOfCronFile

    Например, предположи м, у нас есть файл activate.agent, содержи м ое которо г о и м еет такой вид.

    15 8 * * * agentl

    0 21 * * 6 agent2

    * * 1 12 * agent3

    После выпол н ения crontab-ко м анды $crontab activate.agent

    агент agentl будет активизироваться каждый день в 8:15, агент agent2 - каждое воскресенье в 21:00, а агент agent3- каждый раз при наступлении первого декабря. Хрон-файлы можно при необходимости добавлять или удалять. Хрон-файлы могут содержать ссылки на другие хрон-задания, позволяя таким образом агенту «самому» перепланировать свою работу. Так, для обеспечения чрезвычайно гибкой, динамичной и надежной процедуры активизации агентов можно использовать сценарии оболочки в сочетании с утилитой crontab. Чтобы получить полное описание утилиты crontab, обратитесь к оперативным страницам руководства (manpages- г ипертекстовые страницы консультативной инфор м ации, поясняю щ ие действие конкретных ко м анд): $man crontab или $man at

    Средства crontab и at представляют собой простейший способ автоматизации или регулярного запуска агентов, который не требует постоянного выполнения циклов активизации. Эти утилиты надежны и гибки. Однако для реализации автоматической активизации агента также можно использовать хранилище, или репозиторий, реализаций и брокер объектных запросов (object request brokers - ORB), который мы рассматривали в главе 8. Стандартные CORBA-реализации также предоставляют средства организации событийных циклов.

    12.5. Мультиагентные системы

    Мультиагентные системы- это системы, в которых задействовано несколько агентов, обладающих способностью в процессе решения некоторой задачи взаимодействовать, сотрудничать, «договариваться» или соперничать. У С++-разработчика программного обеспечения есть несколько вариантов для реализации мультиагентных систем. Агенты можно реализовать в отдельных потоках выполнения с помощью API-интерфейса POSIX thread. В этом случае одна программа разбивается на несколько потоков, каждый из которых содержит один или несколько агентов. Следовательно, агенты одного потока будут разделять одно и то же адресное пространство. Это позволяет агентам легко взаимодействовать путем использования глобальных переменных и простой передачи параметров. Если компьютер, на котором выполняется программа, содержит несколько процессоров, то агенты могут выполняться параллельно. В этом случае каждый агент должен быть оснащен объектами синхронизации (см. главы 5 и 11) и компонентами обработки исключительных ситуаций (см. главу7). Мультиагентные системы, реализованные посредством многопоточности, представляют самое простое решение, но тем не менее ограничивающее агентов рамками одного компьютера. Более гибкий подход к созданию мультиагентных систем предоставляет CORBA-реализация. Стандарт CORBA (помимо ядра спецификации CORBA) содержит спецификацию мультиагентного средства (multi-agent facility- MAF). MICO-реализацию, которую мы используем в CORBA-примерах этой книги, можно применять для реализации агентов, которые способны взаимодействовать через сети Internet, intranet и локальные сети. С++-привязка CORBA-стандарта имеет полную поддержку объектно-ориентированного представления и, следовательно, поддержку агентно-ориентированного программирования. В главе 13 мы рассмотрим, как можно использовать библиотеки PVM и MPI для поддержки агентов в контексте параллельного и распределенного программирования.

    12.6. Резюме

    Агенты - это рациональные объекты. Агентно-ориентированное программирование - это свежий взгляд на старые проблемы декомпозиции, взаимодействия и синхронизации, которые являются обязательной частью каждого проекта параллельного или распределенного программирования. С++-поддержка перегрузки операторов контейнеров и шаблонов обеспечивает эффективные средства реализации широкого диапазона классов агентов. Будущие системы с массовым параллелизмом и большие распределенные системы будут опираться на агентно-ориентированные реализации поскольку практически не существует других путей построения таких систем. Несмотря на «вводный» характер примеров создания агентов, представленных в этой главе, они вполне обеспечивают основу для понимания практических принципов построения агентных систем. Для развертывания мультиагентных систем можно использовать об щ е д оступные и популярные библиотеки POSIX thread API, MICO, PVM и MPI. Мультиагентные системы можно использовать д ля реализации решений, которые требуют параллельного или распределенного программирования. В этой книге представлены два основных варианта архитектуры для параллельного и распределенного программирования: первый представляют агенты, а второй - «классные доски» (которые предполагают использование агентов). О том, как использовать «классные доски» для реализации решений параллельного и распределенного программирования, мы поговорим в следующей главе.

    Примечания:

    POSIX- Portable Operating System Interface for computer environments- интерфейс переносимой операционной системы (набор стандартов IEEE, описывающих интерфейсы ОС для UNIX).

    IEEE- профессиональное объединение, выпускающие свои собственные стандарты; членами IEEE являются ANSI и ISO.

    При использовании термина объект в определении агента мы включаем родственные для него понятия из области искусственного интеллекта: исполнитель и фрейм .

    Мы намеренно избегаем термина интеллектуальный . В настоящее время неизвестно, будем ли мы когда-либо создавать интеллектуальное программное обеспечение Но бесспорно то, что мы можем создавать рациональное ПО на основе хорошо понимаемого логического формализма.

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

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

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

    всеобщий, или универсальный, агент, который имеет неограниченные полномочия принципала заключать контракты и совершать любые коммерческие сделки;

    Генеральный агент , назначенный судовладельцем в какой-либо стране или географическом районе, координирует и контролирует деятельность других агентов в этой стране или регионе, которые по отношению к нему выступают как субагенты. На него возлагается также контроль за распределением тоннажа, обработкой и загрузкой флота, проверка дисбурсментских счетов и их оплаты и т. д.;

    специальный агент (инлэнд-агент, сэйлз-агент, агент-экспедитор, агент по страхованию) представляет своего принципала только при совершении каких-либо определенных сделок.

    Различие между генеральным и специальным агентом состоит в широте их полномочий.

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

    По назначению агенты подразделяются:

    агенты, назначенные судовладельцем, которые от его имени и по его поручению выполняют агентские функции в отношении судна, а также контролируют выполнение отправителями и получателями грузов их обязательств в отношении груза и судна в соответствии с условиями договора перевозки, коммерческими правилами и практикой морских торговых портов;

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

    По форме собственности, как уже отмечалось, агентские компании могут относиться к государственному или частному сектору.

    По участию в капитале агентские компании могут быть:

    имущественно независимыми от судовладельцев и фрахтователей;

    имущественно частично связанными с фрахтователями или имущественно полностью принадлежащими судовладельцам или фрахтователям.

    Характер агентских отношений

    АГЕНТСКОЕ ДОГОВОР

    СОГЛАШЕНИЕ

    ДОГОВОР, ЗАКЛЮЧАЕМЫЙ АГЕНТОМ,

    ГДЕ СТОРОНОЙ ДОГОВОРА

    СТАНОВИТСЯ ПРИНЦИПАЛ

    4.2. Правоотношения между агентом и принципалом

    Основным документом, регулирующим правоотношения между агентом и принципалом, является агентское соглашение. Как уже отмечалось, одна из стандартных форм агентского соглашения разработана ФОНАСБА. Имеются также и другие формы стандартных соглашений, в том числе для линейных и трамповых агентов, разработанные Международной ассоциацией судовладельцев (ИНСА).

    Согласно агентского соглашения, агент должен:

    принимать все возможные меры для быстрейшей обработки судов и своевременного оформления необходимых.грузовых документов;

    нанимать стивидоров, когда погрузка-выгрузка является обязанностью судовладельца;

    инкассировать фрахтовые и другие платежи и переводить их судовладельцам в максимально короткий срок;

    выполнять все формальности, связанные с заходом и выходом судна из порта;

    оплачивать дисбурсментские расходы судна за счет судовладельцев;

    принимать в интересах судовладельцев меры к урегулированию претензий;

    составлять таймшиты, обеспечивая их подписание представителями отправителей или получателей грузов;

    оказывать судну (в соответствии с инструкциями судовладельца, выдаваемыми в каждом конкретном случае, или просьбой капитана) следующие услуги: организовать снабжение бункером, техническими материалами, провизией, а при необходимости медицинское обслуживание членов эки­пажа; обеспечить предоставление тальманов и лебедчиков;

    организовать сверхурочные работы стивидоров и работу в воскресные и праздничные дни, а также ремонт судна, информируя судовладельца или его представителя о стоимости этих работ; помочь капитану во время приемки судна в тайм-чартер и обратной сдачи его судовладельцу;

    использовать по указанию судовладельца залоговое право для обеспечения причитающихся ему платежей;

    выполнять другие поручения, связанные с обеспечением интересов судна и его обслуживанием.

    Юридическим основанием для агентирования являются соглашение, доверенность или закон. Если судно направляется в порт, где у судовладельца нет агента, доказательством наличия соглашения на агентирование может быть любое письменное (включая телеграфное или телексное) поручение принципала агенту.

    Как правило, агентский договор (соглашение) оформляется в письменной форме, причем стороны, заключающие соглашение, чаще всего используют ту или иную стандартную проформу агентского соглашения.

    Действие агентского договора прекращается по истечении срока полномочий, выданных агенту для проведения определенных операций (например, в случае закрытия регулярной линии, которую он обслуживал) или на определенное время (например, на период сезонной перевозки грузов), в случае нарушения агентом условия о «предмете» договора и, наконец, в соответствии с нотисом о расторжении договора.

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

    Обычно агентские договоры заключаются на неопределенный период с правом любой из заключивших соглашение сторон по соответствующему уведомлению (нотису) канцелировать его, т. е. прекратить его действие. Срок нотиса обычно оговаривается в соглашении. В подавляющем.большинстве случаев инициатором расторжения агентского соглашения является принципал, поэтому он заинтересован в установлении минимального срока нотиса, в отличие от агента, который заинтересован в обратном. Как правило, устанавливается двух- или трехмесячный срок, однако с появлением специализированных судов и контейнерных линий наметилась тенденция к увеличению продолжительности нотиса, так как в случае прекращения работы контейнерной линии или передачи агентирования другому агенту необходимо выполнить большой объем работ по инвентаризации и сдаче контейнерного парка, зачастую разбросанного по всей стране.

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

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

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

    Действуя по поручению принципала, портовый морской агент заключает договоры с различными фирмами и компаниями для обеспечения погрузочно-разгрузочных работ, буксировки, лоцманской проводки, транспортировки и хранения контейнеров, аренды различного оборудования, обеспечения судна бункером, водой, продовольствием и т. д. В результате между фирмами и судовладельцем возникают правоотношения, основанные на договорах купли-продажи, найма, хранения, аренды, комиссии и др.

    Судовладелец имеет право сам заключать подобные договоры и соглашения непосредственно с этими фирмами, а затем передавать их на исполнение агенту.

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

    Значительно расширились полномочия агентских фирм, например, при перевозке грузов по схеме «от двери до двери», заключении лизинговых контрактов по поручению судовладельца (обычно это контракты на краткосрочную аренду), страховании грузов, взимании различных штрафов за задержку или повреждение контейнеров, лихтеров, шасси, организации ремонта контейнеров и другого оборудования.

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

    В агентском договоре обычно содержатся условия о порядке расчетов с принципалом, регламентируются сроки представления дисбурсментских счетов и их оплаты, а также сроки инкассации и перевода агентом фрахта и других видов выручки принципалу. Многие агентские соглашения содержат условия о том, что все скидки с контрактных сумм, получаемые агентом, должны переводиться принципалу. Расходование агентом денежных сумм, принадлежащих судовладельцу, допускается только с разрешения последнего.

    В агентском соглашении фиксируется размер вознаграждения, выплачиваемого агенту за выполненные услуги. Наиболее распространенными являются два вида вознаграждения: агентская комиссия, выплачиваемая по тарифным ставкам в зависимости от размера судна (БРТ);

    брокерская комиссия (букинг-комишн), выплачиваемая агенту за привлечение грузов в размере определенного процента от суммы брутто-фрахта. Кроме этих, агент имеет и другие доходы, основным из которых является комиссия за выполнение экспедиторских функций.

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

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

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

    Посредническая фирма — это лицо или фирма, стоящая между производителем и потребителем товара и содействующая его .

    Посредник существует там, где есть цивилизованные рыночные отношения. Выявляя проблемы и помогая их решению, посредник выступает своеобразным катализатором .

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

    Классификация торгово-посреднических фирм

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

    Классифицировать посреднические фирмы можно по различным признакам.

    По главный признак — это выполняемые функции. По этому признаку выделяются:

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

    Виды посредников

    По признаку подчиненности и характеру совершаемых операций посредников можно разделить на три вида:

    • независимых;
    • формально независимых;
    • зависимых (связанных с производством).

    Независимые посредники

    Независимые посредники (как юридические, так и физические лица) действуют от своего имени и за свой счет. По отношению к производителю они выступают как покупатели, приобретающие товары на основе договора купли-продажи. Они становятся собственниками товара и могут реализовывать его на любом рынке и по любой цене.

    Различают:

    • оптовиков с полным циклом обслуживания, которые предоставляют услуги по хранению товарных запасов, по кредитованию, по доставке товаров, по оказанию содействия по управлению. Они могут проводить операции с различным ассортиментом;
    • оптовиков с ограниченным циклом обслуживания, которые предоставляют покупателям значительно меньше услуг. Они могут торговать за наличный расчет, без доставки товаров, с обычно более ограниченным ассортиментом.

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

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

    Дистрибьюторы (англ. — распределение) — физическое или юридическое лицо, обслуживающие разные отрасли промышленности, имеющие склады и транспортные средства и осуществляющие коммерческую деятельность от своего имени и за свой счет. Чаще всего занимаются сбытом продукции промышленного назначения или реализуют импортируемый товар на территории страны.

    Дистрибьютор, который приобретает товар, складирует, хранит, подготавливает к конечному потреблению, составляет группу дистрибьюторов «с полным набором услуг» (или регулярного типа ).

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

    Другая группа дистрибьюторов — «нерегулярного типа » (с неполным, ограниченным набором услуг) только приобретает товары от постоянных производителей и реализует их. Это более многочисленная группа. Они занимаются реализацией скоропортящихся сельскохозяйственных продуктов или небольших промышленных партий разнообразною ассортимента по принципу «купил — забирай» («кэш энд керри»), т.е. без услуг.

    Джобберы — дилеры, которые на свой страх и риск самостоятельно покупают и продают товары (малыми партиями).

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

    Формально независимые посредники

    Формально независимые посредники появились в связи со стремлением производителей включить эти предприятия в свой производственно-сбытовой цикл через систему договоров. Для этого используют следующие виды договоров:

    • договор-поручение, который заключается с поверенными или с торговыми агентами;
    • договор комиссии, который определяет полномочия комиссионеров (находят партнеров, подписывают с ними договоры от своего имени, но за счет продавца или покупателя);
    • договор простого посредничества.

    Зависимые посредники

    Зависимые посредники являются полномочными агентами по сбыту (как бы отделом сбыта производителя) и работают на основе срочных и бессрочных трудовых соглашений. Зависимые посредники не претендуют на на товары, работая за комиссионное вознаграждение.

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

    Их задача — найти покупателя для продукции изготовителя (продавца) и продавца для покупателя и содействовать подписанию контракта между ними.

    Закупочные конторы — самостоятельные коммерческие предприятия. Оплата их услуг производится из расчета определенного процента от годовых продаж.

    Закупочные конторы по характеру деятельности близки к брокерам (предоставляют своим клиентам информацию о движении цен, сведения о потенциальных партнерах, заключают по указанию своих клиентов сделки).

    Рис. 12.2. Виды зависимых посредников

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

    Сбытовые агенты — предприятия и отдельные лица, выполняющие по договору с производителем весь комплекс функций по распределению всей номенклатуры производимой продукции.

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

    Группы торговых агентов:

    • представители производителей — физические или юридические лица, с которыми производитель заключает договор, где определяются ценовая политика закупки и реализации товара, территория, границы деятельности агента, процедура предоставления заказов, система сервисного обслуживания, размеры комиссионных ставок;
    • дистрибьюторы;
    • агенты по закупкам — представители покупателей, которые берут на себя ответственность за сохранность, количество, качество и поступающего товара. Они действуют от имени покупателя и выполняют его условия закупки товаров. За свою работу получают вознаграждение в процентах от объема закупленного и доставленного товара.

    Комиссионеры-посредники действуют на основе договора комиссии, заключаемого с товаровладельцем или покупателем.

    Владельцы товара по данному виду операции называются комитентом. Он поручает комиссионеру совершать сделки от своего имени и за счет комитента, несущего весь коммерческий риск.

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

    Консигнатор — оптовый торговец (предприятия или отдельные лица), который получает от поручителя товар на свой склад и продает его от своего имени, но за счет поставщика-производителя к определенному сроку. Он предлагает товары непищевого назначения, сам назначает цену. Высылает в магазин фургон, и представитель оборудует в торговом зале выкладку товаров.

    Деятельность основана на консигнационном соглашении. Консигнационное соглашение — особый вид договора комиссии.

    Консигнаторы выступают в основном во внешнеторговых сделках. Консигнатор осуществляет платежи консигнанту по мерс реализации товара. Непроданные к установленному сроку товары могут быть возвращены консигнанту.

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

    Существуют так называемые неофициальные посредники - как правило, это физические лица, имеющие личные связи в разных сферах, действующие от своего имени. Опираются они на свою репутацию, знания, опыт и личные взаимоотношения. Материальных обязательств, как правило, не несут, но получают определенное вознаграждение за свои услуги, а юридическими договорами и обязательствами не связаны.

    В последние годы, особенно в странах Запада, появилась категория «виртуальных» посредников , которые используют для своей деятельности Интернет. Продавец или покупатель размещает в Интернете свои сайты, где указывает род своей деятельности, предлагаемые товары или услуги.

    Факторы, влияющие на выбор посредника

    Существует множество факторов, влияющих на выбор посредника. К ним относятся:

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

    Таблица 6.1

    Дилеры – это оптовые (реже розничные) посредники, которые ведут операции от своего имени и за свой счет . Товар приобретается ими по договору поставки. Таким образом, дилер становится собственником продукции после полной оплаты поставки. Отношения между производителем и дилером прекращаются после выполнения всех условий по договору поставки. В логистической цепи дилеры занимают положение, наиболее близкое к конечным потребителям.

    Дистрибьюторы – оптовые и розничные посредники, ведущие операции от имени производителя и за свой счет . Как правило, производитель предоставляет дистрибьютору право торговать своей продукцией на определенной территории и в течение определенного срока. Таким образом, дистрибьютор не является собственником продукции. По договору им приобретается право продажи продукции. Дистрибьютор может действовать и от своего имени. В этом случае в рамках договора на предоставление права продажи заключается договор поставки. В логистической цепи дистрибьюторы обычно занимают положение между производителем и дилерами (рис.6.6).

    Комиссионеры – это оптовые и розничные посредники, ведущие операции от своего имени и за счет производителя . Комиссионер не является собственником продаваемой продукции . Производитель (или комитент в данной операции) остается собственником продукции до ее передачи и оплаты конечным потребителем. Договор о поставке продукции заключается от имени комиссионера. Таким образом, комиссионер является посредником только для комитента, а не для конечного потребителя, деньги которого перечисляются на счет комиссионера. При этом риск случайной порчи и гибели продукции лежит на комитенте. Комиссионер обязан обеспечить сохранность товара. Он отвечает за утрату или повреждение продукции по его вине. Вознаграждение комиссионеру выплачивается обычно в виде процентов от суммы проведенной операции или как разница между ценой, назначенной комитентом, и ценой реализации.

    Рис.6.6. Пример организации канала распределения

    Агенты – посредники, выступающие в качестве представителя или помощника другого, основного по отношению к нему лица (принципала ). Как правило, агенты являются юридическими лицами. Агент заключает сделки от имени и за счет принципала . По объему полномочий агенты подразделяются на две категории. Универсальные агенты совершают любые юридические действия от имени принципала. Генеральные агенты заключают только сделки, указанные в доверенности. За свои услуги агенты получают вознаграждение как по тарифам, так и по договоренности с принципалом. Наиболее распространенный вид агентского вознаграждения – процент от суммы заключенной сделки.

    Брокеры – посредники при заключении сделок, сводящие контрагентов. Брокеры не являются собственниками продукции , как дилеры или дистрибьюторы, и не распоряжаются продукцией, как дистрибьюторы, комиссионеры или агенты. В отличие от агентов брокеры не состоят в договорных отношениях ни с одной из сторон заключающейся сделки и действуют лишь на основе отдельных поручений. Брокеры вознаграждаются только за проданную продукцию. Их доходы могут формироваться как определенный процент от стоимости проданных товаров или как фиксированное вознаграждение за каждую проданную единицу товара.

    После выбора типов посредников в канале распределения необходимо определиться с количеством этих посредников. В маркетинге разработаны три подхода к решению этой проблемы:

    1) интенсивное распределение;

    2) эксклюзивное распределение;

    3) селективное распределение.

    Интенсивное распределение предполагает обеспечение запасами продукции в возможно большем числе торговых предприятий.

    Эксклюзивное распределение предполагает намеренно ограниченное число посредников, торгующих данной продукцией в рамках сбытовых территорий.

    Селективное распределение представляет собой нечто среднее между методами интенсивного и эксклюзивного распределения. Селективное распределение позволяет производителю добиваться необходимого охвата рынка при более жестком контроле и с меньшими издержками, чем при организации интенсивного распределения. Для повышения эффективности сбыта продукции и в целях экономии средств организации часто прибегают к использованию многоканальных систем распределения продукции.

    Каждый производитель на основе маркетинговых исследований рынков сбыта своей продукции определяет структуру возможных каналов распределения, их связь с конкретными категориями потребителей и друг с другом (рис.6.7). Формы доведения товара до потребителя определяются прежде всего характером самого товара, местом и условиями его производства, потребления и возможностями транспорта.



    Пример анализа возможных вариантов выбора канала распределения

    Рассмотрим пример анализа возможных вариантов выбора канала распределения (рис.6.8). Два производства выпускают одинаковые товары А и В, т.е. каждый из распределительных центров (РЦ) может выбирать поставщика с более выгодными для себя условиями поставки. В свою очередь и производство может выбирать различные каналы распределения. Например, из производства А товар может попасть к конечному потребителю по одному из следующих маршрутов: 8; 1–6; 1–7–5; 2–5. Если производство А выйдет на рынок самостоятельно и свяжется с конечным потребителем (путь 8), то первоначальная стоимость товара возрастет лишь на сумму расходов, связанных с доставкой (т.к. посредники будут исключены из цепи).

    Рис.6.8. Структурная схема каналов распределения товаров народного потребления

    Но этот вариант не выгоден потребителю, т.к. ему придется покупать у одного поставщика большое количество одинакового товара, что скорее всего будет для него неприемлемо.

    Второй путь 1–6 неудобен по той же причине, т.к. РЦ №1 расположен в месте производства и, как правило, закупает и продает также большие партии однородного товара. Т.е. эта категория посредников не формирует большого ассортимента.

    Широкий торговый ассортимент формирует оптовик (РЦ№2), расположенный в месте сосредоточения потребления. Поэтому этот посредник специализируется на оказании максимального сервиса конечному потребителю. Т.е. наибольший сервис потребителю могут обеспечить пути 1–7–5 и 2–5. Из этих двух вариантов производителю более удобен путь 1–7–5, но для покупателя он приведет к наиболее высокой стоимости товара, вследствие использования двух посредников.

    Можно предложить немало различных оснований для построения классификаций агентов. Наиболее очевидными являются критерии классификации, связанные с полярными шкалами «естественное – искусственное» и «материальное – виртуальное». По первому критерию, выделяются:

    • натуральные агенты – животное, человек, стада животных, коллективы людей;
    • искусственные агенты – роботы, коллективы автоматов, сложные компьютерные программы.

    Согласно второму критерию, все искусственные агенты подразделяются на:

    • материальных , физически существующих и работающих в реальном пространстве, например, интегральные роботы, наделенные различными средствами «очувствления», манипуляторами или педипуляторами;
    • виртуальных , существующих лишь в некоторой программной среде (виртуальном пространстве), которых нередко можно представить как роботов, занятых не физической, а информационной работой; такие «программные роботы» (software robots) называют сокращенно софтботами (softbots).

    Еще одна пара взаимосвязанных критериев классификации опирается на дихотомии «сосредоточенное – распределенное» и «неподвижное – подвижное». Примером неподвижного агента служит промышленный манипуляционный робот, а примером мобильного – программный поисковый агент, мигрирующий по компьютерной сети в целях отыскания нужной информации. Подчас мобильные программные роботы трактуются как распределенные, чисто коммуникативные агенты, которые не имеют собственных средств восприятия и осуществления действий (поэтому они не манипулируют никакими объектами), а лишь используют располагаемые ресурсы для коммуникации с другими агентами и миграции по сети в поисках релевантных данных и процедур. Наоборот, точно локализованные агенты в некотором смысле противоположны коммуникативным: они не могут двигаться по сети и обычно не обладают способностью к представлению среды, а их общение с другими агентами происходит не напрямую, а косвенно, через механизмы восприятия и действия.

    Важным основанием для классификации служит наличие (отсутствие) у агентов характеристик обучаемости или адаптивности. У обучаемых агентов поведение основано на предыдущем опыте.

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

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

    По первому признаку, выделяются интеллектуальные (когнитивные, рассуждающие, коммуникативные, ресурсные) и реактивные агенты. Интеллектуальные агенты обладают хорошо развитой и пополняемой символьной моделью внешнего мира, что достигается благодаря наличию у них базы знаний, механизмов решения и анализа действий. Близкий термин «рассуждающий» зарезервирован для обозначения агента, который на основе символьной модели внешней среды способен проводить собственные рассуждения, например, используя метод сравнения по образцу, и на их основе принимать самостоятельные решения или выполнять действия, изменяющие среду.

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

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

    В то же время реактивные агенты не имеют ни сколько-нибудь развитого представления внешней среды, ни механизма многошаговых рассуждений, ни достаточного количества собственных ресурсов. Отсюда вытекает еще одно существенное различие между интеллектуальными и реактивными агентами, связанное с возможностями прогнозирования изменений внешней среды и, как следствие, своего будущего. В силу вышеуказанных недостатков реактивные агенты обладают очень ограниченным диапазоном предвидения. Они практически не способны планировать свои действия, поскольку реактивность в чистом виде означает такую структуру обратной связи, которая не содержит механизмов прогноза. Тогда как интеллектуальные агенты, благодаря богатым внутренним представлениям внешней среды и возможностям рассуждений, могут запоминать и анализировать различные ситуации, предвидеть возможные реакции на свои действия, делать из этого выводы, полезные для дальнейших действий и, в результате, планировать свое поведение. Именно развитые когнитивные и делиберативные способности позволяют таким агентам строить виртуальные миры, работая в которых они формируют планы действий.

    Интеллектуальные агенты, будучи значительно автономнее реактивных, имеют куда ярче выраженную индивидуальность и характеризуются целесообразным поведением в сообществе агентов, а также стремлением использовать ресурсы других агентов для достижения собственных целей. В то же время, реактивные агенты, как это видно из самого их названия, работают в основном на уровне стимульно-реактивных связей, обладая очень бедной индивидуальностью и сильной зависимостью от внешней среды (сообщества агентов). Результаты сравнительного анализа реактивных и когнитивных агентов представлены в таблице.

    Характеристики Когнитивные агенты Реактивные агенты
    Внутренняя модель внешнего мира Развитая Примитивная
    Рассуждения Сложные и рефлексивные рассуждения Простые одношаговые рассуждения
    Мотивация Развитая система мотивации, включающая убеждения, желания, намерения Простейшие побуждения, связанные с выживанием
    Память Есть Нет
    Реакция Медленная Быстрая
    Адаптивность Малая Высокая
    Модульная архитектура Есть Нет
    Состав многоагентной системы Небольшое число автономных агентов Большое число зависимых друг от друга агентов

    Далее, по типу поведения интеллектуальные агенты делятся на интенциональных и рефлекторных, а реактивные – на побуждаемых (импульсивных) и трофических. Большинство интеллектуальных (когнитивных) агентов можно отнести к числу интенциональных . Подобные агенты наделены собственными механизмами мотивации. Это означает, что в них так или иначе моделируются внутренние убеждения, желания, намерения и мотивы, порождающие цели, которые и определяют их действия.

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

    Таким образом, они представляют собой граничный случай понятия когнитивного агента и могут использоваться как «вспомогательные агенты». Данные агенты способны отвечать на вопросы и выполнять задания, которые ставят перед ними другие агенты, но решение этих задач не приводит к появлению у них собственных целей. Типичными примерами таких вырожденных агентов являются системы поиска в базах данных и простейшие логические регуляторы.

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

    По сложности этих реакций и происхождению источников мотивации реактивные агенты подразделяются на импульсивных и трофических агентов. В случае трофических агентов поведение определяется простейшими трофическими связями (типа «кто кого ест»). Фактически оно сводится к ответу на стимулы, поступающие из внешней среды (собственных мотивов и целей нет), т. е. полностью определяется ее локальным состоянием. Типичной моделью подобных агентов являются клеточные автоматы, где основными параметрами выступают: радиус восприятия агента, количество условных единиц питания во внешней среде и энергетическая стоимость единицы. Здесь каждый трофический (по сути, ситуационный) агент обладает небольшим набором ситуационных правил, задающим его реакции на сигналы из среды. Примерами подобных правил служат выражения типа «если в радиусе восприятия есть единица питания, то направиться к ней» или «если в радиусе восприятия не обнаружена единица питания, то случайным образом выбрать один из свободных соседних квадратов и передвинуться в этот квадрат».

    Между тем, реактивные агенты, называемые импульсивные , также могут иметь примитивный механизм мотивации, толкающий их на выполнение задачи, например, удовлетворение набора жизненных потребностей. Речь идет о поддержании энергетического баланса или, в более широком плане, об условиях выживания агента. Действие механизма самосохранения у агента характеризуется способностями определения и увеличения расстояния границ своего существования. Побуждению к какому-нибудь действию импульсивного агента основывается на таких факторах, как отклонение некоторой жизненно важной переменной (потребности) от нормы и веса (субъективная важность) этой потребности.

    Итак, когнитивные агенты, благодаря их сложности, наличию знаний и способностей к рассуждениям о своем поведении и внешней среде, могут быть более автономными, чем реактивные. Они работают относительно независимо, демонстрируя достаточно гибкое поведение. Но все та же сложность автономных агентов, выливающаяся в способность противиться внешним воздействиям, вызывает определенные трудности при организации их эффективного взаимодействия. Поэтому в составе , включающей только интеллектуальных агентов, как правило, присутствует не более 7 + 2 автономных единиц.

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

    Интеллектуальные агенты по характеру информационного взаимодействия между собой могут подразделяться на правдивых (стремящихся к передаче истинной информации) и лживых (ориентированных на дезинформацию других агентов).

    С уровнем «свободы воли», характером намерений и отношением к партнерам связаны, в частности, представления о благонамеренных (benevolent) и злонамеренных, эгоистических (self-interested) и альтруистических агентах. В частности, полагается, что благонамеренные (доброжелательные) агенты всегда пытаются делать только то, что от них требуется, и избегают конфликтных ситуаций.

    Наконец, еще один вариант классификации, где дополнительно к биологическому и психологическому уровням агентообразования вводится социальный и используются аналогии с триадой «растение – животное – человек». По мнению П. Браспеннинга, реактивных, интенциональных и социальных агентов можно уподобить компонентам этой триады. Агенты, подобные растениям, характеризуются реактивностью, выполнением стереотипных программ и посылкой сообщений другим агентам и в среду. Агенты, подобные животным, способны выбирать цели, строить планы действий и обеспечивать их выполнение. Они координируют свои действия, обмениваясь информацией об индивидуальных предпочтениях или задачах. Наконец, гуманоидные агенты, обладая внутренними моделями других агентов (и способностью к рефлексии), характеризуются социальным (ролевым) поведением. Сложность внутренних моделей зависит от уровня знаний и опыта гуманоидного агента.

    © 2005-2017, HOCHU.UA