Фреймовые модели представления знаний. Разработка структуры фреймов для реализации экспертной системы. Разработка экспертной системы с фреймовой моделью представления знаний. Редактирование базы фактов кандидатов и описание режима консультации.
В ходе курсового проекта разработана программная система, предназначенная для поиска вакансий на бирже труда согласно рейтингу с использованием фреймовой модели представления знаний и выдачи результатов пользователю.
Среда разработки INTELLIJ IDEA 8.0, язык Java 6.0, платформа Java Runtime Environment 1.6.10, операционная система MS Windows Vista Home Premium.
Системные требования: процессор Intel x86 с частотой не менее 1 ГГЦ, 128Мб RAM, 1Гб HDD, платформа Java Runtime Environment 1.6.10 и выше, ОС - любая, совместимая с платформой Java Runtime Environment.
1. Фреймовые модели представления знаний
Фреймом называется структура для описания стереотипной ситуации, состоящая из характеристик этой ситуации и их значений.
Характеристики называются слотами, а значения - заполнителями слотов. Слот может содержать не только конкретное значение, но и имя процедуры, позволяющей вычислить его по заданному алгоритму, а также одно или несколько правил, с помощью которых это значение можно найти. В слот может входить не одно, а несколько значений. Иногда слот включает компонент называемый фасетом, который задает диапазон или перечень его возможных значений.
С каждым слотом можно связать любое число процедур. Три типа процедур, чаще всего связывающиеся со слотами: 1. IFADDED: процедура ЕСЛИ - ДОБАВЛЕНО. Выполняется, когда новая информация помещается в слот.
2. IFDELETED: процедура ЕСЛИ -УДАЛЕНО. Выполняется, когда информация удаляется из слота.
3. IFNEEDED: процедура ЕСЛИ - НУЖНО. Выполняется, когда запрашивается информация из слота, а он пустой.
Эти процедуры могут следить за приписыванием информации к данному узлу и проверять, что при изменении значения производятся соответствующие действия. Иллюстрация связи слотов фреймов с процедурами приведена на рисунке 1.
Как ясно из их структуры, системы, основанные на фреймах, хороши в тех предметных областях, где ожидания относительно формы и содержания данных играют важную роль, например, интерпретация визуальной информации или понимание речи.
Для описания фреймовых структур были разработаны специализированные языки.
Одним из них является язык RLL (Representation Language, Language), разработанный в 1980 г. В нем вводятся базовые конструкции в виде RLL элемента - фрейм прототип, содержащий несколько слотов; ряд системных слотов, которые являются обязательными: · is_a - слот, задает родовидовые отношения;
· examples - примеры;
· to_compute - вычисления;
· generalization - обобщение;
· description - описание.
Рисунок 1 - Иллюстрация связи слотов фрейма с процедурами
Другим языком является FRL (Frame Representation Language), разработанный в 1974 г. Фрейм состоит из 5-ти уровневой конструкции, изображенной на рисунке 2.
Рисунок 2 - Пятиуровневая конструкция фрейма в языке FRL
Аспект - правило работы с данными. Всего 2 основных: · ¤Value - данные используются в обычном понимании значения (м.б. добавлены, удалены, отредактированы);
· ¤Default - значения аспектов используются по умолчанию.
Каждый слот одновременно может иметь несколько аспектов. С каждым слотом связанно от 1 до 3-х процедур: · if_added;
· if_needed;
· if_deleted.
2. Разработка структуры фреймов для реализации экспертной системы
В соответствии с заданием определим структуру фреймов-прототипов: «биржа труда», «вакансия», «кандидат». Полученная структура приведена на рисунке 3.
Рисунок 3 - Структура фреймов-прототипов
Т.к. количество параметров согласно заданию велико, на рисунке 3 отображены не все рейтинги, но неизображенные определяются аналогично.
Фреймы-экземпляры образуют дерево фреймов, корнем которого является фрейм «биржа труда».
Каждому слоту во фреймах-прототипах поставим в соответствие три процедуры: IF_ADDED, IF_DELETED, IF_NEEDED. Изначально слоты всех фреймов пусты. Процедура IF_NEEDED для каждого слота определяется таким образом, чтобы загрузить из базы фактов необходимую информацию. Пример для фрейма «кандидат» приведен на рисунке 4.
Поиск осуществляется запросом значения слота «список сотрудников с рейтингом» и фрейма «биржа труда». Вызывается процедура IF_NEEDED, которая запрашивает значение слота «вакансия» (тоже на тот момент пустого), создает список фреймов-экземпляров сотрудников и для каждого из них осуществляет следующие действия: 1. нормализация весов;
2. расчет рейтинга по следующей формуле:
boc, bпк, btc - веса групп характеристик, нормализованных [0;1] (сумма равна 1).
- веса отдельных характеристик в группе, нормализованных [-1;1] (сумма абсолютных значений равна 1).
- числовые нормализованные значения [-1;1] характеристик кандидата.
3. Разработка экспертной системы с фреймовой моделью представления знаний
Для реализации экспертной системы с фреймовой моделью представления знаний классы (рисунок 5): · Интерфейс «Фрейм» (IFRAME). Представляет собой интерфейс фрейма. Позволяет добавлять, изменять, удалять слоты, а также получать слот по его имени.
· Класс «Фрейм» (Frame). Реализация интерфейса IFRAME. Содержит ассоциативный массив слотов и их имен.
· Интерфейс «Слот» (ISLOT). Представляет собой интерфейс слота. Позволяет получать и задавать хранимое значение, а также задавать и удалять процедуры IF_ADDED, IF_NEEDED, IF_DELETED.
· Класс «Слот» (Slot). Реализация интерфейса ISLOT. Для вызова процедур использует механизм рефлексии (Java Reflection API), что позволяет использовать в качестве процедур любую функцию, написанную в любом классе. Это позволяет добиться большей гибкости приложения.
Рисунок 5 - Диаграмма классов
4. Описание реализации
4.1 Выбор и обоснование комплекса программных средств
Для написания программной системы была выбрана среда программирования - INTELLIJ IDEA 8.0, которая хорошо подходит для создания любых автоматизированных систем по принципам объектно-ориентированного программирования, значительно облегчает отладку программы и разработку ее логической и интерфейсной части, а также является наиболее современным и гибким средством разработки.
Язык программирования - Java 6.0. Это язык программирования, сочетающий объектно-ориентированные и аспектно-ориентированные концепции. Первоначальный вариант языка разработан в 1994 - 1996 годах группой инженеров в компании Sun Microsystems как основной язык разработки приложений для платформы J2SE.
Для работы автоматизированной системы необходимо наличие виртуальной машины Java Runtime Environment 1.6.10 и выше.
4.2 Описание функционирования системы
Программная система имеет 2 основных режима работы - режим эксперта и режим консультации.
1. Режим эксперта. В режиме эксперта можно: a. изменять базу фактов кандидатов;
b. изменять базу фактов вакансий.
2. Режим консультации. В режиме консультации система позволяет выбрать вакансию, для которой будет осуществляться поиск, получить на экран отранжированный согласно рейтингу список кандидатов, а также получить объяснение процессу вычисления рейтинга.
4.2.1 Описание режима эксперта
В режиме эксперта для редактирования доступна база фактов кандидатов (рисунок 6).
Рисунок 6 - Окно редактирования базы фактов кандидатов
Также доступна для редактирования база фактов вакансий (рисунок 7).
Рисунок 7 - Окно редактирования базы фактов вакансий
4.2.2 Описание режима консультации
После выбора меню «Поиск» появляется диалоговое окно, предлагающее выбрать вакансию, для которой будет производиться поиск (рисунок 8).
Рисунок 8 - Диалог выбора вакансии
Затем на экране будет отображен список кандидатов, отранжированный по убыванию рейтинга. Для каждого кандидата можно просмотреть характеристики.
Рисунок 9 - Экран результатов поиска
Дополнительно можно посмотреть основные пункты процесса вычисления в меню «Объяснение решения» (рисунок 10).
Рисунок 10 - Форма объяснения решения
5.3 Контрольный пример
Внесем факты о кандидатах и вакансиях:
фреймовый модель экспертный редактирование
Рисунок 11 - Контрольный пример режима эксперта
Осуществим поиск кандидатов на заданную вакансию (рисунок 12):
Рисунок 12 - Контрольный пример в режиме консультации
В объяснении будет указано, какие значения использовались при расчете (рисунок 13).
Рисунок 13 - Объяснение решения.
Список использованной литературы
1. В. П. Дерябкин, Курс лекций по основам экспертных систем. Самара, 2009
2. Документация по платформе Java Runtime Environment 1.6, Sun Microsystems Inc., 2007
if (CANDIDATEFRAME.GETSLOTBY(TOWNSMAN, Boolean.class).GETSTOREDOBJECT()) { v = COMMONINFO.GETTOWNSMANRATING();
TOWNSMAN = "в городе";
} else { v = COMMONINFO.GETVILLAGERRATING();
TOWNSMAN = "за городом";
}
TOWNSRATING = v;
common = COMMONINFO.GETTOWNSMANFACTOR() * v;
CORRECTIONFACTOR = abs(v);
// children
String children;
if (CANDIDATEFRAME.GETSLOTBY(PARENT, Boolean.class).GETSTOREDOBJECT()) { v = COMMONINFO.GETPARENTRATING();
children = "имеются дети";
} else { v = COMMONINFO.GETCFRATING();
children = "не имеется детей";
} double CHILDRENRATING = v;
common = COMMONINFO.GETPARENTFACTOR() * v;
CORRECTIONFACTOR = abs(v);
// driver
String driver;
if (CANDIDATEFRAME.GETSLOTBY(DRIVER, Boolean.class).GETSTOREDOBJECT()) { v = COMMONINFO.GETDRIVERRATING();
driver = "имеется автомобиль";
} else { v = COMMONINFO.GETPEDESTRIANRATING();
driver = "не имеется автомобиля";
} double DRIVERRATING = v;
common = COMMONINFO.GETDRIVERFACTOR() * v;
CORRECTIONFACTOR = abs(v);
// outgoer
String outgoer;
if (CANDIDATEFRAME.GETSLOTBY(OUTGOING, Boolean.class).GETSTOREDOBJECT()) { v = COMMONINFO.GETOUTGOERRATING();
outgoer = "имеет возможность";
} else { v = COMMONINFO.GETHOMESITTERRATING();
outgoer = "не имеет возможности";
} double OUTGOERRATING = v;
common = COMMONINFO.GETOUTGOINGFACTOR() * v;
CORRECTIONFACTOR = abs(v);
assert (CORRECTIONFACTOR > 1e-6);
double COMMONOLD = common / CORRECTIONFACTOR;
common *= VACANCYFRAME.GETSLOTBY(COMMON_FACTOR, Double.class).GETSTOREDOBJECT() / CORRECTIONFACTOR;
Explanation.GETINSTANCE().add("Пол кандидата %s; вес характеристики %.4f; числовое значение характеристики %.4f", sex, COMMONINFO.GETSEXFACTOR(), 100*SEXRATING/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Возраст кандидата %d; вес характеристики %.4f; числовое значение характеристики %.4f", CANDIDATEFRAME.GETSLOTBY(AGE, Byte.class).GETSTOREDOBJECT().INTVALUE(), COMMONINFO.GETAGEFACTOR(), 100*AGERATING/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Кандидат проживает %s; вес характеристики %.4f; числовое значение характеристики %.4f", TOWNSMAN, COMMONINFO.GETTOWNSMANFACTOR(), 100*TOWNSRATING/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("У кандидата %s; вес характеристики %.4f; числовое значение характеристики %.4f", children, COMMONINFO.GETPARENTFACTOR(), 100*CHILDRENRATING/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("У кандидата %s; вес характеристики %.4f; числовое значение характеристики %.4f", driver, COMMONINFO.GETDRIVERFACTOR(), 100*DRIVERRATING/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Кандидат %s совершать командировки; вес характеристики %.4f; числовое значение характеристики %.4f", outgoer, COMMONINFO.GETOUTGOINGFACTOR(), 100*OUTGOERRATING/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Итоговое значение для группы общих сведений %.4f x %.4f = %.4f", VACANCYFRAME.GETSLOTBY(COMMON_FACTOR, Double.class).GETSTOREDOBJECT(), 100*COMMONOLD, 100*common);
if (CANDIDATEFRAME.GETSLOTBY(COMPUTER_USER, Boolean.class).GETSTOREDOBJECT()) { user = "владеет";
v = info.GETUSERRATING();
} else { user = "не владеет";
v = info.GETNOTUSERRATING();
} double USERRATING = v;
professional = info.GETCOMPUTERUSERFACTOR() * v;
CORRECTIONFACTOR = abs(v);
assert (CORRECTIONFACTOR > 1e-6);
double PROLD = professional/ CORRECTIONFACTOR;
professional *= VACANCYFRAME.GETSLOTBY(PROFESSIONAL_FACTOR, Double.class).GETSTOREDOBJECT() / CORRECTIONFACTOR;
Explanation.GETINSTANCE().add("Стаж кандидата %d; вес характеристики %.4f; числовое значение характеристики %.4f", CANDIDATEFRAME.GETSLOTBY(EXPERIENCE, Byte.class).GETSTOREDOBJECT().INTVALUE(), info.GETEXPERIENCEFACTOR(), 100*EXPRATING/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Кандидат %s компьютером; вес характеристики %.4f; числовое значение характеристики %.4f", user, info.GETCOMPUTERUSERFACTOR(), 100*USERRATING/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Итоговое значение для группы профессиональных качеств %.4f x %.4f = %.4f", VACANCYFRAME.GETSLOTBY(PROFESSIONAL_FACTOR, Double.class).GETSTOREDOBJECT(), 100*PROLD, 100*professional);
Explanation.GETINSTANCE().add("Трудолюбие %d; вес характеристики %.4f; числовое значение характеристики %.4f", CANDIDATEFRAME.GETSLOTBY(INDUSTRIOUSNESS, Byte.class).GETSTOREDOBJECT().INTVALUE(), info.GETINDUSTRIOUSNESSFACTOR(), 100*INDINTERVAL.GETINTERVALRATING()/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Аккуратность %d; вес характеристики %.4f; числовое значение характеристики %.4f", CANDIDATEFRAME.GETSLOTBY(ACCURATENESS, Byte.class).GETSTOREDOBJECT().INTVALUE(), info.GETACCURATENESSFACTOR(), 100*ACCINTERVAL.GETINTERVALRATING()/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Интеллект %d; вес характеристики %.4f; числовое значение характеристики %.4f", CANDIDATEFRAME.GETSLOTBY(INTELLIGENCE, Byte.class).GETSTOREDOBJECT().INTVALUE(), info.GETINTELLIGENCEFACTOR(), 100*INTINTERVAL.GETINTERVALRATING()/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Коммуникабельность %d; вес характеристики %.4f; числовое значение характеристики %.4f", CANDIDATEFRAME.GETSLOTBY(SOCIABILITY, Byte.class).GETSTOREDOBJECT().INTVALUE(), info.GETSOCIABILITYFACTOR(), 100*SOCINTERVAL.GETINTERVALRATING()/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Предприимчивость %d; вес характеристики %.4f; числовое значение характеристики %.4f", CANDIDATEFRAME.GETSLOTBY(ENTERPRISE, Byte.class).GETSTOREDOBJECT().INTVALUE(), info.GETENTERPRISEFACTOR(), 100*ENTINTERVAL.GETINTERVALRATING()/CORRECTIONFACTOR);
Explanation.GETINSTANCE().add("Итоговое значение для группы результатов тестирования %.4f x %.4f = %.4f", VACANCYFRAME.GETSLOTBY(TESTING_FACTOR, Double.class).GETSTOREDOBJECT(), 100*TESTOLD, 100*testing);