Экспертная система на 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
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 3

      +1
      Мне кажется, коду на скриншоте, точно не место в контроллере. И если запихнуть его в модель Image, то будет гораздо лучше.
        +1
        На самом деле в моделе тоже не место )
          +1
          Но лучше станет)

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое