Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Safonov / AMPN_Lab2_Knowledge.NET.doc
Скачиваний:
112
Добавлен:
16.04.2015
Размер:
377.86 Кб
Скачать

В.О. Сафонов

АРХИТЕКТУРЫ И МОДЕЛИ ПРОГРАММ И ЗНАНИЙ

Лабораторная работа номер 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.

  1. Поиск и инсталляция системы 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 (создать ярлык), а затем появившийся ярлык “перетащите” мышкой на рабочий стол.

Система готова к запуску.

  1. Запуск и изучение примера “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”.

Соседние файлы в папке Safonov