Как начать работать с большой таблицей решений

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

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

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

пример таблицы решений

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

Пример:

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

Наше решение

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

Мой вопрос

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


person Peter    schedule 24.02.2011    source источник
comment
Ярр, я не понимаю твоего вопроса. Какой ввод? Это последняя строка 1110100000? Каков желаемый результат? Пожалуйста, обновите свой вопрос более подробно, приятель.   -  person anon    schedule 18.03.2011
comment
Эй, я немного обновил вопрос, но не знаю, смогу ли я сделать его более ясным. И да, ввод - это пример иностранного пирата 1110100000. Спасибо за чтение, дружище :), выпей рома!   -  person Peter    schedule 18.03.2011


Ответы (5)


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

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

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

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

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

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

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

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

person Stephen Chung    schedule 22.03.2011
comment
Ничего себе, вы дали действительно хороший отзыв здесь, большое спасибо, что нашли время, чтобы сделать это! Получи +50 ;-) - person Peter; 22.03.2011
comment
Ну, что ж, спасибо. :-) Тем не менее, я считаю, что у вас еще есть время для награды, и вы, вероятно, должны были подождать до последней минуты перед награждением. Кто-то другой может придумать еще лучший ответ для вас. Но все равно спасибо. - person Stephen Chung; 22.03.2011
comment
По-прежнему рекомендуется выделять в пользовательском интерфейсе любые потенциальные конфликты, чтобы пользователь знал, что его/ее правило может быть переопределено из-за разрешения конфликта! - person Stephen Chung; 22.03.2011
comment
@Peter, я отредактировал свой ответ, включив в него еще несколько идей по расстановке приоритетов. - person Stephen Chung; 22.03.2011
comment
Да, но ваш ответ содержал то, что я искал, поэтому я с радостью предоставляю вам 50 повторений :-) Спасибо за дополнительную информацию! - person Peter; 22.03.2011

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

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

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

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

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

person mindas    schedule 18.03.2011

Все зависит от того, как будут выглядеть ваши настоящие правила. Такие правила, как 'ЕСЛИ имеет четное число этих свойств, ТО', было бы трудно представить в этом формате, в то время как правила типа 'ЕСЛИ пират, а не гик, ТО' легко представить.

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

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

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

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

person James Crook    schedule 20.03.2011

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

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

person Andrew Dryga    schedule 15.03.2016

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

person rayhan    schedule 18.03.2011