Как начать работать с большой таблицей решений - PullRequest
3 голосов
/ 24 февраля 2011

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

Таким образом, проблема заключается в следующем (я преобразовал его в демонстрационные данные, так как реальная проблема не имела бы большого смысла, если бы не знать наизусть словарь компании).

У нас есть таблица решений, которая имеет минимум 16 условий. Поскольку управлять всеми ими невозможно (2 ^ 16 возможностей), мы решили перечислить только исключения. Как это:

decision table example

В качестве примера я добавил только 10 условий, но на самом деле их (на данный момент) 16. Основная идея заключается в том, что у нас есть одна базовая линия (по умолчанию), которая действительна для всех и всех исключений из этого значения по умолчанию.

Пример:

У вас есть иностранец, который также является пиратом. Если вы просматриваете все исключения одно за другим, и условие за условием, вы удаляете исключения, у которых есть хотя бы одно условие, которое не выполняется. В итоге вы получите следующие два исключения, которые действительны для нашего случая. Сопоставление выполняется по условию IsPirate и IsForeigner. Но, как вы можете видеть, здесь есть 2 результата, а на самом деле 3, если вы считаете значение по умолчанию. problem example

Наше решение

Теперь мы пришли к выводу, как решить эту проблему: в графическом интерфейсе, в который вы добавляете эти исключения, должен быть запущен алгоритм, который проверяет такие случаи и вынуждает вас определять исключение более конкретно. Это всего лишь теория, и она еще не проверена, но мы думаем, что это может сработать.

Мой вопрос

Я ищу альтернативные решения, которые делают правила управляемыми и предотвращают проблему, показанную в примере.

Ответы [ 5 ]

8 голосов
/ 22 марта 2011

Похоже, ваша проблема заключается в разрешении противоречивых правил.Когда несколько правил совпадают с вашими данными (ваш иностранец и пират) и они в конечном итоге рекомендуют разные вещи (ваш cangetjob и cangetevicted), вам нужна стратегия для разрешения этого конфликта.

ЧтоВы упомянули, что это один из способов решения проблемы, который заключается в устранении конфликта.Однако это не всегда возможно и не всегда желательно, потому что, когда пользователь добавляет новое правило, которое конфликтует с набором старых правил (которые он или она не написали), пользователь может не знать, как изменить его, чтобы удалитьконфликт.

Другим возможным методом разрешения является приоритезация .Отметьте приоритет для каждого правила (основываясь на таких вещах, как собственные полномочия пользователя и т. Д.), Отсортируйте соответствующие правила в соответствии с приоритетом и примените в порядке возрастания приоритета.Обычно это работает и намного проще в управлении (например, всем известно, что правила главного босса являются окончательными!)

Приоритизация также может использоваться для обозначения определенного правила как «глобального переопределения».В вашем примере вы можете сделать IsPirate правилом переопределения - это означает, что он переопределяет настройки для обычных людей.Другими словами, если ты пират, к тебе относятся по-другому.Это позволяет очень легко спроектировать систему, в которой у вас есть набор нормальных бизнес-правил, регулирующих 90% случаев, а затем набор «исключений», которые обрабатываются по-разному, автоматически переопределяя определенные вещи.В этом случае вам также следует подумать о том, чтобы сделать "?"также доступно в выходных столбцах.

Еще один возможный метод разрешения - включение атрибутов в каждое из ваших условий.Например, определенные условия не должны иметь «нулей» для прохождения (? Не имеет значения).Некоторые условия должны иметь хотя бы один «один», чтобы пройти.Другими словами, пометьте каждое условие как «И», «ИЛИ» или «XOR».Некоторые популярные системы защиты файлов используют эту модель.Например, CanGetJob может быть AND (вы хотите быть строгими в отношении прав на работу).CanBeEvicted может быть ИЛИ - вы можете захотеть выселить даже иностранца, если он также является пиратом.

Усовершенствование метода И / ИЛИ заключается в предоставлении порогового значения, которое общий результат должен превышать до выполнения этого условия.,Например, установив CanGetJob на порог 2, он должен получить по крайней мере две единицы, чтобы вернуть 1. Это иногда полезно при условиях, которые не совсем чётко черно-белые.

Вы можете смешивать разрешениеметоды: например, сначала расставьте приоритеты, затем используйте AND / OR для разрешения правил с аналогичными приоритетами.

Возможности безграничны и действительно зависят от ваших реальных потребностей.

3 голосов
/ 18 марта 2011

Мне эта проблема напоминает механизм бизнес-правил , где нет известного алгоритма для определения выходных данных от входных данных (например, с использованием логической логики), но пользователь (обычно какой-то администратор) должен определить все или некоторые сама логика.

Это может показаться немного излишним, но OTOH обеспечивает практически безграничные возможности расширения: вам не нужно кодировать какую-либо новую бизнес-логику, просто определите новый набор правил.

Как я понимаю вашу проблему, вы ищете хороший способ визуализации редактирования этих правил. Но все это зависит от вашего языка программирования и инструмента, который вы выбираете для этого. В Java, например, есть JBoss Drools . Цитирую свою страницу:

Друлс Гувнор обеспечивает (логически централизованный) хранилище для вас деловые знания и веб-интерфейс среда, которая позволяет бизнес-пользователям для просмотра и (в пределах определенного ограничения) возможно обновить бизнес-логика напрямую.

Вы можете использовать этот универсальный инструмент или написать свой собственный.

1 голос
/ 16 марта 2016

Если вы ищете Decision Engine с графическим интерфейсом, вы можете попробовать это: http://gandalf.nebo15.com/

Мы только что выпустили его, он с открытым исходным кодом и готов к производству.

1 голос
/ 21 марта 2011

Все зависит от того, как будут выглядеть ваши настоящие правила.Правила типа 'IF имеет четное число этих свойств THEN' было бы больно представлять в этом формате, тогда как правила типа 'IF пират, а не компьютерщик THEN' просты.

Вы можете «избежать неоднозначности», заявив, что вы всегда будете принимать фактическое совпадение first , другими словами, ваши правила имеют приоритет.Затем вы захотите пометить правила, которые не имеют никакого эффекта, потому что они «затенены» правилами выше.Их не сложно найти, поэтому ваша программа должна это делать.

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

Если некоторые из ваших выводов относительно независимы от других, вы также получите более компактную и намного более четкую таблицу, разрешив вопросительные знаки ввыход .В этой схеме сканирование для первого сопоставляющего правила выполняется один раз для каждого выхода.Например, рассмотрим, является ли «HasChildren» единственным фактором, имеющим отношение к «Может быть изгнан».С вопросительными знаками на выходах (= без эффекта) вы могли бы вдвое сократить количество правил исключений.

Мой фон для этого - логическая схема, а не бизнес-логика.То, что вы разрабатываете, похоже на PLA , но не совпадает с ним.Пока ваши действительные правила близки к сумме продуктов, это может работать хорошо.Если ваши правила не являются, например, правилом «четное число этих свойств», то сетка, подобная представлению, сломается в комбинаторном взрыве случаев.Ваша лучшая надежда , если ваши правила произвольны , состоит в том, чтобы получить более четкое и компактное представление либо с уравнениями, либо с диаграммами, подобными принципиальной схеме.Чтобы избежать, если вы можете.

0 голосов
/ 18 марта 2011

Возможно, вам нужен какой-то механизм вывода. Подумайте об этом в прологе.

...