ОтчетАртамоновУльбеков

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ
ИМЕНИ АКАДЕМИКА С.П.КОРОЛЕВА
(НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ)» (СГАУ)
Факультет информатики
Кафедра информационных систем и технологий
Отчет по лабораторной работе №1
по курсу
«Основы экспертных систем»
«ЭС выбора подъемного крана»
Выполнили: студенты группы 6501
Артамонов Ю. С.
Ульбеков А. Д.
Проверил:
ассистент Белоусов А. И.
САМАРА 2012
Задание
Разработать продукционную экспертную систему с четкой логикой по заданному
описанию предметной области. Построить дерево принятия решений, сформулировать
набор правил для решения задачи. Предусмотреть в системе режим эксперта для
просмотра исходных данных и настройки системы, режим консультации для конечного
пользователя и режим справки (сведения о системе, авторах, краткое пояснение по
использованию).
Организовать диалог с конечным пользователем в виде форм меню вопросов и
возможных ответов с подсказками с использованием естественного языка.
По дополнительному запросу выдать подробное объяснение полученного решения
на естественном языке.
Описание предметной области.
Характеристики подъемных кранов задаются таблицей:
Вид подъемного Грузоподъемно Объект
Скорость
Высота
крана
сть, т.
обслуживания
подъема груза, подъема, м
м/мин
Мостовой кран
1-600
Цех, закрытый 1-60
склад,
электростанция
3-50
Настенноконсольный
поворотный
кран
0.1-10
Цех, закрытый 1-200
склад
1-10
Козловой кран
3-1000
Строительный
объект,
электростанция
1-100
2-20
Мостовой
перегружатель
5-300
Электростанция
, речной порт
1-180
1-15
Стреловой
самоходный
кран
8-30
Строительный
1-25
объект, речной
порт
1-60
Башенный кран
10-50
Строительный
1-100
объект, речной
порт
3-150
Портальный
кран
5-300
Строительный
1-90
объект, речной
порт
2-50
2
По значениям параметров указать подходящие модели технического средства
(часть значений пользователь может не знать, в таком случае выводится список средств,
удовлетворяющих первому ответу «не знаю» по дереву принятия решений).
3
Продукционные системы
Экспертная система – это частный случай автоматизированной системы, которая на
основе знаний, представленных той или иной моделью, проводит консультацию с
конечным пользователем для формирования решения или выдачи документации.
Экспертная система состоит из трех основных частей: интерфейса пользователя,
машины
логического
вывода
и
хранящихся
знаний
и
опыта.
Когда
нужно
проконсультироваться с экспертной системой, человек ставит задачу и вступает во
взаимодействие с системой через интерфейс пользователя. Машина логических выводов
экспертной системы – это ПО, которое фактически приводит доказательства,
необходимые для решения задачи. Чтобы сделать свои выводы, ПО использует
хранящиеся знания и опыт. Знания и опыт в какой-то проблемной области
предоставляются в виде набора правил (продукций), представляющие собой просто
совокупность правил. Каждое правило имеет посылку и вывод. Когда машина логических
выводов может установить, что посылка является истинной, тогда она знает, что вывод
тоже является правильным.
Правило – это объем знаний, в котором говорится, какие предпринимать действия
при выполнении определенных условий.
Если во время консультации определяется, что условия верны, то правило
включается. Если же условия правила не удовлетворяются, то действия правила не
выполняются.
Продукции делятся на детерминированные и недетерминированные, среди которых
можно выделить прогнозирующие, вероятностные.
Для логического вывода использовались прямая и обратная цепочки рассуждений.
Соответствующие алгоритмы приведены в приложении.
4
Дерево принятия решений
Переменные:
Грузоподъемность, т. – G
Объект обслуживания – O
Скорость подъема груза, м/мин – S
Высота подъема, м – H
Вид подъемного крана – T.
Язык описания правил является подмножеством языка Groovy.
Дерево принятия решений содержится в приложении.
5
Описание и реализация указаний по использованию
Экспертная система выбора подъемного крана в своем главном меню имеет 2 пункта:
 Файл с подменю «Новая консультация», «Загрузить правила» и «Выход»;
 Помощь с подменю «О программе».
