====== Лабораторная работа №3: Изучение стратегий разрешения конфликтов в продукционных системах ====== ===== Цель работы ===== Изучение различных стратегий разрешения конфликтов в продукционных системах. ===== Основные теоретические положения ===== При реализации прямого вывода в продукционных базах знаний машина логических выводов сопоставляет левые части (антецеденты) правил с базой данных и помещает правила, антецеденты которых удовлетворяются, в агенду (конфликтное множество). //Агенда// представляет собой список всех правил, условия которых удовлетворяются, но которые еще не были выполнены. Агенда работает аналогично стеку -- правило, которое должно быть выполнено первым является верхним правилом в агенде. Когда правило становится активным (условия в его левой части удовлетворяются), оно помещается в агенду в соответствии со следующими правилами: - Вновь активизируемые правила помещаются над всеми правилами с более низкой значимостью (salience) и ниже всех правил с более высокой значимостью. - Для определения места среди правил равной значимости используется текущая стратегия разрешения конфликта. - Если в результате добавления или удаления факта одновременно активизируются несколько правил и шаги 1 и 2 не позволяют выполнить упорядочение, то эти правила упорядочиваются между собой произвольно (//но не случайно//). //Значимость// позволяет пользователю назначать правилу приоритет, который учитывается при его выборе из агенды. Первым активизируется правило с наивысшей значимостью. Значимость может принимать целое значение в диапазоне от -10000 до +10000. По умолчанию значимость правила равна 0. Для явного назначения правилу значимости используется оператор: (declare ) Этот оператор может добавляться в левую часть правила и должен размещаться перед первым условным элементом, например: (defrule test-1 (declare (salience 99)) (fire test-1) => (printout t "Rule test-1 firing." crlf)) Значимости может назначаться значение в один из трех моментов: при определении правила, при активизации правила и в каждом цикле выполнения (последние два случая соответствуют //динамической значимости//). По умолчанию значение значимости назначается только при определении правила. Для изменения такого поведения может использоваться команда ''set-salience-evaluation''. В CLIPS поддерживается семь стратегий разрешения конфликтов: <<вглубь>> (''depth''), <<вширь>> (''breadth''), <<простоты>> (''simplicity''), <<сложности>> (''complexity''), ''lex'', ''mea'' и случайного выбора (''random''). По умолчанию используется стратегия вглубь. Текущая стратегия может быть установлена командой ''set-strategy'', при этом агенда переупорядочивается на основе новой стратегии. Синтаксис команды: (set-strategy ) где '' ::= depth|breadth|simplicity|complexity|lex|mea|random''. По умолчанию используется стратегия ''depth''. **Стратегия <<вглубь>>.** Вновь активируемые правила помещаются в агенду над всеми правилами такой же значимости. Например, пусть факт f-1 активирует правила rule-1 и rule-2, а факт f-2 активирует правила rule-3 и rule-4. Тогда если f-1 устанавливается раньше, чем f-2, то rule-3 и rule-4 окажутся в агенде выше правил rule-1 и rule-2. Однако положение правила rule-1 относительно правила rule-2 и правила rule-3 относительно правила rule-4 будет произвольным. **Стратегия <<вширь>>.** Вновь активируемые правила помещаются ниже всех правил с такой же значимостью. Например, пусть факт f-1 активирует правила rule-1 и rule-2, а факт f-2 активирует правила rule-3 и rule-4. Тогда, если f-1 устанавливается раньше, чем f-2, то rule-1 и rule-2 окажутся в агенде выше правил rule-3 и rule-4. Однако, положение правила rule-1 относительно правила rule-2 и правила rule-3 относительно правила rule-4 будет произвольным. **Стратегия <<простоты>>.** Среди правил одинаковой значимости, вновь активируемые правила помещаются над всеми правилами с равной или большей специфичностью (specificity). Специфичность правила определяется числом сравнений, которые должны быть выполнены в левой части правила. Каждое сравнение с константой или предварительно связанной переменной увеличивает специфичность на единицу. Каждый вызов функции, сделанный из левой части правила в условном элементе с предикатным ограничением ('':''), ограничением возвращаемым значением (''='') или УЭ-проверкой (''test'') увеличивает специфичность на единицу. Булевы функции <<и>>, <<или>>, <<не>> не увеличивают специфичность правила, но их аргументы увеличивают. Вызовы функций, выполняемые из функций не увеличивают специфичность. Например, следующее правило: (defrule example (item ?x ?y ?x) (test (and (numberp ?x) (> ?x (+ 10 ?y)) (< ?x 100))) => ...) имеет специфичность 5 (считаются операторы ''(item ?x ?y ?x)'', ''?x'', ''numberp'', ''>'', ''<''). **Стратегия <<сложности>>.** Среди правил одинаковой значимости, вновь активируемые правила помещаются над всеми правилами с равной или меньшей специфичностью. **Стратегия LEX.** Для определения места правила в агенде среди правил одинаковой значимости в первую очередь используется новизна образцов, активизирующих данное правило. Каждый факт и экземпляр помечаются <<временным тегом>> для указания его новизны по отношению ко всем другим фактам и экземплярам в системе. Для определения местоположения правила в агенде образцы (факты или экземпляры), связанные с активацией каждого правила сортируются по убыванию новизны. Правило с более поздним образцом помещается выше правил с более ранними образцами. Чтобы определить относительный порядок размещения двух правил, отсортированные временные теги этих образцов, активирующих эти правила, сравниваются попарно начиная с самых больших значений. Сравнение продолжается до тех пор, пока не будет обнаружено, что временной тег одной активации больше соответствующего временного тега другой активации. Правило с большим значением временного тега помещается в агенду выше другого правила. Если одно правило имеет больше образцов, чем другое, а все сравниваемые временные теги идентичны, то правило с большим числом временных тегов помещается выше. Если два правила имеют равную новизну, правило с более высокой специфичностью помещается выше правила с более низкой специфичностью. **Стратегия MEA.** Для определения места правила в агенде среди правил равной значимости в первую очередь используется временной тег образца, связанного с первым условием в правиле. Правило, у которого временной тег первого образца (условного элемента) больше временных тегов первых образцов других правил, помещается в агенду выше них. Если временные теги первых образцов равны, то для определения места правила используется стратегия LEX. **Стратегия случайного выбора (Random Strategy).** Каждой активации сопоставляется случайное число, которое используется для определения ее местоположения в агенде среди активаций равной значимости. Это случайное число сохраняется, когда стратегия изменяется, так что при возврате к случайной стратегии восстанавливается тот же порядок (среди активаций, которые находились в агенде, когда стратегия была изменена). ===== Постановка задачи ===== Исследование процесса выполнения заданного набора правил на заданном множестве фактов при различных стратегиях разрешения конфликтов. ===== Порядок выполнения работы ===== - Cформировать с помощью конструкции ''deffacts'' исходный набор из пяти произвольных фактов (обозначаемых как ''(a)'', ''(b)'', ''(c)'', ''(d)'' и ''(e)''). - В соответствии с вариантом задания сформировать набор правил, где ''(n)'', ''(m)'', ''(p)'', ''(r)'', ''(s)'' и ''(t)'' -- некоторые произвольно выбранные факты (в квадратных скобках указана значимость правила). Сохранить подготовленные конструкции в файле //lab3.CLP//. - Загрузить среду CLIPS . Активизировать окна <> и <>. С помощью команды Load Constructs меню File (или <<горячей>> комбинации ^L) загрузить факты и правила из файла //lab3.CLP//. - Выполнить начальную установку командой ''(reset)'' (<<горячая>> комбинация -- ^E). Зафиксировать состояние списка фактов и агенды. - Выполнить в пошаговом режиме обработку правил (<<горячая>> комбинация -- ^T), фиксируя после каждого шага состояние агенды и списка фактов. - Повторить действия п. 4 и 5 при различных стратегиях разрешения конфликтов. Для изменения стратегий спользовать пункт Options меню Execution. Зафиксировать и объяснить полученные результаты. ===== Варианты заданий ===== ^ № варианта ^ Набор правил ^ | 1 | (a)(b) => (m) [5000] \\ (a)(c) => (n) [6000] \\ (b)(c)(d) => (p) [5000] \\ (a)(d)(c) => (r) [6000] \\ (m)(n) => (s) [6000] \\ (n)(p)(r) => (t) [5000] | | 2 | (a)(d)(e) => (m) [5000] \\ (c)(d) => (p) [5000] \\ (c)(b)(d) => (r)[6000] \\ (b)(a) => (n) [6000] \\ (p)(m) => (t) [6000] \\ (r)(p)(m) => (s) [5000] | | 3 | (a)(b)(c) => (r) [5000] \\ (e)(c)(d) => (p) [5000] \\ (a)(b) => (m) [5000] \\ (a)(e) => (n) [5000] \\ (m)(n)(r) => (s) [5000] \\ (m)(p) => (t) [6000] | | 4 | (e)(d)(a) => (p) [8000] \\ (b)(d) => (m) [8000] \\ (a)(c) => (n) [8000] \\ (a)(d)(b) => (r) [8000] \\ (m)(p) => (t) [6000] \\ (a)(n)(r) => (s) [6000] | | 5 | (a)(d)(e) => (p) [6000] \\ (b)(c) => (m) [7000] \\ (d)(a) => (n) [7000] \\ (e)(d)(c) => (r) [6000] \\ (b)(n) => (s) [7000] \\ (n)(p)(r) => (t) [7000] | | 6 | (c)(d)(a) => (m) [4000] \\ (c)(e) => (p) [4000] \\ (c)(b)(d) => (r) [4000] \\ (b)(a) => (n) [4000] \\ (p)(c) => (t) [6000] \\ (a)(p)(m) => (t) [5000] | | 7 | (b)(c)(d) => (r) [3000] \\ (a)(b) => (m) [3000] \\ (e)(c)(d) => (p) [3000] \\ (a)(e) => (n) [3000] \\ (m)(e)(r) => (t) [5000] \\ (m)(b) => (s) [5000] | | 8 | (a)(b)(c) => (r) [2000] \\ (e)(c)(d) => (p) [2000] \\ (a)(d) => (m) [3000] \\ (a)(e) => (n) [3000] \\ (c)(n)(r) => (t) [4000] \\ (m)(d) => (s) [5000] | ===== Содержание отчёта ===== * Цель работы. * Краткое изложение основных теоретических понятий. * Постановка задачи с кратким описанием порядка выполнения работы. * Пошаговая обработка правил, оформленная в виде таблицы для каждой стратегии, с краткими выводами по каждой из них. * Общий вывод по проделанной работе. * Код программы.