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

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


Аннотация к работе
РЕФЕРАТ4.2.

План
Содержание

Список литературы
ПРИЛОЖЕНИЕ А. ИСХОДНЫЙ КОД ОСНОВНЫХ КЛАССОВ

Реферат

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

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

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

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

Среда разработки 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.

Рисунок 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

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

ISLOT GETSLOTBY(String name, Class 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 slots;

public Frame(final int SESSIONID, String name) { this.SESSIONID = SESSIONID;

this.name = name;

this.slots = new THASHMAP();

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 GETSLOTS() { return new ARRAYLIST(slots.values());

}

@SUPPRESSWARNINGS({"unchecked"})

@Override public ISLOT GETSLOTBY(String name, Class clazz) { return (ISLOT)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 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 {

Frame GETFRAME();

void ADDEDTO(Frame frame);

void REMOVEDFROM(Frame frame);

int GETSESSIONID();

void SETSTOREDOBJECT(T NEWVALUE);

Class 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 implements ISLOT { private final Class clazz;

private T STOREDOBJECT;

private Frame frame;

private Method IFADDED;

private Method IFNEEDED;

private Method IFDELETED;

public Slot(Class clazz) { this.clazz = clazz;

}

@Override public Class 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 start(final int SESSIONID, final long VACANCYID) { init(SESSIONID);

final IDENTIFIEDSLOT slot = (IDENTIFIEDSLOT) LABOREXCHANGE.GETSLOTBY(ENGINECONSTANTS.RANGED_CANDIDATES, Map.class);

slot.SETIDENTIFIER(VACANCYID);

return slot.GETSTOREDOBJECT();

} private ISLOT CREATECANDIDATESSLOT() { final ISLOT CANDIDATESSLOT = new Slot(List.class);

CANDIDATESSLOT.SETIFNEEDED(CANDIDATESSLOTMETHODS.GETMETHOD("LOADCANDIDATESSLOTSLIST"));

return CANDIDATESSLOT;

} private ISLOT CREATEVACANCIESSLOT() { final ISLOT VACANCIESSLOT = new Slot(List.class);

VACANCIESSLOT.SETIFNEEDED(VACANCIESSLOTMETHODS.GETMETHOD("LOADALLVACANCIES"));

return VACANCIESSLOT;

} private ISLOT CREATEMAPSLOT() { final ISLOT MAPSLOT = new IDENTIFIEDSLOT(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 slot) { final IDENTIFIEDSLOT RANGEDLIST = (IDENTIFIEDSLOT) slot;

final long VACANCYID = RANGEDLIST.GETIDENTIFIER();

final Frame LABORFRAME = RANGEDLIST.GETFRAME();

final Frame VACANCYFRAME = FINDVACANCYFRAME(VACANCYID, LABORFRAME);

assert (VACANCYFRAME != null);

Explanation.GETINSTANCE().add("Рассматриваем вакансию: %s", VACANCYFRAME.GETSLOTBY(NAME, String.class).GETSTOREDOBJECT());

NORMALIZEVACANCIESFACTORS(VACANCYFRAME);

final Map RANGEDMAP = new THASHMAP();

final ISLOT 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 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("Нормализуем веса группы результатов тестирования: " "Трудолюбие: %.4f"

"Аккуратность: %.4f"

"Интеллект: %.4f"

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

"Предприимчивость: %.4f"

"", indf, af, intf, sf, ef);

} private static void NORMALIZEPROFESSIONALINFOFACTORS(Frame VACANCYFRAME) { final ISLOT 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("Нормализуем веса группы профессиональных качеств: " "Стаж: %.4f"

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

"", ef, uf);

} private static void NORMALIZECOMMONINFOFACTORS(Frame VACANCYFRAME) { final ISLOT 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("Нормализуем веса группы общих сведений: "

"Возраст: %.4f"

"Наличие автомобиля: %.4f"

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

"Наличие детей: %.4f"

"Место проживания: %.4f"

"Пол: %.4f"

"", AF, DF, OF, PF, TF, SF);

} private static void NORMALIZEINFOFACTORS(Frame VACANCYFRAME) { final ISLOT COMMONFACTORSLOT = VACANCYFRAME.GETSLOTBY(COMMON_FACTOR, Double.class);

final ISLOT PROFESSIONALFACTORSLOT = VACANCYFRAME.GETSLOTBY(PROFESSIONAL_FACTOR, Double.class);

final ISLOT 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("Нормализуем веса групп характеристик: "

"Общие сведения: %.4f"

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

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

"", cf, pf, tf);

} private static Frame FINDVACANCYFRAME(long VACANCYID, Frame LABORFRAME) { final ISLOT 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("Рассматриваем кандидата %s %s %s", 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("");

final double professional = COMPUTEPROFESSIONAL(CANDIDATEFRAME, VACANCYFRAME);

Explanation.GETINSTANCE().add("");

final double testing = COMPUTETESTING(CANDIDATEFRAME, VACANCYFRAME);

Explanation.GETINSTANCE().add("");

final double r = common professional testing;

assert (r <= 1);

Explanation.GETINSTANCE().add("Итоговый рейтинг кандидата: %d %d %d = %d", (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("Пол кандидата %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);

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("Стаж кандидата %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);

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("Трудолюбие %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);

return testing;

}

Размещено на .ru
Заказать написание новой работы



Дисциплины научных работ



Хотите, перезвоним вам?