Системы оценки правил и «неточные» совпадения (например:х < 3000)

StackOverflow https://stackoverflow.com/questions/1471712

  •  16-09-2019
  •  | 
  •  

Вопрос

Я разрабатываю систему оценки правил, которая должна обрабатывать базу данных фактов и определенные правила для базы данных.В настоящее время у нас есть модифицированная версия RETE это частично работает правильно, но с некоторыми недостатками.

Проблема в том, что правила не ограничиваются точными совпадениями, но они также должны поддерживать неравенство (например, «меньше») и другие виды нечетких вычислений.

Примеры, предположим, что у вас есть эти факты

(Зарплата Иоанна 58000) (зарплата Сара 78000) (сотрудник Джон) (босс Сара) (женат Джон Сара) (работы Джон Стэкверфлоу)

у вас может быть правило, которое гласит:

(Зарплата ?w < 60000) /\ (Женат ?w) /\ (Работает ?w Stackoverflow) ==> Что угодно

Очевидно, что результатом будет запуск правила со значением ?w, равным «Джон», но сейчас мы это делаем, просматривая каждый элемент в базе фактов, который соответствует началу первого выражения (Зарплата X X), а затем проведение сравнения и сохранение результатов в базе фактов.Например, после первого прохода в базу фактов будет добавлен следующий элемент:

(Заработная плата Джона 58 000 < 60 000)

и как только это будет сделано, вы выполните соединения обычным способом RETE.Таким образом, оно занимает много места в базе фактов, особенно потому, что правило может ссылаться на любое число, и поэтому у вас есть эти «вычисленные» факты, пока правило активно.

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

Кто-нибудь знает какие-либо шаблоны, ссылки или методы, которые обрабатывают такое поведение?Обычные алгоритмы LEAPS, TREATS, RETE обрабатывают (насколько мне известно) только «точное» совпадение.

Кстати, это C# .NET.

Это было полезно?

Решение

КЛИПЫ поддерживает условные элементы с тех пор, как я об этом знаю - не менее 15 лет.Проверьте базовое руководство по программированию для CLIPS и это Учебное пособие по клипам Например.Вы можете просмотреть (или изменить) исходный код клипов бесплатно.

CLIPS использует префиксную запись, поэтому ваш пример условия может выглядеть так:

(defrule fat-boy
    (person-data (name ?name) (weight ?weight))
    (test (> ?weight 100))
=>
    (printout t ?name " weighs " ?weight " kg! " crlf)
)

Другие советы

Насколько я понимаю проблему, все нечеткие правила делят диапазоны целых чисел или значений с плавающей запятой на ограниченное количество поддиапазонов.Например, если зарплата сравнивается со значениями 58000, 60000, 78000, у вас есть 4 диапазона:<58000, 58000-60000, 60000-78000, >78000.

Если это так, возможно, вы можете переопределить свои переменные так, чтобы они были целыми числами, равными 0,1,2,3, и тем самым преобразовать правила неравенства в правила равенства.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top