
- •До практичних занять з курсу технологія створення програмних та інтелектуальних систем
- •9. Оформити звіт, який повинен містити запити та їх результати виконання, а також їх описання відповідно до поставлених завдань.
- •3.2. Налаштування проекту. Створення першої програми.
- •3.3. Основні властивості форми
- •3.4. Власний ScreenSaver
- •Мета роботи: Набуття навичок створення бази даних та використання її за допомогою візуальних компонентів. Використання у програмі зв'язаних таблиць, додавання обчислювальних полів.
- •Контрольні питання та завдання
- •Порядок виконання роботи
- •Приклад створення експертної системи визначення виду рослини за її ознаками
Порядок виконання роботи
1. Побудувати базу знань продукційного типу „якщо ... то ...” згідно предметної області заданого варіанту (див. інд. завдання ) або запропонувати свою область експертизи.
2. Представити систему логічного виведення на основі розроблених правил у вигляді орграфа.
3. Розробити блок-схему алгоритму роботи експертної системи.
4. Реалізувати засобами С++Builder експертну систему.
5. Відлагодити та протестувати систему за допомогою різних тестових прикладів.
6. Продемонструвати роботу експертної системи викладачу.
7. Зробити висновки та внести пропозиції щодо доцільності реалізації експертних систем такого типу.
Індивідуальні завдання для виконання:
Побудувати експертну систему для визначення причини несправності авто.
Побудувати експертну систему для визначення виду тварини за її ознаками.
Побудувати експертну систему для визначення виду риби за її ознаками.
Побудувати експертну систему для діагностики непрацездатності монітора.
Побудувати експертну систему для діагностики типів несправностей принтера.
Побудувати експертну систему для діагностики захворювання.
Побудувати експертну систему для діагностики типів несправностей комп’ютера.
Побудувати експертну систему для діагностики Інтернет з’єднання.
Побудувати експертну систему для діагностики причини відсутності відтворення звуку на комп’ютері.
Побудувати експертну систему для діагностики типів несправностей пилососа.
Приклад створення експертної системи визначення виду рослини за її ознаками
1. База знань.
Якщо клас голонасіневі і форма листка лускоподібна, то сімейство — кипарисові.
Якщо клас голонасіневі і форма листа голкоподібна і конфігурація хаотична, то сімейство — соснові.
Якщо клас голонасіневі і форма листа голкоподібна і конфігурація — 2 рівних ряди і срібляста смуга, то сімейство — соснові.
Якщо клас голонасіневі і форма листа голкоподібна і конфігурація — 2 рівних ряди і сріблястої смуги немає, то сімейство — болотяний кипарис.
Якщо тип — дерева і форма листка широка і плоска, то клас — покритонасіневі.
Якщо тип — дерева і невірно, що форма листа широка і плоска, то клас — голонасіневі.
Якщо стебло зелене, то тип — трав'янисті.
Якщо стебло дерев’янисте і положення, що стелиться, то тип — ліани.
Якщо стебло дерев’янисте і положення пряме і один основний стовбур, то тип — дерева.
Якщо стебло дерев’янисте і невірно, що положення пряме і один основний стовбур, то тип — чагарникові.
Система логічного виведення, представлена у вигляді орграфа 1
3. Опис вершин графа
0 |
Яке стебло у рослини – дерев’янисте чи зелене ? |
1 |
Відповідь: тип - трав'янисті. Питань більше немає. |
2 |
Яке положення стебла - що стелеться чи пряме ? |
3 |
Відповідь: тип - ліани. Питань більше немає. |
4 |
Чи має рослина один основний стовбур ? |
5 |
Чи мають листя широку і плоску форму ? |
6 |
Відповідь: тип - чагарникові. Питань більше немає. |
7 |
Відповідь: клас - покритонасіневі. Питань більше немає. |
8 |
Яка форма листа - лускоподібна або голкоподібна ? |
9 |
Відповідь: сімейство - кипарисові. Питань більше немає. |
10 |
Яку конфігурацію має розташування голок - хаотичну або в 2 ряди ? |
11 |
Відповідь: сімейство - соснові. Питань більше немає. |
12 |
Чи є срібляста смуга знизу голки ? |
13 |
Відповідь: сіймество - болотяний кіпарис Питань більше немає. |
Реалізація в С++Builder
а) Створюємо проект. Проводимо налаштування проекту та зберігаємо в каталозі «Експертна система».
б) Розміщуємо на формі два компоненти «Button» та «Label». Встановлюємо властивості Visible компоненти «Button2» значення false Надаємо заголовок кнопці 1 «Приступити»
в) Присвоюємо Label1 заголовок "Start".
г) Поміщаємо код до кнопок. Відповідно до структури логічного вводу перше запитання експертної системи «Яке стебло у рослини – дерев’янисте чи зелене?» відповідно кнопки повинні містити відповіді:
«Button1» - Деревнисте.
«Button2» - Зелене.
Для цього необхідно кнопці «Button1» надати наступний програмний код:
if (Label1->Caption=="Start" )//умова якщо Label1 має заголовок "Start" то:
{//виконати дію 1
Label1->Visible=True;//показуємо компонент
Label1->Caption=("Какой стебель у растения - древесный или зеленый ?");//заголовок Label1
Button1->Caption="древесный";//присвоюємо заголовок
Button2->Visible=True;//показати кнопку
Button2->Caption="зеленый";//присвоюємо заголовок
}//кінець тіла оператора1
//------***------\\
Далі необхідно помістити дії в результаті натиснення на кнопку відповідь, для цього необхідно накласти умову порівнняння заголовку компонента «Label1» і в випадку коли заголовок "Какой стебель у растения - древесный или зеленый ?" потрібно накласти умову що при відповіді «зелений» експертна система покаже відповідний результат, а в випадку відповіді «деревнистий» продовжить свою роботу. Таким чином необхідно в кнопку 2 яка буде мати заголовок «зелений» додати програмний код:
//------***------\\
if (Label1->Caption=="Какой стебель у растения - древесный или зеленый ?" )//
{//початок тіла оператора2
Button1->Visible=False;//приховуємо Button1 та Button2
Button2->Visible=False;//
Form1->Label1->Caption=("Ответ: тип - травянистые. Вопросов больше нет.");//
}//кінець тіла оператора2
//------***------\\
Та до кнопки 1 яка буде містити заголовок «Дерев’нистий» зразу після завершення тіла оператора 1 необхідно додати наступний програмний код:
else if (Label1->Caption=="Какой стебель у растения - древесный или зеленый ?" )//
{//початок тіла оператора2
// продовжуємо збір інформації
Label1->Caption=("Каково положение стебля - стелящееся или прямостоящее ?");//
Button1->Caption="стелящееся";//присвоюємо заголовок
Button2->Caption="прямостоящее";//присвоюємо заголовок
}//кінець тіла оператора2
Блок-сфема алгоритму експертної системи
6. Код програми
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
//кнопка 1
{//
if (Label1->Caption=="Start" )
{//
Label1->Visible=True;//
Form1->Label1->Caption=("Какой стебель у растения - древесный или зеленый ?");//
Button1->Caption="древесный";//
Button2->Visible=True;//
Button2->Caption="зеленый";//
}//
else if (Label1->Caption=="Какой стебель у растения - древесный или зеленый ?" )//
{//
Form1->Label1->Caption=("Каково положение стебля - стелящееся или прямостоящее ?");//
Button1->Caption="стелящееся";//
Button2->Caption="прямостоящее";//
}//
else if (Label1->Caption=="Каково положение стебля -стелящееся или прямостоящее ?")//
{//
Button1->Visible=False;//
Button2->Visible=False;//
Form1->Label1->Caption=("Ответ: тип - лианы. Вопросов больше нет.");//
}//
else if (Form1->Label1->Caption=="Имеет ли растение один основной ствол ?")//
{//
Label1->Caption=("Имеют ли листья широкую и плоскую форму ?");//
Button1->Caption="да";//
Button2->Caption="нет";//
}//
else if (Form1->Label1->Caption=="Имеют ли листья широкую и плоскую форму ?")//
{//
Label1->Caption=("Ответ: класс - покрытосеменные. Вопросов больше нет.");//
Button1->Visible=False;//
Button2->Visible=False;//
} //
else if (Label1->Caption=="Какова форма листа - чешуеобразная или иглоподобная ?")//
{//
Label1->Caption=("Ответ: семейство - кипарисовые. Вопросов больше нет.");//
Button1->Visible=False;//
Button2->Visible=False;//
}//
else if (Label1->Caption=="Имеют ли листья широкую и плоскую форму ?")//
{//
Form1->Label1->Caption=("Ответ: семейство - кипарисовые. Вопросов больше нет.");//
Button1->Visible=False;//
Button2->Visible=False;//
}//
else if (Label1->Caption=="Какую конфигурацию имеет расположение игл - хаотическую или в 2 ряда ?")//
{//
Form1->Label1->Caption=("Ответ: семейство - сосновые. Вопросов больше нет.");//
Button1->Visible=False;//
Button2->Visible=False;//
}//
else if (Label1->Caption=="Имеется ли серебристая полоса снизу иглы ?")//
{//
Form1->Label1->Caption=("Ответ: семейство - сосновые. Вопросов больше нет.");//
Button1->Visible=False;//
Button2->Visible=False;//
}//
//---------------------------------------------------------------------------
}
//---------------------------------------------------------------------------
//кнопка 2
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (Label1->Caption=="Какой стебель у растения - древесный или зеленый ?" )//
{//
Button1->Visible=False;//
Button2->Visible=False;//
Form1->Label1->Caption=("Ответ: тип - травянистые. Вопросов больше нет.");
}//
else if (Label1->Caption=="Каково положение стебля -стелящееся или прямостоящее ?")//
{//
Form1->Label1->Caption=("Имеет ли растение один основной ствол ?");//
Button1->Caption="да";//
Button2->Caption="нет";//
}
else if (Label1->Caption=="Имеет ли растение один основной ствол ?")//
{//
Button1->Visible=False;//
Button2->Visible=False;//
Form1->Label1->Caption=("Ответ: тип - кустарниковые. Вопросов больше нет.");//
}//
else if (Label1->Caption=="Имеют ли листья широкую и плоскую форму ?")//
{//
Form1->Label1->Caption=("Какова форма листа - чешуеобразная или иглоподобная ?");//
Button1->Caption="чешуеобразная";//
Button2->Caption="иглоподобная";//
}//
else if (Label1->Caption=="Какова форма листа - чешуеобразная или иглоподобная ?")//
{//
Label1->Caption=("Какую конфигурацию имеет расп. игл-хаотическую или в 2 ряда ?");//
Button1->Caption="хаотическую";//
Button2->Caption="в 2 ряда";//
}//
else if(Label1->Caption=="Какую конфигурацию имеет расп. игл-хаот. или в 2 ряда ?")
{//
Form1->Label1->Caption=("Имеется ли серебристая полоса снизу иглы ?");//
Button1->Caption="да";//
Button2->Caption="нет";//
}//
else if (Label1->Caption=="Имеется ли серебристая полоса снизу иглы ?")//
{//
Label1->Caption=("Ответ: сеймество - болотный кипарис Вопросов больше нет.");//
Button1->Visible=False;//
Button2->Visible=False;//
}//
}