Министерство образования и науки Российской Федерации Федеральное агентство по образованию Московский Государственный Институт Электроники и Математики (Технический Университет) Факультет Электроники Кафедра Автоматизации и Интеллектуализации Процессов Управления В.Г.Подлесных Методические указания к выполнению курсовой работы по дисциплине “Экспертные системы” Москва 2006 1 Цель курсовой работы Целью выполнения КР является практическое освоение различных моделей представления знаний и инструментальных средств при разработке небольших прототипов экспертных систем (ЭС). Постановка задачи проектирования Постановка задачи зависит от выбора одного из следующих направлений выполнения КР: Разработка мини ЭС в среде Visual Prolog 5.2 на основе расширенных задач текущего лабораторного практикума. Здесь используется логическая модель представления знаний и ее расширения. Хорошим примером является реализация “жадного алгоритма” поиска пути в пространстве состояний в игре – головоломке “восьмерка”. Среда Visual Prolog обладает необходимым ресурсом для решения данной задачи с максимальным числом ходов до 9!/2. Необходимо только чтобы исходная и целевая позиции находились в одном полупространстве (полное пространство состояний 9!). Ниже будут приведены необходимые сведения по проектированию в среде Visual Prolog. Конкретной задачей проектирования по этому направлению является расширение исходной программы на Прологе до уровня мини ЭС и реализация удобного интерфейса с возможностью задания условий поиска, ведения диалога и вывода на экран полученных результатов. Разработка (модернизация) мини ЭС с использованием созданной на кафедре инструментальной оболочки IMP. Оболочка работает в среде Turbo Prolog и позволяет создавать ЭС с нечеткой логикой и при этом количественно оценивать и сравнивать между собой выдвигаемые гипотезы. Задачей КР может быть перенесение IMP в среду Visual Prolog для создания более удобного интерфейса. Можно создать и свою ЭС. Хорошим примером является ЭС “Консультант по инвестициям”, подобно которой можно разработать свои правила для выбранной предметной области. Разработка мини ЭС продукционного, объектно-продукционного или логического типа в среде CLIPS. Основой для выполнения служат знания, приобретаемые при выполнении лабораторной работы № 1.9, а также параллельно при выполнении лабораторных работ по курсу “Моделирование систем”, где изучается имитационная объектно-продукционная модель на языке CLIPS. Все необходимые пояснения по языку и среде CLIPS изложены в Методических указаниях. Краткие теоретические сведения В области разработки экспертных систем существуют два основных направления: 1) классическое, основанное на возможности представления знаний в символьном виде и манипуляции символами в процессе вывода решений; 2 2) нейросетевое, основанное на способности искусственной нейронной сети самообучаться решению задач распознавания образов. В нашем случае рассматривается только первое направление, позволяющее дать следующее определение понятию “экспертная система”: ЭС – это интеллектуальная прикладная программная система, ядром которой служит база знаний (БЗ) и которая предназначена для получения аргументированных логических заключений в слабо формализованных предметных областях (ПО), где неприменимы вычислительные модели, а решения принимаются на основе экспертизы (медицина, военное дело, бизнес, финансы, планирование инвестиций, поиск полезных ископаемых, управление сложными диспетчерскими пультами, расшифровка сигналов и многое другое). Основной признак классической символьной ЭС – наличие БЗ, написанной на специальных языках, близких к естественному. БЗ отображает модель ПО и способ принятия в ней решений, поэтому содержит декларативную и процедурную части. Декларативная часть отображает концептуальное построение ПО, основные понятия, факты, их иерархию (от более общих состояний к конкретным), т.е. вертикальные связи, а также горизонтальные сетевые связи (отношения) между сущностями, участвующими в реализации различных сценариев поведения ПО. Процедурная часть содержит механизм сопоставления образцов и вывода логических заключений (машину логических выводов – МЛВ). Знания в БЗ можно представить в виде правил логической импликации: <заключение> :- <условие1, условие2,….условиеn >. Логическая модель имеет строгую сетевую структуру, и само написание правил уже означает неявную компиляцию сети, не допускающую пропусков в определениях текущих подцелей. Такая система, по существу, занимается доказательством теоремы, позволяющей установить истинность заключения при определенной интерпретации переменных. Средством реализации подобных моделей служат языки и среды логического программирования Turbo Prolog и Visual Prolog. В этих языках существует также возможность расширения логической модели для работы с нечеткой логикой и сравнения между собой различных выдвигаемых гипотез по вычисляемому коэффициенту определенности (аналогу вероятности). Другой распространенной моделью представления знаний является продукционная, также основанная на правилах. Но в данном случае эти правила логически не связаны между собой, не зависимы, не могут вызывать друг друга и не образуют сети. Правила продукции активизируются по ситуации, которая распознается по текущим фактам. Для этого левая часть всех правил содержит образцы или шаблоны запросов к данным. Активизироваться могут только те правила, условия которых (образцы) удовлетворяются текущими фактами из списка фактов. При возможности одновременного срабатывания сразу нескольких правил вступает в действие стратегия разрешения конфликтов – выбираемый пользователем план решения задачи. Приоритет правила определяется либо по “свежести” активизирующего его факта (все факты снабжаются временным тегом – индексом), либо с помощью объявления относительного приоритета, который может быть как константой, так и вычисляемым выражением. Это создает возможности для недетерминированного поиска “неожиданных ”решений под управлением текущих данных. В любом случае правила разрешения конфликтов и выбор стратегии поиска (в глубину, в ширину или иной) должны быть продуманы разработчиком системы Понятие мини экспертной системы Создание полномасштабной практически полезной ЭС – очень сложная задача, требующая привлечения специалистов как минимум трех областей знаний: эксперта ПО, инженера по знаниям и прикладного программиста. Такая система должна содержать БЗ, 3 МЛВ, рабочую стековую память, подсистему организации диалога для внесения недостающих фактов по ходу решения задачи, компонент приобретения знаний в соответствии с принятой моделью представления и объяснительный компонент. Последний позволяет проследить ход рассуждений ЭС для сравнения с экспертным решением, т.е. убедиться в разумности вывода и предложенной машиной рекомендации. Мини ЭС, во-первых, может не содержать компонентов приобретения знаний и объяснения, во-вторых, число правил можно ограничить на уровне 10 – 20. Вместо объяснительного компонента можно использовать режим трассировки в Прологе или режим пошагового выполнения программы в среде CLIPS. Технология разработки программ в среде Visual Prolog 5.2 Назначение этого раздела состоит в облегчении студенту задачи написания программы в среде Visual Prolog 5.2. При его составлении не ставилось задачи описания методов программирования на Turbo Prolog, применяемых при написании программ и на Visual Prolog, так как предполагается, что студент, приступивший к написанию программы на Visual Prolog, освоил Turbo Prolog достаточно хорошо. Описывается технология адаптации кода программы на Turbo Prolog и внедрение его в среду Visual Prolog. Так как речь идет об адаптации кода программы на Turbo Prolog к среде Visual Prolog, желательно иметь код отлаженной программы на Turbo Prolog. Этот код подвергнется незначительным изменениям и составит логику работы новой программы, Visual-среда позволит реализовать интерфейс. Ниже рассматривается процесс проектирования, представляющий собой последовательность шагов, приводящую к созданию приложения в среде Visual Prolog, и сопровождается иллюстрациями. Несмотря на то, что описывается создание довольно простой программы, рассмотрение более сложных задач не должно составить дополнительных сложностей, так как описывается не логика работы программы, а лишь привязка ее к интерфейсу. 1. Постановка задачи Требуется написать программу, осуществляющую поиск пути в дереве, применяя алгоритм обратного поиска. Labl_l.pro domains top=symbol list=symbol* predicates edge(top,top) rev_search (top, top, list) clauses /*обратный поиск*/ 4 rev_search(X,X,[X]):-!. rev_search(X,Y,[Y|P]):-edge(Z,Y),rev_search(X,Z,P). edge(a,c). edge(c,f). edge(f,h). edge(f,i). edge(c,g). edge(a,d). edge(d,j). 2. Создание проекта Разработка программы начинается с создания проекта. Для него должна быть создана новая папка. Здесь не следует соглашаться с папкой, предложенной по умолчанию Visual Prolog’ом. В данном примере была создана папка MyProject на диске D: (D:\MyProjeci).. Создается новый проект: Project -> NewProject. Появится окно Application Expert, в котором задаются параметры создаваемого проекта. 5 Вносить изменения следует только на вкладке General. Project Name - название проекта. Оно совпадет с названием программы. Наш проект будет называться MyProject. Ввести название проекта, после чего щелкнуть левой кнопкой мыши в поле Name of VPR File: -автоматически создастся имя файла проекта (в данном случае MyProjecl.vpr). В поле Base Directory нужно изменить содержащийся там путь на путь к созданной для проекта директории (C:\MyProject). Нажать Create. Проект будет создан. 6 Для того чтобы VP поддерживал русский язык надо войти в Options -> Global -> Environment. Выбрать Editor Windows -> Change Font и установить значение Набор символов в Кириллический. Нажать ОК. Уже можно запустить программу проекта на исполнение. Для этого надо нажать кнопку на панели, или нажать F9 на клавиатуре или воспользоваться меню Project -> Run. Программа MyProject запустится, но интерфейс, созданный для нее Visual Prolog'oм, не функционален и не подходит под цели создаваемой программы, поэтому подлежит доработке. 7 3. Создание меню Рассмотрим цель создания своего пункта меню. Ввод-вывод данных и элементы управления создаваемой программы (кнопки запуска и закрытия создаваемой программы, например) должны располагаться на отдельной форме (окне Windows), называемой в терминологии Visual Prolog диалогом. Диалог нужно создать, но об этом позже. Сначала надо обеспечить возможность его запуска. Для этой цели нужно создать пункт меню, при выборе которого диалоговое окно будет появляться на экране. После создания проекта появится окно Инспектора объектов. В левой колонке кнопок нажать Menu. Единственное меню, отображаемое в окне, называется Task Menu. Это то самое меню, которое можно видеть при запуске программы на исполнение. Оно стандартное (Visual Prolog создает его автоматически при создании проекта), состоит из пунктов File, Edit, Window, Help и не функциональное (Edit не работает полностью, File предоставляет возможность только завершения работы программы). Задача заключается в его доработке. Чтобы переименовать меню надо щелкнуть на Attribute из правой колонки кнопок. 8 Появится окно Menu Attributes. Поля Name - имя меню: Constant - константа меню. Имя - это осмысленное название объекта, к которому предъявляются не столь жесткие требования (например, присутствие пробелов в имени не запрещено). Имя присваивается такое, чтобы по нему можно было легко определить о каком именно объекте идет речь. В рассматриваемом примере задается имя МуМепи, то есть меню, созданное нами вручную, а не стандартное, используемое Visual Prolog'oM по умолчанию. Просто и понятно. Константа - это имя объекта, через которое будет происходить обращение к объекту из кода программы. Оно начинается префиксом (для объекта типа "меню" используется префикс idr) и не должно содержать пробелов, специальных знаков, букв, отличных от латиницы и т.д. В рассматриваемом примере задается константа idr_MyMenu. Когда в коде потребуется обратиться к данному меню следует употреблять idr_MyMenu. 9 Теперь надо создать свой пункт меню, который будет отвечать за запуск создаваемой программы. Для наглядности создадим двухуровневое меню. Корневой уровень будет называться MyProgram, на следующем уровне расположатся два пункта Start и Exit. Чтобы редактировать меню в окне Инспектор объектов надо щёлкнуть на Edit из правой колонки кнопок. Появится окно. Добавим свой пункт меню. Для этого следует нажать кнопку New, появится окно Menu Item Attributes. Задать Имя и константу корневого уровня. Нажать ОК. 10 Затем создаются пункты второго уровня меню. Для этого в окне Редактирование меню надо нажать кнопку Submenu..., Constant Prefix изменяется на idMyProgram. Точно также создать пункты Start (с константой id_MyProgram_Start) и Exit (с константой idMyProgramExit). 11 Для выхода в главное меню нажать клавишу Back. Меню создано, чтобы его сохранить, нужно обязательно нажать Close, иначе ничего не сохранится! На вопрос "Save contents in resource Меню?" отвечать "Yes"0. В результате выполненных действий при запуске программы можно видеть созданный пункт меню, не несущий пока функциональной нагрузки. 4. Создание диалога Теперь необходимо создать диалог - экранную форму с элементами управления и ввода-вывода информации. Для этого в «Инспекторе объектов» выбрать Dialog, нажать New. 12 Появится окно «Атрибуты диалога». Поля Name (имя диалога), Constant (константа, присваиваемая диалогу для обращения из кода), Title (заголовок диалога, отображаемый на экране при запуске программы) следует заполнить. 13 Появится новое диалоговое окно. Стандартные элементы (кнопки) следует удалить и создать свои. Для этого, используя технологию drag-and-drop, осуществить перенос кнопки с панели инструментов Controls на форму MyDlg, создав тем самым свою кнопку. Текст на кнопке - Вывести путь, константа - idc_start. Используя технологию drag-and-drop, осуществить перенос кнопки с панели инструментов Controls на форму MyDlg. Повторить операцию два раза, создав тем самым окна ввода текста idc_begin и idc_end. Их назначение - ввод пользователем Начальной и Конечной вершины, соответственно. В поле Text указать начальную и конечную вершины существующего пути, что предотвратит ошибку работы программы, если пользователь сразу после запуска нажмет кнопку Вывести путь. 14 Используя технологию drag-and-drop, осуществить перенос кнопки с панели инструментов Controls на форму MyDlg. Повторить операцию три раза, создав тем самым статичные надписи: Начальная вершина, Конечная вершина, Путь. Используя технологию drag-and-drop, осуществить перенос кнопки 15 с панели инструментов Controls на форму MyDlg, создав тем самым многострочный список для вывода ответа - пути из одной заданной вершины в другую. В результате экранная форма создаваемой программы будет иметь следующий вид: 5. Привязка диалога к меню Для осуществления привязки диалога к кнопкам меню следует воспользоваться окном инспектора объектов. В нем нажать кнопку Модуль, выделить название проекта (MyProject.pro) и нажать кнопку Code Expert. 16 На экране появится окно Dialog and Window Expert. Выполнить следующие настройки: - Dialog or Window Selection = Window - Event Type = Menu - Event of Item = id_MyProgram_Start (константа пункта меню, отвечающего за запуск приложения); Нажать кнопку Add Clause Затем на ту же кнопку, изменившую название на Edit clause. 17 На экране появится код программы, сгенерированный средой Visual Prolog. Курсор установлен в том месте процедуры, выполняющей действия при срабатывании пункта меню id_MyPrograra_Start, куда должен дописываться код, реализующий алгоритм выполнения функции данного пункта меню. Это код процедуры, сгенерированный средой Visual Prolog: %BEGIN Task Window, id_MyProgram_Start task_win_eh(_Win,e_Menu(id_MyProgram_Start,_ShiftCtlAlt),0):-!, ! %END Task Window, id_MyProgram_Start Его следует доработать следующим образом: %BEGIN Task Window, id_MyProgram_Start task_win_eh(_Win,e_Menu(id_MyProgram_Start,_ShiftCtlAlt),0):-!, dlg_MyDIg_create(_Win), %END Task Window, id_MyProgram_Start Эта стандартная команда инициирует запуск диалога MyDlg. Если бы диалог имел другое имя, то вместо MyDlg в команду было бы вписано то имя, которое ему присвоено. После изменения кода окно редактора кода следует закрыть, а на вопрос Save contents to filename <файл проекта>? Ответить утвердительно. Теперь следует осуществить привязку созданного ранее диалога к проекту. 18 В окне Dialog and Window Expert выполнить следующие настройки: - Dialog or Window Selection = Dialog | MyDlg - Place Source Code in... = MyProject.pro Нажать кнопку OK. После изменения кода окно редактора кода следует закрыть, а на вопрос Insert default code for <имя диалога> in module <фаж проекта>? Ответить утвердительно. 19 Теперь программу можно запустить и убедиться в том, что пункт меню отвечающий за вызов программы работает. Пункт меню Exit дорабатывается таким же образом. Команда на завершение работы приложения выглядит так: win_Destroy(_Win), 6. Написание кода программы Следующим шагом следует добавить текст программы к кнопкам диалога. На данном этапе производится связывание элементов интерфейса с переменными, и вызыв аются предикаты, выполняющие алгоритм с применением таких переменных. В окне Dialog and Window Expert выполнить следующие настройки: - Dialog or Window Selection = Dialoig | MyDlg - Event Type = Control - Event of Item = pb: idc_ Start (Константа кнопки, отвечающей за реализацию алгоритма приложения; нажатие на эту кнопку будет запускать поиск решения); Нажать кнопку Add Clause, затем Edit Clause.Появится окно редактирования текста, и курсор будет в той функции, где надо добавлять текст. Текст до внесения изменений выглядит так: 20 %BEGIN MyDlg, idc_start Ctllnfo dlg_mydlg_eh(_Win,e_Control(idc_start,_CtrlType,_CtrlWin,_CtlInfo),0):-!, %END MyDlg, idc_start _CtlInfo Изменить необходимо следующим образом: %BEGIN MyDlg, idc_start _CtlInfo dlg_mydlg_eh(_Win,e_Control(idc_start,_CtrlType,_CtrlWin,_CtlInfo),0):-!, Sl_h=win_GetCtIHandle(_Win,idc_Begin), S2_h=win_GetCtlHandle(_Win,idc_End), Otv_h=win_GetCtlHandle(_Win,idc_Path), Sl=win_GetText(Sl_h), S2=win_GetText(S2_h), lbox_clear(Otv_h), rev_search(Sl,S2,Otv), printlist(Otv,Otv_h), I %END MyDlg, idc_start _CtlInfo Рассмотрим внесенные изменения. Строки Sl_h=win_GetCtlHandle(_Win,idc_Begin), S2_h=win_GetCtlHandle(_Win,idc_End), OtvJi=win_GetCtlHandle(_Win,idc_Path), связывают переменные Sl_h, S2_h, Otvji с элементами экранной формы idc Begin, idc_End, idcJPath соответственно. Теперь для того, чтобы ввести или вывести текст в окно редактирования idc edit следует обратиться к переменной S l h . Строки Sl=win_GetText(Sl_h), S2=win_GetText(S2_h), Выполняют функции ввода значения (текста) из SJ_h и S2_h в переменные SJ и S2 соответственно. Функция, реализующая алгоритм поиска (rev_search) работает с этими переменными. Строка lbox_clear(Otv_h), очищает окно вывода результата Path "обнуляя" значение переменной Otvh, через которую осуществляется работа с этим окном. Строка rev_search(Sl,S2,Otv), вызывает функцию поиска решения rev_search. SI и S2 - входные значения начальной и целевой вершин; Otv - список пути. Строка printlist(0tv,0tv_h), вызывает функцию, осуществляющую вывод ответа в соответствующий элемент экранной формы (диалога). Дело в том, что список путей надо выводить поэлементно - по одной вершине на каждую строку списка строк экранной формы. Так как результат Otv приходит из rev_search в виде списка, то возникает потребность, отсекая голову, выводить ее в форму через связующую переменную Otvh, передаваемую для этой цели в printlist как параметр, а затем повторять ту же операцию с хвостом списка. 21 На следующем этапе описываются предикаты, выполняющие поиск решения в приложении. Текст вписывается в самое начало программы сразу после последнего include (выделен жирным шрифтом): /******************************************************************** Copyright (c) My Company Project: MYPROJECT FileName: MYPROJECT.PRO Purpose: No description Written by: Visual Prolog Comments: *******************************************************************/ include “myproject.inc” include “myproject.con” include “hlptopic.con” domains top = symbol list = symbol* predicates nondeterm edge(top,top) nondeterm rev_search(top,top,list) nondeterm printlist(list,window) clauses rev_search(X,X,[X]):-!. rev_search(X,Y,[Y|P]):-edge(Z,Y),rev_search(X,Z,P). edge(a,c). edge(c,f). edge(f,h). edge(f,i). edge(c,g). edge(a,d). edge(d,j). printlist([],Otv_h):-!. printlist([H|T],Otv_h):-lbox_Add(Otv_h,-1,H),printlist(T,Otv_h). %BEGIN_WIN Task Wndow /***************************************************************** Event handling for Task Window *****************************************************************/ predicates task_win_eh : EHANDLER … Как можно видеть, сам текст программы, взятой из Turbo Prolog почти ничем не отличается от того, что представлен Вашему вниманию. 1. В разделе описания предикатов перед именем предиката добавлено nondeterm; 2. Добавлен новый предикат printlist, осуществляющий вывод ответа; 22 3. Стандартный предикат lbox_Add выводит в следующую свободную строку (-1) списка строк (Otv_h) значение переменной Н; Другим изменениям текст не подвергался. Можно запускать программу на исполнение. Ориентировочный список тем для КР По направлению 1: “Разработка мини ЭС” с графическим интерфейсом в среде Visual Prolog 5.2 с возможностью внесения изменений в список фактов. 1.Поиск пути в конечном пространстве состояний, заданном различными типами графов (по заданиям № 1.1, 1.2, 1.3 лабораторного практикума) 2. Поиск пути в конечном пространстве состояний, заданном бинарными графами с ключами у вершин (по задания № 1.4, 1.5) 3. Поиск пути в конечном пространстве состояний в ширину (по заданиям 1.6, 1.7) 4. Поиск кратчайшего пути в конечном пространстве состояний методом в ширину (по заданию № 1.8) 5. Поиск списка содействующих реакций и используемых при этом веществ (по заданию № 2.1) 6. Поиск способа получения конечного продукта химического синтеза (по заданию № 2.2). 7. Выбор варианта химического синтеза по критерию допустимой стоимости (по заданию № 2.3). 8. Выбор варианта химического синтеза по критерию минимальной стоимости (по заданию № 2.4). 9. Поиск пути трансформации позиций в продукционной модели (по заданию № 3.1). игре восьмерка на основе 10. То же, на основе компактной процедурной модели перестановок позиций (по заданию № 3.2). 11. ЭС по составлению расписаний учебных занятий студента (по заданию № 4.) 12. ЭС классификации (распознавания) животного на основе бинарной семантической сети представления знаний (по заданию № 5.3). По направлению 2: “Разработка мини ЭС в оболочке IMP” 13. ЭС “Консультант по инвестициям”. 14. ЭС диагностики состояния автомобиля. 23 15. Перенесение оболочки IMP в среду Visual Prolog 5.2 с разработкой графического интерфейса для программы “Консультант по инвестициям”. По направлению 3: “Разработка мини ЭС в среде CLIPS”. 16. Поиск пути в конечном графе пространства состояний (по заданию № 1.9 и 1.3). 17. ЭС диагностики состояния автомобиля (на примере ЭС AutoExpert) 24