Экспертная система поиска кандидатов на вакансии на бирже труда

Фреймовые модели представления знаний. Разработка структуры фреймов для реализации экспертной системы. Разработка экспертной системы с фреймовой моделью представления знаний. Редактирование базы фактов кандидатов и описание режима консультации.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 13.10.2012
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Содержание

СОДЕРЖАНИЕ

РЕФЕРАТ

1. ФРЕЙМОВЫЕ МОДЕЛИ ПРЕДСТАВЛЕНИЯ ЗНАНИЙ

2. РАЗРАБОТКА СТРУКТУРЫ ФРЕЙМОВ ДЛЯ РЕАЛИЗАЦИИ ЭКСПЕРТНОЙ СИСТЕМЫ

3. РАЗРАБОТКА ЭКСПЕРТНОЙ СИСТЕМЫ С ФРЕЙМОВОЙ МОДЕЛЬЮ ПРЕДСТАВЛЕНИЯ ЗНАНИЙ

4. ОПИСАНИЕ РЕАЛИЗАЦИИ

4.1 ВЫБОР И ОБОСНОВАНИЕ КОМПЛЕКСА ПРОГРАММНЫХ СРЕДСТВ

4.2 ОПИСАНИЕ ФУНКЦИОНИРОВАНИЯ СИСТЕМЫ

4.2.1 Описание режима эксперта

4.2.2 Описание режима консультации

4.3 КОНТРОЛЬНЫЙ ПРИМЕР

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ А. ИСХОДНЫЙ КОД ОСНОВНЫХ КЛАССОВ

Реферат

Курсовой проект.

Пояснительная записка: 31 стр., 12 рис., 3 источника

ЭКСПЕРТНАЯ СИСТЕМА, ФРЕЙМ, СЛОТ, ДЕРЕВО ФРЕЙМОВ

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

Среда разработки IntelliJ IDEA 8.0, язык Java 6.0, платформа Java Runtime Environment 1.6.10, операционная система MS Windows Vista Home Premium.

Системные требования: процессор Intel x86 с частотой не менее 1 ГГц, 128Mб RAM, 1Гб HDD, платформа Java Runtime Environment 1.6.10 и выше, ОС - любая, совместимая с платформой Java Runtime Environment.

1. Фреймовые модели представления знаний

Фреймом называется структура для описания стереотипной ситуации, состоящая из характеристик этой ситуации и их значений.

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

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

1. IF - ADDED: процедура ЕСЛИ - ДОБАВЛЕНО. Выполняется, когда новая информация помещается в слот.

2. IF - DELETED: процедура ЕСЛИ -УДАЛЕНО. Выполняется, когда информация удаляется из слота.

3. IF - NEEDED: процедура ЕСЛИ - НУЖНО. Выполняется, когда запрашивается информация из слота, а он пустой.

Эти процедуры могут следить за приписыванием информации к данному узлу и проверять, что при изменении значения производятся соответствующие действия. Иллюстрация связи слотов фреймов с процедурами приведена на рисунке 1.

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

Для описания фреймовых структур были разработаны специализированные языки.

Одним из них является язык RLL (Representation Language, Language), разработанный в 1980 г. В нем вводятся базовые конструкции в виде RLL элемента - фрейм прототип, содержащий несколько слотов; ряд системных слотов, которые являются обязательными:

· is_a - слот, задает родовидовые отношения;

· examples - примеры;

· to_compute - вычисления;

· generalization - обобщение;

· description - описание.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рисунок 1 - Иллюстрация связи слотов фрейма с процедурами

Другим языком является FRL (Frame Representation Language), разработанный в 1974 г. Фрейм состоит из 5-ти уровневой конструкции, изображенной на рисунке 2.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рисунок 2 - Пятиуровневая конструкция фрейма в языке FRL

Аспект - правило работы с данными. Всего 2 основных:

· ¤Value - данные используются в обычном понимании значения (м.б. добавлены, удалены, отредактированы);

· ¤Default - значения аспектов используются по умолчанию.

Каждый слот одновременно может иметь несколько аспектов. С каждым слотом связанно от 1 до 3-х процедур:

