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

Статья посвящена созданию экспертной системы. Вначале статьи — блок-схема из книги из списка литературы, потом описание базы данных и алгоритма. Далее идет «справка о том, как сделать этот проект», в которой описан алгоритм создания этого проекта. В конце статьи — список литературы. Также в ней имеются пара скриншотов.


Блок-схема алгоритма

База данных содержит три таблицы — images, questions и outcomes. Первая из них — главная при «классификации и идентификации», содержит признак удачного распознавания (поле flag) и число «пар „объект, ответ“» в «обучающей выборке» (поле n). Вторая содержит эту самую выборку (поле value), а также названия «свойств и признаков» (поле name) и используемое в алгоритме распознавания поле rule. Наконец, третья таблица содержит возможные ответы (дождь/нет дождя и т.п.).


Экшн show

Алгоритм работает следующим образом. На текущей итерации сумма значений rule*value не превышает rule*n (поскольку value имеет одно из двух значений: 0 или 1). На следующей итерации единиственное значение rule превышает эту сумму, то есть rule=rule*n+1.

Номер инерации с вычтенной из него единицей (на первой итерации с нулевой суммой ответ неизвестен) это номер ответа (у К.Нейлора положительная сумма значений rules*value означала первый ответ, отрицательная — второй).

Очевидно, что на первой итерации (нулевые значния rule по умолчанию) сумма значений также будет нулевой. На второй итерации она будет находиться в диапазоне [1, n] (cм. выше формулу для rule), на третьей — в диапазоне [n+1,(n+1)*n]; на четвертой диапазон будет таким: [(n+1)*n+1,((n+1)*n+1)*n] и так далее.

Таким образом, правая граница диапазона рассчитывается по формуле sum=(sum+1)*n. Когда все возможные варианты ответов проверены, обнуляем rule.


Как это выглядит в веб-браузере

Справка о том, как сделать этот проект

Практически все файлы проекта могут быть созданы с помощью команд

rails generate scaffold Image name:string flag:boolean n:integer rails generate scaffold Question name:string value:integer rule:integer image:references rails generate scaffold Outcome name:string image:references

В файле db/migrate/yyyyMMddhhmmss_create_images.rb вместо строки t.boolean :flag пишем t.boolean :flag, default: false. Также добавляем нулевые значения по умолчанию для полей images.n, questions.value и questions.rule. И делаем rake db:migrate.

Далее в файле config/routes.rb сделаем questions и outcomes ресурсами, подчиненными ресурсу images. Также в файл app/models/image.rb добавим has_many :questions и has_many :outcomes. Осталось в контроллерах и вьюхах соответствующим образом поменять пути: questions_path заменить на image_questions_path(params[:image_id]) и т.п.

Создаем партиалы _question.html.erb и _outcome.html.erb, чтобы потом рендерить их во вьюхе images/show.html.erb. Больше об этом приеме можно узнать, посмотрев видеотур по Rails 5, который есть на главной странице официального сайта этого веб-фреймворка.

В результате всех этих действий ломаются вьюхи new.html.erb и edit.html.erb для обоих подчиненных ресурсов. Вместе с единым партиалом _form.html.erb они получают один и тот же путь для экшена этой формы, что неверно. Исправляем.

Алгоритм с пересчетом значений поля rule (при необходимости) см. выше. Он запускается при обновлении веб-страницы, выводимой экшеном show контроллера ImageController.

И наконец автоматическое тестирование. В связи с изменением маршрутов, в тестах и стендах (fixtures) также требуются соответствующие изменения.

Литература

К. Нейлор. Как построить свою экспертную систему — Изд-во Энергоатомиздат, 1991

FavoriteLoadingДобавить в избранное
Posted in Без рубрики

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *