Национальный исследовательский институт
Московский Энергетический Институт (Технический Университет)
Институт автоматики и вычислительной техники
Кафедра Прикладной математики
Лабораторная работа №2
по дисциплине «Экспертные системы»
тема: «Разработка экспертной системы с использованием программы GURU»
Выполнил:
Машеров Д.Е.
.
Москва
2012 г.
Постановка задачи
Разработать экспертную систему с использованием программы GURU.
Описание предметной области
Разрабатывается ЭС «Категоризация бриллиантов», которая позволяет выполнить категоризацию бриллиантов. Предметная обасть формализуется с помощью дерева целей, изображенном на Рис.1, дужкой помечена вершина «И», а отсутвием дужки – вершина «ИЛИ».
Описание работы эс
По дереву целей описаны переменные и правила, представленные в листинге.
Системная переменная E.CFVA, определяющяя формулу объединения факторов уверенности левой и правой частей правила имеет значение «pp»,то есть имеет вид:
CFJO = для AND Объединение факторов уверенности для левой и правой частей правила |
CFJO = для OR Объединение факторов уверенности, полученных по нескольким правилам для одной переменной |
P: (a * b) / 100 |
P: a + b – (a * b) / 100 |
Переменная e.sord,определяющяя очередность проверки имеет значение «ph», то есть проверка осуществляется по приоритету и по наибольшей достоверности результата.
Рис.1. Дерево целей
Листинг
Переменные:
VAR: CATEG
TYPE: pp
LABEL: CATEGORY
VAR: COLLECT
LABEL: COLLECTIONAL
VAR: PURITY
LABEL: PURITY
VAR: CUTQUAL
LABEL: CUT QUALITY
VAR: PLAY
LABEL: PLAY
VAR: FAMOUS
FIND:
let e.lnum= 1;
at 1,10 input tmpv num with "Byl li u kamnja izvestnyj vladelec?(1 - da, 2 - net)"
if tmpv = 1 then
let FAMOUS = true;
else
let FAMOUS = false;
endif;
LABEL: FAMOUS
VAR: UNUSUAL
FIND: at 2,10 input tmpv num with "Est' li neobychnaja istorija u kamnja?(1 - da, 2 - net)"
if tmpv = 1 then
let UNUSUAL = true;
else
let UNUSUAL = false;
endif;
LABEL: UNUSUAL
VAR: WEIGHT
FIND:
let e.lnum= 3;
at 3,10 input tmpv num with "Vvedite ves v karatah";
LABEL: WEIGHT
VAR: SYMMETRY
FIND:
let e.lnum= 1;
at 4,10 input tmpv num with "Brilliant simmetrichen?(1 - da, 2 - net)"
if tmpv = 1 then
let SYMMETRY = true;
else
let SYMMETRY = false;
endif;
LABEL: SYMMETRY
VAR: POLISH
FIND: at 5,10 input tmpv num with "Est' li brillianta negladkie storony?(1 - da, 2 - net)"
if tmpv = 1 then
let POLISH = false;
else
let POLISH = true;
endif;
LABEL: POLISHING
VAR: PROPORT
FIND:
let e.lnum= 2;
at 6,10 input tmpv num with "Vvedite otnoshenie rundisty(pojasa) k vysote kamnja v procentah"
LABEL: PROPORTIONS
VAR: CRACKS
FIND: at 7,10 input tmpv num with "Imejutsja li treshhiny? (1 - da, 2 - net)"
if tmpv = 1 then
let CRACKS = true;
else
let CRACKS = false;
endif;
LABEL: CRACKS
VAR: DOTS
FIND: at 8,10 input tmpv num with "Imejutsja li temnye tochki na poverhnosti? (1 - da, 2 - net)"
if tmpv = 1 then
let DOTS = true;
else
let DOTS = false;
endif;
LABEL: DOTS
VAR: COLOUR
FIND: at 9,10 input tmpv num with "Ukazhite cvet (1 - bescvetnyj, 2 - zheltyj, 3 - cvetnoj)"
LABEL: COLOUR
VAR: SCIN
FIND: at 10,10 input tmpv num with "Imeejutsja li vspyshki sveta pri vrashhenii kamnja?(1 - da, 2 - net)"
if tmpv = 1 then
let SCIN = true;
else
let SCIN = false;
endif;
LABEL: SCIINTILLATION
VAR: DISP
FIND: at 11,10 input tmpv num with "Imeejutsja li cvetovye bliki?(1 - da, 2 - net)"
if tmpv = 1 then
let DISP = true;
else
let DISP = false;
endif;
LABEL: DISPERSION
Правила:
RULE: R1
PRIORITY: 80
IF: SYMMETRY = true and POLISH = true and PROPORT < 50
THEN: CUTQUAL = true
REASON: Esli brilliant simmetrichen, imeet gladkie storony i pravil'nye proporcii rundisty, to kachestvo ogranki horoshee
RULE: R2
PRIORITY: 100
IF: SYMMETRY = false
THEN: CUTQUAL = false
REASON: Esli brilliant nesimmetrichen, to kachestvo ogranki neudovletvoritel'noe
RULE: R3
PRIORITY: 100
IF: POLISH = false
THEN: CUTQUAL = false
REASON: Esli brilliant imeet sherohovatosti, to kachestvo ogranki neudovletvoritel'noe
RULE: R4
PRIORITY: 100
IF: PROPORT > 50
THEN: CUTQUAL = false
REASON: Esli u brillianta nepravil'nye proporcii rundisty, to kachestvo ogranki neudovletvoritel'noe
RULE: R5
PRIORITY: 100
IF: SCIN = false and DISP = false
THEN: PLAY = false
REASON: Esli scinciljacija i dispersija ne projavljajutsja, to igra brillianta neudovletvoritel'na
RULE: R6
PRIORITY: 100
IF: SCIN = true
THEN: PLAY = true
REASON: Esli projavljaetsja scinciljacija, to igra brillianta schitaetsja horoshej
RULE: R7
PRIORITY: 100
IF: DISP = true
THEN: PLAY = true
REASON: Esli projavljaetsja dispersija, to igra brillianta
schitaetsja horoshej
RULE: R8
PRIORITY: 100
IF: FAMOUS = true
THEN: COLLECT = true
REASON: Esli u brillianta imetsja neobychnaja istorija, to brilliant imeet kollekcionnuju cennost'
RULE: R9
PRIORITY: 100
IF: UNUSUAL = true
THEN: COLLECT = true
REASON: Esli u brillianta byl izvestnyj vladelec, to brilliant imeet kollekcionnuju cennost'
RULE: R10
PRIORITY: 100
IF: FAMOUS = false and UNUSUAL = false
THEN: COLLECT = false
REASON: Esli u brillianta ne bylo ni izvestnogo vladelec, ni neobychnoj istorii, to u brilliant net kollekcionnoj cennosti
RULE: R11
PRIORITY: 80
IF: CUTQUAL = true
THEN: CATEG += true cf 70
REASON: Esli kachestvo ogranki horoshee, to brilliant otnositsja k vysokoj kategorii
RULE: R12
PRIORITY: 80
IF: CUTQUAL = false
THEN: CATEG -= true cf 70
REASON: Esli kachestvo ogranki plohoe, to brilliant otnositsja k nizkoj kategorii
RULE: R13
PRIORITY: 60
IF: COLOUR = 1
THEN: CATEG += true cf 40
REASON: Esli brilliant bescvetnyj, to brilliant otnositsja k vysokoj kategorii
RULE: R14
PRIORITY: 60
IF: COLOUR = 2
THEN: CATEG -= true cf 40
REASON: Esli brilliant imeet zheltovatyj cvet, to brilliant otnositsja k nizkoj kategorii
RULE: R15
PRIORITY: 60
IF: COLOUR = 3
THEN: CATEG += true cf 40
REASON: Esli brilliant imeet otlichnyj ot zheltogo cvet, to brilliant otnositsja k vysokoj kategorii
RULE: R16
PRIORITY: 60
IF: CRACKS = false and DOTS = false
THEN: PURITY = true
REASON: Esli otsutstvujut treshhiny i temnye tochki, to chistota brillanta horoshaja
RULE: R17
PRIORITY: 60
IF: CRACKS = true
THEN: PURITY = false
REASON: Esli imeejutsja treshhiny, to chistota brillanta neudovletvoritel'naja
RULE: R18
PRIORITY: 60
IF: DOTS = true
THEN: PURITY = false
REASON: Esli imeejutsja temnye tochki, to chistota brillanta neudovletvoritel'naja
RULE: R19
PRIORITY: 70
IF: PURITY = true
THEN: CATEG += true cf 50
REASON: Esli chistota brillanta horoshaja, to brilliant otnositsja k vysokoj kategorii
RULE: R20
PRIORITY: 70
IF: PURITY = false
THEN: CATEG -= true cf 50
REASON: Esli chistota brillanta neudovletvoritel'naja, to brilliant otnositsja k nizkoj kategorii
RULE: R21
PRIORITY: 60
IF: PLAY = true
THEN: CATEG += true cf 30
REASON: Esli igra brillianta horoshaja, to brilliant otnositsja k vysokoj kategorii
RULE: R22
PRIORITY: 60
IF: PLAY = false
THEN: CATEG -= true cf 30
REASON: Esli igra brillianta horoshaja, to brilliant otnositsja k nizkoj kategorii
RULE: R23
PRIORITY: 100
IF: COLLECT = true
THEN: CATEG += true cf 100
REASON: Esli brilliant imeet kollekcionnuju cennost', to brilliant otnositsja k vysokoj kategorii
RULE: R24
PRIORITY: 90
IF: WEIGHT <= 1
THEN: CATEG -= true cf 70
REASON: Esli brilliant imeet nebol'shoj ves, to brilliant otnositsja k nizkoj kategorii
RULE: R25
PRIORITY: 90
IF: WEIGHT > 1 and WEIGHT <=3
THEN: CATEG += true cf 70
REASON: Esli brilliant imeet srednij ves, to brilliant otnositsja k vysokoj kategorii
RULE: R26
PRIORITY: 90
IF: WEIGHT > 3
THEN: CATEG += true cf 75
REASON: Esli brilliant imeet bol'shoj ves, to brilliant otnositsja k vysokoj kategorii
Действия в начале работы:
INITIAL:
form main
at 10,25 put "***************************"
at 11,25 put "Expert system"
at 12,25 put "Brilliant CATEG"
at 13,25 put "press anykey"
at 14,25 put "***************************"
endform
clear;
e.trac ="n"
e.sord = "ph"
e.rigr = "a"
e.tryp ="s"
e.cfva = "pp"
e.lnum = 5
e.deci = 0
e.lstr = 75
CATEG = UNKNOWN
PURITY = UNKNOWN
COLLECT = UNKNOWN
CUTQUAL = UNKNOWN
PLAY = UNKNOWN
FLUOR = UNKNOWN
CRACKS = UNKNOWN
DOTS = UNKNOWN
COLOR = UNKNOWN
SCIN = UNKNOWN
DISP = UNKNOWN
FAMOUS = UNKNOWN
UNUSUAL = UNKNOWN
SYMMETRY = UNKNOWN
POLISH = UNKNOWN
PROPORT = UNKNOWN
WEIGHT = UNKNOWN
putform main;
wait;
clear;
Действия по завершению работы:
let e.lnum= 3;
clear;
if hicf(CATEG) > 50
at 12,10 output "Kategoriya brillianta vysokoya. Factor uverennosti ", hicf(CATEG);
else
at 12,10 output "Kategoriya brillianta nizkaya. Factor uverennosti ", 100 - hicf(CATEG);
endif;