Отправляет email-рассылки с помощью сервиса Sendsay

Экспертная система

  Все выпуски  

Экспертная система


 

 

 


Для изучение языка записи правил в экспертной системе рассмотрим конкретный пример. Сразу оговоримся, что не будет рассматривать «теорию» потому что никаких реальных теорий в области быть не может – мы пытаемся решать реальные задачи реального мира используя ограниченный понятийный материал – поэтому только реальный эксперт может оценить допустимо или подобное упрощение задачи и будет ли это упрощение полезно в реальной жизни. Экспертная система дает инструмент и дело эксперта решить будет ли он его использовать, и если будет, то как добиться максимально полезного результата.
Далее – не будем рассматривать тонкости выбора синтаксиса и семантики языка, просто сошлемся на свой опыт работы с интерпретаторами. Система создавалась как единое целое язык+оболочка+компилятор+интепретатор+отражение в PHP поэтому любое решение принималось из расчета работы в комплексе. И главный приоритет отдавался быстродействию при большом количестве правил как в автономном варианте, так и на сайте.
Итак – пример:
 { база }
 
 [10001 определение роста ] если ("пол"="ж", МЕНЬШЕ("РЗ_1",151) ) то
  "рост"="низкий";
 конец_если;
 
 если ("пол"="ж", БОЛЬШЕ("РЗ_1",150), МЕНЬШЕ("РЗ_1",161) ) то
  (20)"рост"="низкий";
  (80)"рост"="средний";
 конец_если;
 
 если ("пол"="ж", БОЛЬШЕ("РЗ_1",160), МЕНЬШЕ("РЗ_1",176) ) то
  "рост"="средний";
  (30)"рост"="высокий";
 конец_если;
 
 если ("пол"="ж", БОЛЬШЕ("РЗ_1",175) ) то
  "рост"="высокий";
 конец_если;
 
 
 [10001 определение длины рук ]если (СУЩЕСТВУЕТ("РЗ_33")) то
  "удлинение руки"=ВЫЧИСЛИТЬ(("РЗ_33"-"РС_33")/("РС_33"-"РС_31"));
 конец_если;
 
 если ("пол"="ж", БОЛЬШЕ("удлинение руки",0.07) ) то
  "длина руки"="увеличенная";
 конец_если;
 
 если ("пол"="ж", МЕНЬШЕ("удлинение руки",-0.07) ) то
  "длина руки"="уменьшенная";
 конец_если;
 
 если ("пол"="ж", БОЛЬШЕ("удлинение руки",-0.07), МЕНЬШЕ("удлинение руки",0.07) ) то
  "длина руки"="нормальная";
 конец_если;
 
  { выводы }
 если ("пол"="ж","длина руки"="увеличенная") то
  "результат"="длина рук увеличенная";
 конец_если;
 
 если ("пол"="ж","длина руки"="уменьшенная") то
  "результат"="длина рук уменьшенная";
 конец_если;
 
 если ("пол"="ж","длина руки"="нормальная") то
  "результат"="длина рук уменьшенная";
 конец_если;
 
 если ("пол"="ж","рост"="низкий") то
  "результат"="низкий рост";
 конец_если;
 
 если ("пол"="ж","рост"="средний") то
  "результат"="средний рост";
 конец_если;
 
 если ("пол"="ж","рост"="высокий") то
  "результат"="высокий рост";
 конец_если;
 

Что мы тут видим. Во-первых комментарий { база }. С комментариями все понятно – любой текст в фигурных скобках. Перед первым правилом расположен текст в квадратных скобках – это наименование группы правил. Начальное число позволит в дальнейшем проводить сортировку групп правил (напомню, что ориентируемся на сотни-тысячи правил, поэтому важна возможность упорядочивание расположения отдельных правил и групп). Конечно можно не писать ни комментарии ни названия групп. Тем более что у нас есть возможность задавать «имена» «переменных». Поясним использованные кавычки. Имя переменной – любое строковое выражение заключенное в кавычки (лучше использовать двойные кавычки). Переменная может иметь тип: перечислимый или числовой. Тип определяется через порядок использования переменной: если мы присваиваем переменной строку, то она перечислимая, если присваиваем число или сравниваем с числом, то она числовая. Преобразования числовой переменной в перечислимую или обратно нет. Для этого нужно использовать правила, например, как первое правило:
 
 [10001 определение роста ] если ("пол"="ж", МЕНЬШЕ("РЗ_1",151) ) то
  "рост"="низкий";
 конец_если;
 

Что делать, если рост женщины 159 см? Вроде не совсем низкий, но и не совсем средний. То есть к ней должны относиться правила как для низкого роста, так и для среднего роста. То есть нам нужно указать что рост и низкий и средний одновременно. Это делается во втором правиле:
 
 если ("пол"="ж", БОЛЬШЕ("РЗ_1",150), МЕНЬШЕ("РЗ_1",161) ) то
  (20)"рост"="низкий";
  (80)"рост"="средний";
 конец_если;
 

при выполнении этого правила переменная "рост" будет иметь два значения:"низкий" и "средний". Цифры перед операторами присваивания (20) (80) являются некими коэффициентами уверенности. Об их влиянии расскажем в следующих рассылках, но смысл их понятен из названия «коэффициент уверенности». Диапазон изменения от 100 до 0. 100- абсолютная уверенность (его можно опускать как значение по умолчанию). 0 – абсолютная неуверенность, пункт с таким коэффициентом не оказывает никакого действия на переменную.
Как уже говорилось, первый этап разработки системы – прямой вывод. То есть мы получаем информацию из внешнего файла и делаем выводы по входным данным. При этом считается, что данные подготовлены для их логической обработки, то есть сделаны все предварительные расчеты, подготовлены перечислимые переменные (для Интернета это будет делаться на PHP). Про само чтение в следующих рассылках, пока рассмотрим правило вычисления относительной длины руки:
 
 [10001 определение длины рук ]если (СУЩЕСТВУЕТ("РЗ_33")) то
  "удлинение руки"=ВЫЧИСЛИТЬ(("РЗ_33"-"РС_33")/("РС_33"-"РС_31"));
 конец_если;

 
в нем проверяется существование переменной "РЗ_33" и производится небольшое вычисление относительной длины руки, считая что "РЗ_33" – длина руки от точки основания шеи индивидуальной фигуры "РС_33"- – длина руки от точки основания шеи индивидуальной фигуры, "РС_31" - ширина плечевого ската стандартной фигуры. При компиляции система добавит в список условий проверку существования "РС_33" и "РС_31". В итоге при исполнении правила мы получим относительное удлинение руки и можем переходить к проверке следующих правил, переводящих числовое значение удлинения руки в описательный вид.
После определения всех возможных переменных нам нужно сделать вывод, не просто список всех определенных переменных и их значений, а что-то более осознанное. Для этого выделяется одна переменная (любая) и в качестве ее значений записываются возможные выводы (в принципе любой текст)
 
 если ("пол"="ж","рост"="средний") то
  "результат"="средний рост";
 конец_если;

 
в итоге мы получаем список значений с коэффициентами уверенности
 
 (100)"длина рук уменьшенная"
 (80)"средний рост"

 
продолжение следует.
 

 


 

 Если Вас интересует дополнительная информация   - пишите leko@lekala.info нам.

Посетите наш сайт www.lekala.info


В избранное