Разработка самообучающейся системы
Система приобретения знаний предназначена для добавления в базу знаний новых правил и модификации имеющихся. В ее задачу входит приведение правила к виду, позволяющему механизму вывода применять это правило в процессе работы. В простейшем случае в качестве такой системы может выступать обычный редактор или текстовый процессор, который просто заносит правила в файл. В более сложных системах предусмотрены еще и средства для проверки вводимых или модифицируемых правил на непротиворечивость с имеющимися правилами.
Одна из форм приобретения знаний называется обратной связью. Обучение с помощью обратной связи показано на рисунке.
Человек, благодаря механизму обратной связи и уже имеющихся знаний, приобретает новые. Следовательно, человек учится на опыте.
Приблизительно также обучается компьютерная программа. В нее заложен алгоритм хранения фактов и выполнения логических выводов. Логические выводы связаны в программе с постоянно пополняющими ее новыми фактами. Рассмотрим пример самообучающейся системы, который следует рассматривать, исходя из предпосылки: система будет обучаться только в том случае, если она соприкоснулась с чем-то противоречащим ранее извесному.
ПРИМЕР РАЗРАБОТКИ САМООБУЧАЮЩЕЙ ЭКСПЕРТНОЙ СИСТЕМЫ
Разработаем систему, которая должна понимать различия между страусом и сорокой. Некоторые свойства, отличающие страуса от сороки, приведены на рисунке:
Компьютерную программу можно обучить, объяснив ей разницу только между двумя объектами. Но затем заложенный в нее принцип работы она может распространять на большее число объектов. В программе содержатся 3 списка: в списке 1 хранятся атрибуты для страуса, в списке 2 - для сороки, а в списке 3 - атрибуты общие и для страуса, и для сороки.
Заметим, что система будет работать одинаково независимо от того, о каких объектах пойдет речь. Обучающаяся программа, прежде всего, запросит у пользователя имена объектов:
ВВЕДИТЕ ИМЯ ОБЪЕКТА 1?
ВВЕДИТЕ ИМЯ ОБЪЕКТА 2?
Прежде чем программа приступит к описанию одного из объектов, она запросит ввод его атрибутов:
ВВЕДИТЕ АТРИБУТЫ ЛЮБОГО ОБЪЕКТА И ENTER В КОНЦЕ
ВВЕДИТЕ АТРИБУТ 1?
ВВЕДИТЕ АТРИБУТ 2?
ВВЕДИТЕ АТРИБУТ 3?
ВВЕДИТЕ АТРИБУТ 4?
и т.д.
Затем программа начинает сравнивать введенные атрибуты с атрибутами первого списка. Поскольку первый список пуст результатом сравнения будет оценка нуль, показывающая, что совпадений нет. По тем же причинам и сравнение с атрибутами второго списка. Получив нулевую оценку, программа предположит, что введенные атрибуты относятся к списку 1. Она запросит у пользователя подтверждение этого предположения. В зависимости от ответа пользователя данные будут занесены либо в первый список, либо во второй. В общий список ничего не будет занесено. В дальнейшем при совпадении атрибутов, они будут заносится в общий список.
Почему бы не разработать систему так, чтобы она сразу помещала атрибуты в нужный список, избегая дополнительных действий? Но именно этим и отличается система, в которую уже заложены все знания, от системы, способной к обучению. В предложенном варианте система ведет себя как человек, а не как машина и должна сама разобраться, куда поместить атрибуты.
1. Система вносит изменения только в случае, если встречаются противоречия. Это обеспечивается с помощью механизма обратной связи.
2. Система сравнивает введенные атрибуты с атрибутами, хранящимися в ней, пытаясь их идентифицировать и выбрать наиболее похожие. Для этого используются специальные оценки. Вся работа выполняется с помощью механизма логического вывода.
{САМООБУЧАЮЩАЯ СИСТЕМА}
{ПРОГРАММА ВЫДВИГАЕТ ПРЕДПОЛОЖЕНИЕ ОБ ОБЪЕКТЕ}
{ИСХОДЯ ИЗ ВВЕДЕННЫХ АТРИБУТОВ}
PROGRAM SELF;
LABEL 1,2,3,4;
{L1 - СПИСОК ОБЪЕКТА 1}
{L2 - СПИСОК ОБЪЕКТА 2}
{LС - ОБЩИЙ СПИСОК}
{T - ВРЕМЕННЫЙ БУФЕР ДЛЯ ЗНАЧЕНИЙ АТРИБУТА}
VAR L1,L2,LC,OO1,OO2:ARRAY[1..10] OF STRING;
T:ARRAY[1..11] OF STRING;
I,K,L,S1,S2:INTEGER;
O1,O2,OT:STRING;
KL:BOOLEAN;
{ПЕЧАТЬ ВСЕХ СПИСКОВ}
PROCEDURE PR;
BEGIN
WRITE(O1:20);
WRITE(O2:20);
WRITELN('ОБЩИЙ СПИСОК':20);
FOR I:=1 TO 10 DO
BEGIN
WRITELN(OO1[I]:20, OO2[I]:20, LC[I]:20);
END;
END;
BEGIN
FOR I:=1 TO 10 DO
BEGIN
L1[I]:='';
L2[I]:='';
LC[I]:='';
OO1[I]:='';
OO2[I]:='';
END;
FOR I:=1 TO 11 DO T[I]:='';
WRITE('ВВЕДИТЕ ИМЯ ОБЪЕКТА 1?'); READLN(O1);
WRITE('ВВЕДИТЕ ИМЯ ОБЪЕКТА 2?'); READLN(O2);
1:WRITE('БУДИТЕ ВВОДИТЬ АТРИБУТЫ?'); READLN(OT);
IF OT='НЕТ' THEN EXIT;
WRITELN('ВВЕДИТЕ АТРИБУТЫ ЛЮБОГО ОБЪЕКТА И ENTER В КОНЦЕ');
I:=1; KL:=FALSE;
WHILE (I<=11) AND (KL=FALSE) DO
BEGIN
WRITE('ВВЕДИТЕ АТРИБУТ ',I,'?'); READLN(T[I]);
IF T[I]='' THEN KL:=TRUE;
I:=I+1;
END;
L:=I-2;
{СРАВНЕНИЕ АТРИБУТОВ СО СПИСКАМИОБЪЕКТОВ 1 И 2}
S1:=0; S2:=0;
FOR I:=1 TO L DO
FOR K:=1 TO 10 DO
BEGIN
IF OO1[K]=T[I] THEN S1:=S1+1;
IF OO2[K]=T[I] THEN S2:=S2+1;
END;
{ОБЪЕКТ2 ПРЕДПОЛАГАЕТСЯ ТОЛЬКО, ЕСЛИ ОЦЕНКА 2 БОЛЬШЕ ОЦЕНКИ 1}
IF S1<S2 THEN GOTO 3;
WRITELN('ЭТО ',O1);
WRITE('ВЕРНО ДА ИЛИ НЕТ '); READLN(OT);
IF OT='НЕТ' THEN GOTO 4;
{ПОМЕСТИТЬ КАЖДЫЙ АТРИБУТ ВО ВРЕМЕННЫЙ БУФЕР}
{А НЕ В СПИСОК ОБЪЕКТОВ 1 ИЛИ 2 ИЛИ ОБЩИЙ СПИСОК}
{ПЕРЕМЕСТИТЬ АТРИБУТ ИЗ СПИСКА 2 В ОБЩИЙ СПИСОК}
{ЕСЛИ ЭТО НЕОБХОДИМО}
2:FOR I:=1 TO L DO
FOR K:=1 TO 10 DO
BEGIN
IF T[I]=OO2[K] THEN {ПЕРЕМЕСТИТЬ АТРИБУТ ИЗ ВТОРОГО}
FOR L:=1 TO 10 DO {СПИСКА В ОБЩИЙ}
BEGIN
IF LC[L]='' THEN
BEGIN
LC[L]:=OO2[K]; OO2[K]:=''; T[I]:='';
END;
END;
END;
FOR I:=1 TO L DO
BEGIN
KL:=FALSE;
K:=1;
WHILE (K<=10) AND (KL=FALSE) DO
BEGIN
IF T[I]='' THEN KL:=TRUE;
IF T[I]=LC[K] THEN KL:=TRUE; {ЕСТЬ В ОБЩЕМ СПИСКЕ}
IF T[I]=OO1[K] THEN KL:=TRUE; {ЕСТЬ В СПИСКЕ ОБЪЕКТА 1}
K:=K+1;
END;
K:=1;
WHILE (K<=10) AND (KL=FALSE) DO
BEGIN
IF OO1[K]='' THEN
BEGIN
OO1[K]:=T[I]; {ПОМЕСТИТЬ ПЕРЕМЕННУЮ В СПИСОК 1}
KL:=TRUE;
END;
K:=K+1;
END;
END;
PR; {ПЕЧАТЬ ВСЕХ СПИСКОВ}
GOTO 1;
3:WRITELN('ЭТО ',O2);
WRITELN('ВЕРНО ДА ИЛИ НЕТ'); READLN(OT);
IF OT='НЕТ' THEN GOTO 2;
{ПОМЕСТИТЬ КАЖДЫЙ АТРИБУТ ВРЕМЕННОГО БУФЕРА,}
{КОТОРОГО НЕТ В ОБЩЕМ СПИСКЕ И В СПИСКЕ ОБЪЕКТА 2}
{В СПИСОК 2 ПЕРЕМЕСТИТЬ СОВПАДАЮЩИЕ АТРИБУТЫ ИЗ СПИСКА 1}
{В ОБЩИЙ СПИСОК}
4:FOR I:=1 TO L DO
FOR K:=1 TO 10 DO
BEGIN
IF T[I]=OO1[K] THEN
BEGIN
FOR L:=1 TO 10 DO {ПЕРЕМЕСТИТЬ АТРИБУТ ИЗ СПИСКА 1}
BEGIN {В ОБЩИЙ СПИСОК}
IF LC[L]='' THEN
BEGIN
LC[L]:=OO1[K]; OO1[K]:=''; T[I]:='';
END;
END;
END;
END;
FOR I:=1 TO L DO
BEGIN
KL:=FALSE;
K:=1;
WHILE (K<=10) AND (KL=FALSE) DO
BEGIN
IF T[I]='' THEN KL:=TRUE;
IF T[I]=LC[K] THEN KL:=TRUE; {ЕСТЬ В ОБЩЕМ СПИСКЕ}
IF T[I]=OO2[K] THEN KL:=TRUE; {ЕСТЬ В СПИСКЕ 2}
K:=K+1;
END;
K:=1;
WHILE (K<=10) AND (KL=FALSE) DO
BEGIN
IF OO2[K]='' THEN {ПЕРЕМЕСТИТЬ ПЕРЕМЕННУЮ В СПИСОК 2}
BEGIN
OO2[K]:=T[I];
KL:=TRUE;
END;
K:=K+1;
END;
END;
PR;
GOTO 1;
END.
1. Сохраните введенную программу в созданной рабочей папке.
2. Запустите программу на выполнение. Проверьте работу программы.
3. Введите данные:
ВВЕДИТЕ ИМЯ ОБЪЕКТА 1? СТРАУС
ВВЕДИТЕ ИМЯ ОБЪЕКТА 2? СОРОКА
'БУДИТЕ ВВОДИТЬ АТРИБУТЫ? ДА
ВВЕДИТЕ АТРИБУТЫ ЛЮБОГО ОБЪЕКТА И ENTER В КОНЦЕ
ВВЕДИТЕ АТРИБУТ 1? ПТИЦА
ВВЕДИТЕ АТРИБУТ 2? НЕ ЛЕТАЕТ
ВВЕДИТЕ АТРИБУТ 3? ДЛИННАЯ ШЕЯ
ВВЕДИТЕ АТРИБУТ 4? ENTER
ЭТО СТРАУС
ВЕРНО ДА ИЛИ НЕТ? ДА
СТРАУС СОРОКА ОБЩИЙ СПИСОК
ПТИЦА
НЕ ЛЕТАЕТ
ДЛИННАЯ ШЕЯ
'БУДИТЕ ВВОДИТЬ АТРИБУТЫ? ДА
ВВЕДИТЕ АТРИБУТЫ ЛЮБОГО ОБЪЕКТА И ENTER В КОНЦЕ
ВВЕДИТЕ АТРИБУТ 1? ПТИЦА
ВВЕДИТЕ АТРИБУТ 2? ЛЕТАЕТ
ВВЕДИТЕ АТРИБУТ 3? КОРОТКАЧ ШЕЯ
ВВЕДИТЕ АТРИБУТ 4? ENTER
ЭТО СТРАУС
ВЕРНО ДА ИЛИ НЕТ? НЕТ
СТРАУС СОРОКА ОБЩИЙ СПИСОК
НЕ ЛЕТАЕТ ЛЕТАЕТ ПТИЦА
ДЛИННАЯ ШЕЯ КОРОТКАЯ ШЕЯ
'БУДИТЕ ВВОДИТЬ АТРИБУТЫ? ДА
ВВЕДИТЕ АТРИБУТЫ ЛЮБОГО ОБЪЕКТА И ENTER В КОНЦЕ
ВВЕДИТЕ АТРИБУТ 1? ПТИЦА
ВВЕДИТЕ АТРИБУТ 2? ЛЕТАЕТ
ВВЕДИТЕ АТРИБУТ 3? ENTER
ЭТО СОРОКА
ВЕРНО ДА ИЛИ НЕТ? ДА
СТРАУС СОРОКА ОБЩИЙ СПИСОК
НЕ ЛЕТАЕТ ЛЕТАЕТ ПТИЦА
ДЛИННАЯ ШЕЯ КОРОТКАЯ ШЕЯ
Примерные варианты заданий
Варианты | Исходные данные |
Построить самообучающуюся систему, которая дает возможность распознавать животных (зебру, тигра, жирафа). | |
Построить самообучающуюся систему, которая дает возможность распознавать время года. | |
Построить самообучающуюся систему, которая дает возможность распознавать фрукты (лимон, апельсин, банан). | |
Построить самообучающуюся систему, которая дает возможность распознавать виды транспорта (автобус, троллейбус, трамвай). |