
В.О. Сафонов
АРХИТЕКТУРЫ И МОДЕЛИ ПРОГРАММ И ЗНАНИЙ
Лабораторная работа номер 2.
Практическое освоение методов представления и обработки знаний
и системы Knowledge.NET
Цель работы
Целью лабораторной работы является практическое освоение системы Knowledge.NET (http://www.knowledge-net.ru) – расширения языка C# средствами представления знаний для платформы Microsoft.NET, разработанной в СПбГУ коллективом под руководством проф. В.О. Сафонова и используемой в настоящее время в России и в зарубежных странах.
Выражаю надежду, что публикация данной лабораторной работы в составе курса “Архитектуры и модели программ и знаний” послужит широкому распространению в России системы Knowledge.NET и современных методов управления знаниями и их интеграции с методами инженерии программ.
Теоретический материал по представлению знаний и системе Knowledge.NET дан в лекциях 23-31 данного курса и в статьях, указанных в списке литературы.
Программные инструменты, необходимые для лабораторной работы
- Операционная система Microsoft Windows XP + Service Pack 3
- Microsoft Visual Studio.NET 2005.
-
Поиск и инсталляция системы Knowledge.Net и примеров экспертных систем
Информация о проекте Knowledge.NET, исходные коды, дистрибутив и примеры использования системы опубликованы на сайте:
http://www.knowledge-net.ru
Найдите на сайте проекта дистрибутив системы по следующей ссылке:
http://knowledge-net.ru/downloads/KnowledgeNET_May_2007.zip
а также примеры использования системы Knowledge.NET (экспертные системы, разработанные в этой системе) по следующей ссылке:
http://knowledge-net.ru/downloads/KnowledgeNET_examples_May_2007.zip
Скачайте эти файлы в рабочую директорию и распакуйте любым архиватором, например, WinZip или WinRar.
В результате в рабочей директории окажутся два инсталляционных файла (.msi):
-
KnowledgeNET_May_2007.msi – дистрибутив для инсталляции системы Knowledge.NET;
-
KnowledgeNET_examples_May_2007 – дистрибутив для инсталляции примеров.
Инсталлируйте теперь сначала систему Knowledge.NET, а затем – примеры, следуя простым указаниям инсталляторов.
Для удобства дальнейшей работы с системой Knowledge.NET, выведите на рабочий стол “иконки” всех трех примеров, поставляемых с ней.
Для этого выберите пункт основного меню:
Start / All Programs / Knowledge.NET / Examples,
и Вы увидите три названия примеров:
- CottagePriceCalculator.sln – экспертная система оценки стоимости коттеджа;
- GlassExpert.sln – экспертная система оценки качества стекла;
- Sample of Expert System 1 (Math).sln – экспертная система оценки знаний студента по математике.
Для каждой из них выполните следующие действия:
Перейдите на название системы, нажмите правую кнопку мышки, выберите пункт контекстного меню Create Shortcut (создать ярлык), а затем появившийся ярлык “перетащите” мышкой на рабочий стол.
Система готова к запуску.
-
Запуск и изучение примера “Sample of Expert System 1 (Math)
Для запуска примера с указанным именем сделайте двойной щелок мышкой на его иконке на рабочем столе.
В результате вызовется Visual Studio.NET 2005 с расширением (add-in) – системой Knowledge.NET (Рис. 1).
Рис. 1. Окно Visual Studio.NET 2005 с системой Knowledge.NET
Перед Вами – действующий пример простой экспертной системы, разработанной в системе Knowledge.NET и доступной Вам в привычной и удобной для Вас среде разработки – Microsoft Visual Studio.
Прежде всего, оцените различие в нашем подходе с подходом, реализованным в любой другой системе для разработки интеллектуальных решений, например, системы Protégé с языком определения онтологий OWL. Другие системы существуют как изолированные, требуют особых теоретических знаний и совершенно друго стиля мышления и программирования.
Наша же система Knowledge.NET доступна Вам с помощью повседневных и привычных средств разработки – Visual Studio, редактор, окно для визуализации текущего открытого решения (solution). Даже открытый исходный код экспертной системы frmMain.expert очень похож на обычный код C#.
Обратите внимание, что окно для управления системой Knowledge.NET открылось автоматически, как часть графического интерфейса Visual Studio.
Приведем полностью исходный код экспертной системы для оценки знаний студентов по математике:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace Sample_of_Expert_System_1__Math_
{
public enum Answers {Yes, No};
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private string[] Answers1 = {"Yes", "No"};
private Sample_of_Expert_System_1__Math_.Question question1;
private Sample_of_Expert_System_1__Math_.Question question2;
private Sample_of_Expert_System_1__Math_.Question question3;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox txtDecision;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.question1 = new Sample_of_Expert_System_1__Math_.Question();
this.question2 = new Sample_of_Expert_System_1__Math_.Question();
this.question3 = new Sample_of_Expert_System_1__Math_.Question();
this.txtDecision = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// question1
//
this.question1.AnswerIndex = -1;
this.question1.Items = new string[] {
"Yes",
"No"};
this.question1.Location = new System.Drawing.Point(8, 16);
this.question1.Name = "question1";
this.question1.QuestionValue = "Did student score less than 50%?";
this.question1.Size = new System.Drawing.Size(456, 24);
this.question1.TabIndex = 0;
//
// question2
//
this.question2.AnswerIndex = -1;
this.question2.Items = new string[] {
"Yes",
"No"};
this.question2.Location = new System.Drawing.Point(8, 40);
this.question2.Name = "question2";
this.question2.QuestionValue = "Did student score more than 50% and less than 80%?";
this.question2.Size = new System.Drawing.Size(456, 24);
this.question2.TabIndex = 1;
//
// question3
//
this.question3.AnswerIndex = -1;
this.question3.Items = new string[] {
"Yes",
"No"};
this.question3.Location = new System.Drawing.Point(8, 64);
this.question3.Name = "question3";
this.question3.QuestionValue = "Did student score above 80%?";
this.question3.Size = new System.Drawing.Size(456, 24);
this.question3.TabIndex = 2;
//
// txtDecision
//
this.txtDecision.BackColor = System.Drawing.Color.Khaki;
this.txtDecision.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txtDecision.Location = new System.Drawing.Point(8, 96);
this.txtDecision.Name = "txtDecision";
this.txtDecision.Size = new System.Drawing.Size(360, 20);
this.txtDecision.TabIndex = 3;
this.txtDecision.Text = "";
//
// button1
//
this.button1.Location = new System.Drawing.Point(376, 96);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(88, 23);
this.button1.TabIndex = 4;
this.button1.Text = "Get decision";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(472, 122);
this.Controls.Add(this.button1);
this.Controls.Add(this.txtDecision);
this.Controls.Add(this.question3);
this.Controls.Add(this.question2);
this.Controls.Add(this.question1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Name = "Form1";
this.Text = "Questionnaire ";
this.Load += new System.EventHandler(this.Form1_Load);
this.Deactivate += new System.EventHandler(this.Form1_Deactivate);
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
try
{
CSharpExpert.loadKnoweldgeBase();
} catch (System.IO.FileNotFoundException exc)
{
CSharpExpert.firstStart();
}
if (Ivanov.scoreLess50)
question1.AnswerIndex = 0;
else
question1.AnswerIndex = 1;
if (Ivanov.scoreMore50AndLess80)
question2.AnswerIndex = 0;
else
question2.AnswerIndex = 1;
if (Ivanov.scoreMore80)
question3.AnswerIndex = 0;
else
question3.AnswerIndex = 1;
txtDecision.Text = Ivanov.decision;
}
private void button1_Click(object sender, System.EventArgs e)
{
if (question1.AnswerIndex == 0)
Ivanov.scoreLess50 = true;
else
Ivanov.scoreLess50 = false;
if (question2.AnswerIndex == 0)
Ivanov.scoreMore50AndLess80 = true;
else
Ivanov.scoreMore50AndLess80 = false;
if (question3.AnswerIndex == 0)
Ivanov.scoreMore80 = true;
else
Ivanov.scoreMore80 = false;
Ivanov.decision = "";
((ScoreAdviser)CSharpExpert.getRulesetFrame("ScoreAdviser")).initContext("Ivanov");
ProductionSystem.consult ("ScoreAdviser", "decision");
txtDecision.Text = Ivanov.decision;
}
private void Form1_Deactivate(object sender, System.EventArgs e)
{
CSharpExpert.saveKnoweldgeBase();
}
}
}
#frames
frame class Student
{
instance_slots
bool scoreLess50=false;
bool scoreMore50AndLess80=false;
bool scoreMore80=false;
string decision="";
}
frame instance Ivanov
{
own_slots
is_a Student;
}
frame ruleset ScoreAdviser
{
own_slots
context instance Student;
goal decision;
rule
{
if (scoreLess50==true)
then
{
decision = "Reteach number concepts";
}
}R1;
rule
{
if (scoreMore50AndLess80==true && scoreLess50==false)
then
{
decision = "Additional practice";
}
}R2;
rule
{
if (scoreMore80==true && scoreMore50AndLess80==false && scoreLess50==false)
then
{
decision = "Begin double digit math.";
}
}R3;
}
Значительная часть исходного кода (до слова #frames) – это обычный код на C#, управляющий экранной формой для диалога с системой (рис. 2), в которую требуется ввести три ответа на вопросы:
- Выполнил ли студент менее чем 50% заданий?
- Выполнил ли студент более 50%, но менее 80% заданий?
- Выполнил ли студент более 80% заданий?
Код, начинающийся со слова #frames – это представление знаний (в виде набора правил), реализующих логику решения данной задачи и выдачу экспертной оценки знаний экспертной системой.
Рис. 2. Экранная форма для работы с экспертной системой
оценки знаний студента по математике
Для того, чтобы начать работать с экспертной системой, необходимо ее запустить. Самый простой способ сделать это – нажать кнопку Start Debugging, зеленый треугольник в средней части основного меню. Это вызовет сборку (build) экспертной системы и затем - ее запуск, о чем свидетельствует появление экранной формы (рис. 2).
Ответы на вопросы вводятся преподавателем с помощью выбора Yes или No в элементе управления CheckBox в правой части формы, напротив соответствующего вопроса.
Нажатие кнопки Get decision (принять решение) вызывает ответ экспертной системы, который она помещает в нижнюю часть формы, подсвечивая его светло-бежевым цветом.
По окончании работы с экспертной системой необходимо выйти из формы, нажав красную кнопку “X”.