При выборе пункта «Новая консультация» на экране появляется окно для выбора
метода логического вывода.
Рисунок 1 – Выбор метода вывода
После выбора метода вывода на экране появляется вкладка с названием консультации
и поля для ввода пользователем исходных данных.
Рисунок 2 – Вкладка с названием консультации
6
Пользователь вводит исходные данные и, нажимая «Далее», переходит к следующему
вопросу. По окончании ввода исходных данных пользователь завершает консультацию и
на экране появляется сообщение о найденном решении. Для завершения консультации
пользователь
должен
нажать
кнопку
«Завершить»
в
правом
нижнем
углу
соответствующей консультации вкладке.
Рисунок 3 – Результат консультации
После консультации можно просмотреть причину выбора результата, нажав на
кнопку «Причина».
Рисунок 4 – Причина результата консультации
Если пользователь хочет заменить начальный список правил, он может загрузить
новый по своему усмотрению, выбрав пункт меню «Файл» - «Загрузить правила».
Для вывода информации о программе пользователь должен выбрать пункт меню
«Помощь» - «О программе».
7
Рисунок 5 – Окно «О программе»
8
Контрольный пример и результаты испытаний
Определение типа подъемного крана, исходя из различных характеристик.
Для контрольного примера выберем объект обслуживания «Цех», скорость подъема
40, высоту подъема 8 и грузоподъемность 6.
Выбираем объект «Цех».
Рисунок 6 – Выбор объекта «Цех»
Затем нажимаем «Далее» и вводим скорость подъема груза. Скорость подъема груза
равна 40.
Затем нажимаем «Далее» и вводим высоту. Высота равна 8.
Затем нажимаем «Далее» и вводим грузоподъемность. Грузоподъемность равна 6.
9
Рисунок 7 – Ввод скорости подъема груза
Рисунок 8 – Ввод высоты
10
Рисунок 9 – Ввод грузоподъемности
Затем нажимаем на кнопку «Далее». В результате выводится результат консультации
на экран.
По окончании консультации для просмотра причины нажимаем на кнопку
«Причина». Выводится окно с причиной выбора результата консультации.
Рисунок 10 – Причина выбора результата консультации
11
Чтобы закрыть окно текущей консультации нажимаем кнопку «Завершить.
Рисунок 11 – Вывод результата консультации на экран
12
Список использованных источников
1. Дерябкин В.П. Лекции по курсу «Основы экспертных систем». Самара, СГАУ,
2012 г.
2. Fergal Dearle “Groovy for Domain-Specific Languages”. June 2010, 312 p.
13
Приложение А. Блок-схема алгоритма ПЦР
Рисунок А.1 – Блок-схема алгоритма ПЦР
14
Приложение Б. Блок-схема алгоритма ОЦР
Рисунок Б.1 – Блок-схема алгоритма ОЦР
15
Приложение В. Дерево решений
Рисунок В.1 – Дерево принятия решений
16
Приложение Г. Листинг программы
Г.1 Листинг основных алгоритмов
Г1.1 Листинг алгоритма ПЦР
void perform(RuleSet ruleSet) {
int runCount = 0
while (!domainObject.resolved &&
runCount != ruleSet.size) {
for (Rule rule : ruleSet.rules) {
boolean conjValue = true
boolean allValuesResolved = true
def conjIter = rule.ifStatements.iterator()
while (conjValue && conjIter.hasNext()) {
Closure conj = linkClosureToDelegate(conjIter.next(), domainObject)
def conjResult
try {
conjResult = conj.call()
} catch (CannotInputVariableException ignored) {
allValuesResolved = false
break
}
if (conjResult instanceof Boolean)
conjValue = conjResult
else if (conjResult != null)
throw new RuleStatementException(rule.name)
}
if (allValuesResolved && conjValue) {
17
Closure thenClosure = linkClosureToDelegate(rule.thenStatement,
domainObject)
thenClosure.call()
if (domainObject.resolved) {
domainObject.reason = rule.reason
break
}
}
}
runCount++
}
if (!domainObject.resolved)
throw new UnresolvedRuleSystemException()
}
Г1.2 Листинг алгоритма ОЦР
void perform(RuleSet ruleSet) {
Set<Rule> badRules = new HashSet<Rule>();
Rule previousRule = null
while (!variablesStack.isEmpty()) {
List<Rule> withRule = new LinkedList<Rule>()
boolean newTargetVariable = false
boolean ruleFound = false
for (Rule r : ruleSet.rules) {
//add rules with current top stack variable to withRule set
if (r.getTargetVariables().contains(variablesStack.peek())) {
withRule.add(r)
}
}
withRule.removeAll(badRules)
if (!withRule.isEmpty()) {
def rule = null
def itR = withRule.iterator()
while (!ruleFound && itR.hasNext() && !newTargetVariable) {
rule = itR.next()
boolean conjValue = true
18
def it = rule.ifStatements.iterator()
while (conjValue && it.hasNext()) {
Closure conj = linkClosureToDelegate(it.next(), domainObject)
def conjResult
try {
conjResult = conj.call()
} catch (CannotInputVariableException ignored) {
newTargetVariable = true
badRules.add(rule)
previousRule = rule
ruleFound = false
break
}
if (conjResult instanceof Boolean)
conjValue = conjResult
else if (conjResult != null)
throw new RuleStatementException(rule.name)
}
if (!newTargetVariable && conjValue) {
badRules.remove(previousRule)
ruleFound = true
previousRule = rule
}
}
if (!newTargetVariable && ruleFound && rule != null) {
Closure thenClosure = linkClosureToDelegate(rule.thenStatement, domainObject)
thenClosure.call()
if (domainObject.resolved)
domainObject.reason = rule.reason
}
}
if (!newTargetVariable && !ruleFound) {
variablesStack.pop();
}
}
if (!domainObject.resolved)
throw new UnresolvedRuleSystemException()
}
19
Download