Алгоритм обнаружения избыточных правил
Я ищу алгоритм для обнаружения избыточных правил.
Rules имеют фиксированное количество входных параметров, и каждый параметр имеет отдельный домен.
Учитывайте три параметра правила: Цвет, Материал и Размер:
Цве: Красный, зеленый, синий Материал: Дерево, Стекло, АлюминийРазме: Маленький Средний Большоравило @Each может соответствовать нескольким значениям параметра или совпадать с любым значением.первы Правило, которое соответствуетвсначения параметров @ выбраны. Нетотрицани правила, но домен является фиксированным, поэтому можно добавить отрицание, добавив все остальные.
+--------------------------------------------------++-----------------
| Rule Parameters || Rule Action
+----------------+------------------+--------------++-----------------
| Color | Material | Size || ==> Price
+----------------+------------------+--------------++-----------------
Rule 1 | Red | Wood, Glass | Large || $100
Rule 2 | Red | Aluminium | Large || $200
Rule 3 | Blue or Green | Wood | Medium || $300
Rule 4 | Red | ** Any ** | Large || $400 <== Redundant
Rule 5 | ** Any ** | ** Any ** | ** Any ** || $500
Правило 4 является избыточным из-за комбинации Правил 1 и 2. Избыточное правило - это правило, которое будетникогд быть сопоставленным из-за (комбинации) определенных правилд это правило. Действие правила не оценивается при проверке избыточности.
Как это реализовать Эффективно (на Java)? Он должен поддерживать 1000 правил с 10 параметрами по 100 значений в каждом. Правила, параметры и значения параметров считываются из базы данных (т. Е. Они не могут быть жестко запрограммированы).
Проблема с Эффективность это то, что есть 100 ^ 10 комбинаций входных параметров (каждый параметр имеет домен из 100 значений). Алгоритм необходим в графическом редакторе правил для поддержки пользователя, создающего правила. Он должен найти все избыточные правила в течение нескольких секунд.
GitHubЯ создал хранилище для тестирования предлагаемых решений:https: //github.com/qlp/redundant-rule В настоящее время только реализация BDD, которая не справляется с проблемой такого размера. Может быть, моя реализация BDD может быть улучшена?