Представление бизнес-правила как модели ограничений для поиска набора решений
В моем корпоративном приложении у меня есть бизнес-правила, такие как:
((AMOUNT < 20000.00) || ((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N')))
(ind = A1 || ind = A2 || ind = A3 || ind = S1 || ind = S2 || ind = S9)
Как видите, правило состоит из бизнес-выражений, например: (AMOUNT < 20000.00)
, В правилах может быть любое количество бизнес-условий, к которым присоединяются логические операторы &&
а также ||
, Идентификаторы AMOUNT
, RISKEXPOSURE
а также ind
бизнес-переменные (которые могут варьироваться от 1 до n в зависимости от предметной области).
Мое требование состоит в том, чтобы найти те выражения, когда они истинны, и сделать все правило истинным. Например: для бизнес-правила № 1 - все правило будет истинным, если:(AMOUNT < 20000.00)
верно или ((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N'))
верно, следовательно, мой вывод должен быть:
Решение № 1: (AMOUNT < 20000.00)
Решение № 2: ((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N'))
Аналогично для бизнес-правила № 2:
Решение № 1:ind = A1
Решение № 2:ind = A2
Решение № 3:ind = A3
Решение № 4:ind = S1
Решение № 5:ind = S2
Решение № 6:ind = S9
Что я пробовал:
Поскольку каждое бизнес-выражение может быть либо истинным, либо ложным, я изменил свое бизнес-правило # 1 как (A || ( B && C ) )
, Я использовал библиотеку логики высказываний от http://tweetyproject.org/. Это дает мне результаты, но я не могу применить ограничение, такое как XOR. В моем примере A и B являются взаимоисключающими, но мои результаты возможны. Представляя правило в виде таблицы истинности, я получаю все следующие истинные условия
011,100,101,110,111
Однако мой результат должен быть только 100, 011
Это привело меня к поиску альтернатив, и ответ здесь предложил решение проблем. Я читал о Решателе Чоко. Но я не уверен, как мое бизнес-правило может быть представлено в модели, приемлемой для решателя. Любая помощь с благодарностью.
2 ответа
Простым решением может быть реализация алгоритма, который находит все комбинации логических значений заданного размера. Затем для каждого выражения рассчитайте все выражение по значениям в комбинации и противоположному значению вашего выражения. Если в каждой комбинации вычисление всего выражения со значениями в строке комбинации и с противоположным значением для ваших выражений отличается, то это выражение - то, что вам нужно. Я постараюсь объяснить это легко.
У вас есть выражение (A || ( B && C ) )
= БОЛЬШОЙ Затем вы найдете комбинации возможных значений: например,
[[001],[010],[011]...[111]]
Для каждого из них замените значения в вашем БОЛЬШОМ выражении и сравните результат с выражением, вычисленным с помощью противоположного значения выражения, которое вы хотите - [101] with [001] | [110] with [010]
и для каждой комбинации результат - разница, вы находите выражение. Затем переключитесь на следующий индекс и сделайте это снова
Я бы порекомендовал вам посмотреть на решение SMT. Это естественно позволяет решить поставленную задачу. Вы вводите любое разумное количество ограничений (как целочисленных, так и логических) и переменных. По сути, он пытается удовлетворить уравнение с учетом некоторых ограничений. Он найдет первое удовлетворительное задание для вашей задачи.
Ссылки для изучения:
Имейте в виду, что время выполнения и производительность сильно зависят от самой проблемы: ограничений, констант, точных значений.