· if_added;

· if_needed;

· if_deleted.

2. Разработка структуры фреймов для реализации экспертной системы

В соответствии с заданием определим структуру фреймов-прототипов: «биржа труда», «вакансия», «кандидат». Полученная структура приведена на рисунке 3.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рисунок 3 - Структура фреймов-прототипов

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

Фреймы-экземпляры образуют дерево фреймов, корнем которого является фрейм «биржа труда».

Каждому слоту во фреймах-прототипах поставим в соответствие три процедуры: IF_ADDED, IF_DELETED, IF_NEEDED. Изначально слоты всех фреймов пусты. Процедура IF_NEEDED для каждого слота определяется таким образом, чтобы загрузить из базы фактов необходимую информацию. Пример для фрейма «кандидат» приведен на рисунке 4.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рисунок 4 - Процедура слота «ФИО» фрейма «кандидат»

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

1. нормализация весов;

2. расчет рейтинга по следующей формуле:

bос, bпк, bтс - веса групп характеристик, нормализованных [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

3. Фрейм (инженерия знаний) - http://ru.wikipedia.org/wiki/_Фрейм_(инженерия_знаний)

ПРИЛОЖЕНИЕ А. Исходный код основных классов

package org.grab.crysisbloodhound.frame;

import java.util.List;

public interface IFrame {

String getName();

void addSlot(ISlot<?> slot, String name);

void removeSlot(String name);

boolean hasSlot(String name);

List<ISlot> getSlots();

<T> ISlot<T> getSlotBy(String name, Class<T> clazz);

int getSessionId();

}

package org.grab.crysisbloodhound.frame;

import gnu.trove.THashMap;

import java.util.List;

import java.util.Map;

import java.util.ArrayList;

public class Frame implements IFrame {

private final String name;

private final int sessionId;

private final Map<String, ISlot> slots;

public Frame(final int sessionId, String name) {

this.sessionId = sessionId;

this.name = name;

this.slots = new THashMap<String, ISlot>();

EventsStorage.getInstance().addEvent(sessionId, new Event(EventType.CREATED, this, name));

}

@Override

public String getName() {

return name;

}

@Override

public void addSlot(ISlot<?> slot, String name) {

slots.put(name, slot);

EventsStorage.getInstance().addEvent(sessionId, new Event(EventType.SLOT_ADDED, this, name));

slot.addedTo(this);

}

@Override

public void removeSlot(String name) {

ISlot<?> slot = slots.remove(name);

if (slot != null) {

slot.removedFrom(this);

}

}

@Override

public boolean hasSlot(String name) {

return slots.containsKey(name);

}

@Override

public List<ISlot> getSlots() {

return new ArrayList<ISlot>(slots.values());

}

@SuppressWarnings({"unchecked"})

@Override

public <T> ISlot<T> getSlotBy(String name, Class<T> clazz) {

return (ISlot<T>)slots.get(name);

}

@Override

public int getSessionId() {

return sessionId;

}

@Override

public String toString() {

final StringBuilder builder = new StringBuilder("[Frame: name = ").append(name);

for (Map.Entry<String, ISlot> entry : slots.entrySet()) {

builder.append(" [").append(entry.getKey()).append(" = ").append(entry.getValue().getStoredObject()).append(']');

}

return builder.append(']').toString();

}

}

package org.grab.crysisbloodhound.frame;

import java.lang.reflect.Method;

public interface ISlot<T> {

Frame getFrame();

void addedTo(Frame frame);

void removedFrom(Frame frame);

int getSessionId();

void setStoredObject(T newValue);

Class<T> getStoredObjectType();

T getStoredObject();

void ifAdded();

void ifDeleted();

void ifNeeded();

Method getIfAdded();

Method getIfNeeded();

Method getIfDeleted();

void setIfAdded(final Method ifAdded);

void setIfNeeded(final Method ifNeeded);

void setIfDeleted(final Method ifDeleted);

}

package org.grab.crysisbloodhound.frame;

import java.lang.reflect.Method;

import java.lang.reflect.InvocationTargetException;

public class Slot<T> implements ISlot<T> {

private final Class<T> clazz;

private T storedObject;

private Frame frame;

private Method ifAdded;

private Method ifNeeded;

private Method ifDeleted;

public Slot(Class<T> clazz) {

this.clazz = clazz;

}

@Override

public Class<T> getStoredObjectType() {

return clazz;

}

@Override

public T getStoredObject() {

if (storedObject == null) {

ifNeeded();

}

return storedObject;

}

@Override

public void setStoredObject(T newValue) {

storedObject = newValue;

EventsStorage.getInstance().addEvent(getSessionId(), new Event(EventType.CHANGED, this, newValue));

if (newValue == null) {

ifDeleted();

} else {

ifAdded();

}

}

@Override

public int getSessionId() {

return getFrame().getSessionId();

}

@Override

public Frame getFrame() {

return frame;

}

@Override

public void addedTo(Frame frame) {

this.frame = frame;

}

@Override

public void removedFrom(Frame frame) {

if (frame != this.frame) {

this.frame = null;

}

}

private void internalInvoke(final Method method) {

if (method != null) {

try {

method.invoke(null, this);

} catch (IllegalAccessException e) {

throw new RuntimeException(e);

} catch (InvocationTargetException e) {

throw new RuntimeException(e);

}

}

}

@Override

public void ifAdded() {

EventsStorage.getInstance().addEvent(getSessionId(), new Event(EventType.IF_ADDED_INVOKED, this, null));

internalInvoke(ifAdded);

}

@Override

public void ifDeleted() {

EventsStorage.getInstance().addEvent(getSessionId(), new Event(EventType.IF_DELETED_INVOKED, this, null));

internalInvoke(ifDeleted);

}

@Override

public void ifNeeded() {

EventsStorage.getInstance().addEvent(getSessionId(), new Event(EventType.IF_NEEDED_INVOKED, this, null));

internalInvoke(ifNeeded);

ifAdded();

}

@Override

public Method getIfAdded() {

return ifAdded;

}

@Override

public Method getIfNeeded() {

return ifNeeded;

}

@Override

public Method getIfDeleted() {

return ifDeleted;

}

@Override

public void setIfAdded(Method ifAdded) {

this.ifAdded = ifAdded;

}

@Override

public void setIfNeeded(Method ifNeeded) {

this.ifNeeded = ifNeeded;

}

@Override

public void setIfDeleted(Method ifDeleted) {

this.ifDeleted = ifDeleted;

}

@Override

public String toString() {

return String.format("[Slot of %s; stored = %s; ifAdded = %s; ifDeleted = %s; ifNeeded = %s]",

clazz.getSimpleName(), String.valueOf(storedObject),

String.valueOf(ifAdded), String.valueOf(ifDeleted), String.valueOf(ifNeeded));

}

}

package org.grab.crysisbloodhound.engine;

import org.grab.crysisbloodhound.frame.*;

import org.grab.crysisbloodhound.model.entity.Candidate;

import java.util.List;

import java.util.ArrayList;

import java.util.Map;

import java.lang.reflect.Method;

public final class BloodhoundEngine {

private static final BloodhoundEngine instance = new BloodhoundEngine();

public static BloodhoundEngine getInstance() {

return instance;

}

private Frame laborExchange;

private BloodhoundEngine() {

}

private void init(final int sessionId) {

laborExchange = new Frame(sessionId, EngineConstants.LABOR_NAME);

laborExchange.addSlot(createCandidatesSlot(), EngineConstants.CANDIDATES);

laborExchange.addSlot(createVacanciesSlot(), EngineConstants.VACANCIES);

laborExchange.addSlot(createMapSlot(), EngineConstants.RANGED_CANDIDATES);

}

@SuppressWarnings({"unchecked"})

public Map<Candidate, Integer> start(final int sessionId, final long vacancyId) {

init(sessionId);

final IdentifiedSlot<Map, Long> slot = (IdentifiedSlot<Map, Long>) laborExchange.getSlotBy(EngineConstants.RANGED_CANDIDATES, Map.class);

slot.setIdentifier(vacancyId);

return slot.getStoredObject();

}

private ISlot<List> createCandidatesSlot() {

final ISlot<List> candidatesSlot = new Slot<List>(List.class);

candidatesSlot.setIfNeeded(CandidatesSlotMethods.getMethod("loadCandidatesSlotsList"));

return candidatesSlot;

}

private ISlot<List> createVacanciesSlot() {

final ISlot<List> vacanciesSlot = new Slot<List>(List.class);

vacanciesSlot.setIfNeeded(VacanciesSlotMethods.getMethod("loadAllVacancies"));

return vacanciesSlot;

}

private ISlot<Map> createMapSlot() {

final ISlot<Map> mapSlot = new IdentifiedSlot<Map, Long>(Map.class);

mapSlot.setIfNeeded(CandidatesSlotMethods.getMethod(MapsSlotMethods.class, "getRangedMap"));

return mapSlot;

}

}

package org.grab.crysisbloodhound.engine;

import org.grab.crysisbloodhound.frame.ISlot;

import org.grab.crysisbloodhound.frame.Frame;

import org.grab.crysisbloodhound.frame.IdentifiedSlot;

import org.grab.crysisbloodhound.model.entity.*;

import org.grab.crysisbloodhound.model.dao.DAOFactory;

import org.grab.crysisbloodhound.model.dao.DAOCandidate;

import static org.grab.crysisbloodhound.engine.EngineConstants.*;

import org.grab.crysisbloodhound.ui.Explanation;

import static java.lang.Math.abs;

import java.util.Map;

import java.util.List;

import gnu.trove.THashMap;

public final class MapsSlotMethods {

public static void getRangedMap(ISlot<Map> slot) {

final IdentifiedSlot<Map, Long> rangedList = (IdentifiedSlot<Map, Long>) slot;

final long vacancyId = rangedList.getIdentifier();

final Frame laborFrame = rangedList.getFrame();

final Frame vacancyFrame = findVacancyFrame(vacancyId, laborFrame);

assert (vacancyFrame != null);

Explanation.getInstance().add("Рассматриваем вакансию: <b>%s</b><br/>", vacancyFrame.getSlotBy(NAME, String.class).getStoredObject());

normalizeVacanciesFactors(vacancyFrame);

final Map<Candidate, Integer> rangedMap = new THashMap<Candidate, Integer>();

final ISlot<List> candidates = laborFrame.getSlotBy(CANDIDATES, List.class);

final DAOCandidate daoCandidate = DAOFactory.getInstance().getDAOCandidate();

for (Object o : candidates.getStoredObject()) {

final Frame candidateFrame = (Frame) o;

rangedMap.put(daoCandidate.getCandidateById(candidateFrame.getSlotBy(ID, Long.class).getStoredObject()), computeRangeFor(candidateFrame, vacancyFrame));

}

rangedList.setStoredObject(rangedMap);

}

private static void normalizeVacanciesFactors(final Frame vacancyFrame) {

normalizeInfoFactors(vacancyFrame);

normalizeCommonInfoFactors(vacancyFrame);

normalizeProfessionalInfoFactors(vacancyFrame);

normalizeTestingInfoFactors(vacancyFrame);

}

private static void normalizeTestingInfoFactors(Frame vacancyFrame) {

final ISlot<TestingInfo> testingInfoSlot = vacancyFrame.getSlotBy(TESTING_INFO, TestingInfo.class);

final TestingInfo info = testingInfoSlot.getStoredObject();

final double accuratenessFactor = info.getAccuratenessFactor();

final double enterpriseFactor = info.getEnterpriseFactor();

final double industriousnessFactor = info.getIndustriousnessFactor();

final double intelligenceFactor = info.getIntelligenceFactor();

final double sociabilityFactor = info.getSociabilityFactor();

final double correctionFactor = abs(accuratenessFactor) + abs(enterpriseFactor) +

abs(industriousnessFactor) + abs(intelligenceFactor) + abs(sociabilityFactor);

assert (correctionFactor > 1e-6);

double af = accuratenessFactor / correctionFactor;

info.setAccuratenessFactor(af);

double ef = enterpriseFactor / correctionFactor;

info.setEnterpriseFactor(ef);

double indf = industriousnessFactor / correctionFactor;

info.setIndustriousnessFactor(indf);

double intf = intelligenceFactor / correctionFactor;

info.setIntelligenceFactor(intf);

double sf = sociabilityFactor / correctionFactor;

info.setSociabilityFactor(sf);

Explanation.getInstance().add("Нормализуем веса группы результатов тестирования: <ul>" + "<li>Трудолюбие: %.4f</li>" +

"<li>Аккуратность: %.4f</li>" +

"<li>Интеллект: %.4f</li>" +

"<li>Коммуникабельность: %.4f</li>" +

"<li>Предприимчивость: %.4f</li>" +

"</ul><br/>", indf, af, intf, sf, ef);

}

private static void normalizeProfessionalInfoFactors(Frame vacancyFrame) {

final ISlot<ProfessionalInfo> professionalInfoSlot = vacancyFrame.getSlotBy(PROFESSIONAL_INFO, ProfessionalInfo.class);

final ProfessionalInfo info = professionalInfoSlot.getStoredObject();

final double experienceFactor = info.getExperienceFactor();

final double userFactor = info.getComputerUserFactor();

final double correctionFactor = abs(experienceFactor) + abs(userFactor);

assert (correctionFactor > 1e-6);

double ef = experienceFactor / correctionFactor;

info.setExperienceFactor(ef);

double uf = userFactor / correctionFactor;

info.setComputerUserFactor(uf);

Explanation.getInstance().add("Нормализуем веса группы профессиональных качеств: <ul>" + "<li>Стаж: %.4f</li>" +

"<li>Владение компьютером: %.4f</li>" +

"</ul><br/>", ef, uf);

}

private static void normalizeCommonInfoFactors(Frame vacancyFrame) {

final ISlot<CommonInfo> commonInfoSlot = vacancyFrame.getSlotBy(COMMON_INFO, CommonInfo.class);

final CommonInfo commonInfo = commonInfoSlot.getStoredObject();

final double ageFactor = commonInfo.getAgeFactor();

final double driverFactor = commonInfo.getDriverFactor();

final double outgoingFactor = commonInfo.getOutgoingFactor();

final double parentFactor = commonInfo.getParentFactor();

final double townsmanFactor = commonInfo.getTownsmanFactor();

final double sexFactor = commonInfo.getSexFactor();

final double correctionFactor = abs(ageFactor) + abs(driverFactor) + abs(outgoingFactor) +

abs(parentFactor) + abs(townsmanFactor) + abs(sexFactor);

assert (correctionFactor > 1e-6);

double aF = ageFactor / correctionFactor;

commonInfo.setAgeFactor(aF);

double dF = driverFactor / correctionFactor;

commonInfo.setDriverFactor(dF);

double oF = outgoingFactor / correctionFactor;

commonInfo.setOutgoerRating(oF);

double pF = parentFactor / correctionFactor;

commonInfo.setParentFactor(pF);

double tF = townsmanFactor / correctionFactor;

commonInfo.setTownsmanFactor(tF);

double sF = sexFactor / correctionFactor;

commonInfo.setSexFactor(sF);

Explanation.getInstance().add("Нормализуем веса группы общих сведений: <ul>" +

"<li>Возраст: %.4f</li>" +

"<li>Наличие автомобиля: %.4f</li>" +

"<li>Возможность коммандировок: %.4f</li>" +

"<li>Наличие детей: %.4f</li>" +

"<li>Место проживания: %.4f</li>" +

"<li>Пол: %.4f</li>" +

"</ul><br/>", aF, dF, oF, pF, tF, sF);

}

private static void normalizeInfoFactors(Frame vacancyFrame) {

final ISlot<Double> commonFactorSlot = vacancyFrame.getSlotBy(COMMON_FACTOR, Double.class);

final ISlot<Double> professionalFactorSlot = vacancyFrame.getSlotBy(PROFESSIONAL_FACTOR, Double.class);

final ISlot<Double> testingFactorSlot = vacancyFrame.getSlotBy(TESTING_FACTOR, Double.class);

final double commonFactor = commonFactorSlot.getStoredObject();

final double professionalFactor = professionalFactorSlot.getStoredObject();

final double testingFactor = testingFactorSlot.getStoredObject();

final double correctionFactor = commonFactor + professionalFactor + testingFactor;

double cf = commonFactor / correctionFactor;

commonFactorSlot.setStoredObject(cf);

double pf = professionalFactor / correctionFactor;

professionalFactorSlot.setStoredObject(pf);

double tf = testingFactor / correctionFactor;

testingFactorSlot.setStoredObject(tf);

Explanation.getInstance().add("Нормализуем веса групп характеристик: <ul>" +

"<li>Общие сведения: %.4f</li>" +

"<li>Профессиональные качества: %.4f</li>" +

"<li>Результаты тестирования: %.4f</li>" +

"</ul><br/>", cf, pf, tf);

}

private static Frame findVacancyFrame(long vacancyId, Frame laborFrame) {

final ISlot<List> vacancies = laborFrame.getSlotBy(VACANCIES, List.class);

for (Object o : vacancies.getStoredObject()) {

final Frame frame = (Frame) o;

if (frame.getSlotBy(ID, Long.class).getStoredObject() == vacancyId) {

return frame;

}

}

return null;

}

private static int computeRangeFor(final Frame candidateFrame, final Frame vacancyFrame) {

Explanation.getInstance().add("Рассматриваем кандидата <b>%s %s %s</b><br/>", candidateFrame.getSlotBy(SURNAME, String.class).getStoredObject(), candidateFrame.getSlotBy(NAME, String.class).getStoredObject(), candidateFrame.getSlotBy(FATHERSNAME, String.class).getStoredObject());

final double common = computeCommon(candidateFrame, vacancyFrame);

Explanation.getInstance().add("<br/>");

final double professional = computeProfessional(candidateFrame, vacancyFrame);

Explanation.getInstance().add("<br/>");

final double testing = computeTesting(candidateFrame, vacancyFrame);

Explanation.getInstance().add("<br/>");

final double r = common + professional + testing;

assert (r <= 1);

Explanation.getInstance().add("Итоговый рейтинг кандидата: <b><u>%d + %d + %d = %d</u></b><br/><br/>", (int)(common*100), (int)(professional*100), (int)(testing*100), (int)(r*100));

return (int) (r*100);

}

private static double computeCommon(Frame candidateFrame, Frame vacancyFrame) {

double common = 0;

final CommonInfo commonInfo = vacancyFrame.getSlotBy(COMMON_INFO, CommonInfo.class).getStoredObject();

double v;

double correctionFactor = 0;

String sex;

double sexRating;

// sex

if (candidateFrame.getSlotBy(SEX, Boolean.class).getStoredObject()) {

v = commonInfo.getMaleRating();

sex = "мужской";

} else {

v = commonInfo.getFemaleRating();

sex = "женский";

}

sexRating = v;

common += commonInfo.getSexFactor() * v;

correctionFactor += abs(v);

// age

final byte age = candidateFrame.getSlotBy(AGE, Byte.class).getStoredObject();

final IntegerInterval ageRanging = commonInfo.getAgeRanging().findIntervalFor(age);

assert (ageRanging != null);

double ageRating = ageRanging.getIntervalRating();

common += commonInfo.getAgeFactor() * ageRanging.getIntervalRating();

correctionFactor += abs(ageRanging.getIntervalRating());

// townsman

String townsMan;

double townsRating;

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("Пол кандидата <b>%s</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", sex, commonInfo.getSexFactor(), 100*sexRating/correctionFactor);

Explanation.getInstance().add("Возраст кандидата <b>%d</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", candidateFrame.getSlotBy(AGE, Byte.class).getStoredObject().intValue(), commonInfo.getAgeFactor(), 100*ageRating/correctionFactor);

Explanation.getInstance().add("Кандидат проживает <b>%s</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", townsMan, commonInfo.getTownsmanFactor(), 100*townsRating/correctionFactor);

Explanation.getInstance().add("У кандидата <b>%s</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", children, commonInfo.getParentFactor(), 100*childrenRating/correctionFactor);

Explanation.getInstance().add("У кандидата <b>%s</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", driver, commonInfo.getDriverFactor(), 100*driverRating/correctionFactor);

Explanation.getInstance().add("Кандидат <b>%s</b> совершать командировки; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", outgoer, commonInfo.getOutgoingFactor(), 100*outgoerRating/correctionFactor);

Explanation.getInstance().add("Итоговое значение для группы общих сведений <b>%.4f x %.4f = %.4f</b><br/>", vacancyFrame.getSlotBy(COMMON_FACTOR, Double.class).getStoredObject(), 100*commonOld, 100*common);

return common;

}

private static double computeProfessional(Frame candidateFrame, Frame vacancyFrame) {

double professional = 0;

final ProfessionalInfo info = vacancyFrame.getSlotBy(PROFESSIONAL_INFO, ProfessionalInfo.class).getStoredObject();

double v;

double correctionFactor = 0;

final byte experience = candidateFrame.getSlotBy(EXPERIENCE, Byte.class).getStoredObject();

final IntegerInterval experienceInterval = info.getExperienceRanging().findIntervalFor(experience);

assert (experienceInterval != null);

double expRating = experienceInterval.getIntervalRating();

professional += info.getExperienceFactor() * experienceInterval.getIntervalRating();

correctionFactor += abs(experienceInterval.getIntervalRating());

String user;

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("Стаж кандидата <b>%d</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", candidateFrame.getSlotBy(EXPERIENCE, Byte.class).getStoredObject().intValue(), info.getExperienceFactor(), 100*expRating/correctionFactor);

Explanation.getInstance().add("Кандидат <b>%s</b> компьютером; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", user, info.getComputerUserFactor(), 100*userRating/correctionFactor);

Explanation.getInstance().add("Итоговое значение для группы профессиональных качеств <b>%.4f x %.4f = %.4f</b><br/>", vacancyFrame.getSlotBy(PROFESSIONAL_FACTOR, Double.class).getStoredObject(), 100*prOld, 100*professional);

return professional;

}

private static double computeTesting(Frame candidateFrame, Frame vacancyFrame) {

double testing = 0;

final TestingInfo info = vacancyFrame.getSlotBy(TESTING_INFO, TestingInfo.class).getStoredObject();

double correctionFactor = 0;

final byte industriousness = candidateFrame.getSlotBy(INDUSTRIOUSNESS, Byte.class).getStoredObject();

final IntegerInterval indInterval = info.getIndustriousnessRanging().findIntervalFor(industriousness);

testing += info.getIndustriousnessFactor() * indInterval.getIntervalRating();

correctionFactor += abs(indInterval.getIntervalRating());

final byte sociability = candidateFrame.getSlotBy(SOCIABILITY, Byte.class).getStoredObject();

final IntegerInterval socInterval = info.getSociabilityRanging().findIntervalFor(sociability);

testing += info.getSociabilityFactor() * socInterval.getIntervalRating();

correctionFactor += abs(socInterval.getIntervalRating());

final byte intelligence = candidateFrame.getSlotBy(INTELLIGENCE, Byte.class).getStoredObject();

final IntegerInterval intInterval = info.getIntelligenceRanging().findIntervalFor(intelligence);

testing += info.getIntelligenceFactor() * intInterval.getIntervalRating();

correctionFactor += abs(intInterval.getIntervalRating());

final byte accurateness = candidateFrame.getSlotBy(ACCURATENESS, Byte.class).getStoredObject();

final IntegerInterval accInterval = info.getAccuratenessRanging().findIntervalFor(accurateness);

testing += info.getAccuratenessFactor() * accInterval.getIntervalRating();

correctionFactor += abs(accInterval.getIntervalRating());

final byte enterprise = candidateFrame.getSlotBy(INDUSTRIOUSNESS, Byte.class).getStoredObject();

final IntegerInterval entInterval = info.getEnterpriseRanging().findIntervalFor(enterprise);

testing += info.getEnterpriseFactor() * entInterval.getIntervalRating();

correctionFactor += abs(entInterval.getIntervalRating());

assert (correctionFactor > 1e-6);

double testOld = testing / correctionFactor;

testing *= vacancyFrame.getSlotBy(TESTING_FACTOR, Double.class).getStoredObject() / correctionFactor;

Explanation.getInstance().add("Трудолюбие <b>%d</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", candidateFrame.getSlotBy(INDUSTRIOUSNESS, Byte.class).getStoredObject().intValue(), info.getIndustriousnessFactor(), 100*indInterval.getIntervalRating()/correctionFactor);

Explanation.getInstance().add("Аккуратность <b>%d</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", candidateFrame.getSlotBy(ACCURATENESS, Byte.class).getStoredObject().intValue(), info.getAccuratenessFactor(), 100*accInterval.getIntervalRating()/correctionFactor);

Explanation.getInstance().add("Интеллект <b>%d</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", candidateFrame.getSlotBy(INTELLIGENCE, Byte.class).getStoredObject().intValue(), info.getIntelligenceFactor(), 100*intInterval.getIntervalRating()/correctionFactor);

Explanation.getInstance().add("Коммуникабельность <b>%d</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", candidateFrame.getSlotBy(SOCIABILITY, Byte.class).getStoredObject().intValue(), info.getSociabilityFactor(), 100*socInterval.getIntervalRating()/correctionFactor);

Explanation.getInstance().add("Предприимчивость <b>%d</b>; вес характеристики <b>%.4f</b>; числовое значение характеристики <b>%.4f</b><br/>", candidateFrame.getSlotBy(ENTERPRISE, Byte.class).getStoredObject().intValue(), info.getEnterpriseFactor(), 100*entInterval.getIntervalRating()/correctionFactor);

Explanation.getInstance().add("Итоговое значение для группы результатов тестирования <b>%.4f x %.4f = %.4f</b><br/>", vacancyFrame.getSlotBy(TESTING_FACTOR, Double.class).getStoredObject(), 100*testOld, 100*testing);

return testing;

}

Размещено на Allbest.ru


Подобные документы

  • Назначение экспертной системы. Разработка экспертной системы путем самостоятельного программирования в полном объеме простейшей ЭС в "GURU". Листинг экспертной системы по прогнозированию на бирже уровня цен, если валютный курс доллара падает или растет.

    лабораторная работа [17,8 K], добавлен 15.01.2011

  • Фреймы как один из распространенных формализмов представления знаний в электронных системах, их классификация и типы, структура и элементы. Иерархические фреймовые структуры и принципы их построения. Код программы Интерфейс. Разработка программного кода.

    лабораторная работа [524,2 K], добавлен 02.11.2013

  • Построение графа связей фактов и определение структуры базы знаний. Описание функций инициализации и констатации фактов, входных и выходных данных. Операции, направленные на занесение фактов и действий в базу знаний. Итоговое представление базы знаний.

    курсовая работа [176,9 K], добавлен 13.11.2012

  • Аналитический обзор системы управления курсами Moodle, программное построение ее модулей. Разработка структурной схемы и базы знаний экспертной системы. Создание дерева вопросов и выбор алгоритма поиска решений. Анализ возможных угроз и защита информации.

    дипломная работа [534,7 K], добавлен 14.12.2013

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

    курсовая работа [1,9 M], добавлен 15.08.2012

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

    контрольная работа [827,5 K], добавлен 14.12.2012

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

    презентация [51,3 K], добавлен 17.10.2013

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

    дипломная работа [3,0 M], добавлен 16.04.2017

  • Понятия, классификация и структура экспертных систем. Базы знаний и модели представления знаний. Механизмы логического вывода. Инструментальные средства проектирования и разработки экспертных систем. Предметная область ЭС "Выбор мобильного телефона".

    курсовая работа [2,2 M], добавлен 05.11.2014

  • Представление знаний в когнитологии, информатике и искусственном интеллекте. Связи и структуры, язык и нотация. Формальные и неформальные модели представления знаний: в виде правил, с использованием фреймов, семантических сетей и нечетких высказываний.

    контрольная работа [29,9 K], добавлен 18.05.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.