- •Введение
- •1.Основные элементы языка Пролог. Структура программы на языке Пролог.
- •2. Структуры. Состав логических операций в Прологе. Решение логической задачи в tp.
- •3. Использование рекурсии. Построение программ с использованием основных структур данных Пролога - списков.
- •1.Принадлежность.
- •2.Сцепление.
- •4. Использование механизма отсечения для оптимизации поиска решения в программах на Прологе.
- •5. Управление стратегией вывода в экспертных системах с помощью обратной цепочки рассуждений.
- •6. Управление стратегией вывода в экспертных системах с помощью прямой цепочки рассуждений.
- •7.Управление стратегией выбора в экспертных системах с помощью эвристик.
- •8. Получение вывода экспертными системами в условиях неопределённости.
- •9. Организация в экспертных системах ответов на вопросы “Почему” и “Как”.
- •Рекомендуемая литература.
7.Управление стратегией выбора в экспертных системах с помощью эвристик.
ЭС имеют специфическую организацию: программа имеет начальное состояние и осуществляет поиск конечного состояния (цели).Существуют следующие стратегии поиска: поиск в ширину и поиск в глубину. Эти стратегии гарантируют рассмотрение всех возможных вариантов. Поиск оказывается более эффективным, если некоторый механизм в пунктах выбора сам сможет делать наиболее желательный выбор. Это так называемая эвристика поиска. Эвристика - это эмпирическое правило, с помощью которого человек - эксперт в отсутствие формулы или алгоритма пытается осуществить свои намерения.
Существует два типичных способа включения эвристической информациии о конкретной задаче в поисковую структуру: с помощью эвристической оценочной функции, которая "взвешивает" утверждения конкретной задачи и определяет их относительную значимость; с помощью эвристической информации, непосредственно помещённой в правила.
Рассмотрим более подробно второй способ. Допустим, мы хотим создать систему, позволяющую составить оптимальное расписание занятий для студентов колледжа по курсу вычислительной техники. Предварительные предположения:
- каждый студент должен пройти за семестр четыре курса;
- следует определить обязательные курсы для данной специализации;
- каждому студенту разрешается выбрать факультативные курсы;
- нужно включить в учебный план общеобразовательные дисциплины;
- необходимо обеспечить в каждом семестре хотя бы один факультативный курс.
Эти предположения станут эвристиками, когда будут включены в правила для составления расписания.
Программа на Прологе содержит набор общих данных. Это описание обязательных курсов; факультативных курсов; курсов, которые будут читаться в данном семестре; курсов, пройденных студентом; курсов, предварительных для данного курса (при этом указываются непосредственные предварительные курсы). Фрагмент программы выглядит следующим образом:
reg ("введения в вычисления"). /* обязательные курсы */
reg ("структуры данных").
reg ("ассемблер").
и т. д.
elec ("информатика"). /* факультативные курсы */
elec ("трансляторы").
elec ("анализ алгоритмов").
и т. д.
given_now("введения в вычисления"). /* читают в данном */
given_now("мат. анализ2"). /* семестре */
и т. д.
waived("введение в вычисления"). /* временно отложить */
waived("мат. анализ1").
passed("структуры данных"). /* изученные курсы */
passed("ассемблер").
и т. д.
impreq("структуры данных","введения в вычисления").
impreq("мат. анализ2","мат. анализ1").
/*Непосредственным предварительным условием для изучения "мат. анализ2" является знание "мат. анализ1"*/
Перейдем к описанию правил:
pos_req_course (X): - req (X), /* правило для обязательных курсов */
not (done_with(X)),
given_now (X),
have_preq_for (X).
Здесь утверждается, что X будет возможным обязательным курсом в расписании, если он является обязательным курсом, если студент его еще не прошел, если он должен читаться в этом семестре и если студент изучил все предварительные курсы.
Далее определим курсы, пройденные студентом:
done_with (X): - waived (X).
done_with (X): - passed (X).
all_done_with (X): - findall (Y, done_with(Y), X).
Все пройденные курсы заносятся в список X.
Затем определяются все предварительные курсы в том случае, если все предварительные курсы, необходимые для изучения обязательного:
have_preq_for (X): - all_preq_for (X, Z),
all_done_with (Q),
subset (Z, Q).
/* Студент прошел все предварительные курсы в том случае, если все предварительные для X курсы находятся в списке Z, а все курсы, пройденные или пропущенные им, находятся в списке Q, и Z входит в Q. Другими словами, Z есть подмножество Q. */
Опишем список, содержащий все предварительные курсы для данного курса Y:
all_preq_for (Y, Z): - findall (X, preq (Y, X), Z).
preq (X, Y): - impreq (X, Y) .
preq (X, Y): - impreq (X, Z), preq (Z, Y).
В программе использованы два имени: непосредственный предварительный курс (impreq) и более общий предварительный курс (preq). Это предотвращает зацикливание в дереве поиска.
Правило для факультативного курса выглядит так:
pos_elec_course (X): - elec (X),
not (done_with (X)),
given_now (X),
have_preq_for (X).
Наконец опишем правило, которое выберет вероятное расписание, исходя из cписка возможных курсов. Однако необходимо, чтобы было найдено самое лучшее расписание, а затем все альтернативные. Это обеспечивается порядком использования правил в Прологе. Первым помещается правило, определяющее наилучшее расписание, вторым – для следующего по качеству расписания и т.д. Набор правил имеет вид:
pos_schedule(A, B, C, "gen.elec"): - /*elec-факультативный */
pos_req_course (A), /* курс, который выбрал */
pos_req_course (B), /* студент */
pos_req_course (C),
ordered3 (A, B, C). /* предикат исключает */
/* повторение курсов */
pos_schedule (A, B, C, "gen.elec"): -
pos_req_course (A),
pos_req_course (B),
pos_elec_course (C),
ordered2 (A, B).
pos_schedule (A, B, C, "gen.elec"): -
pos_req_course (A),
pos_elec_course (B),
pos_elec_course (C),
ordered2 (B, C).
pos_schedule (A, B, C, "gen.elec"): -
pos_elec_course (A),
pos_elec_course (B),
pos_elec_course (C),
ordered3 (A, B, C).
pos_schedule (A, B, "gen.elec", "gen.elec"): -
pos_req_course (A),
pos_req_course (B),
ordered2 (A, B).
pos_schedule (A, B, "gen.elec", "gen.elec"): -
pos_req_course (A),
pos_elec_course (B).
pos_schedule (A, B, "gen.elec", "gen.elec"): -
pos_elec_course (A),
pos_elec_course (B),
ordered2 (A, B).
pos_schedule (A, "gen.elec", "gen.elec", "gen.elec"): -
pos_req_course (A).
pos_schedule (A, "gen.elec", "gen.elec", "gen.elec."): -
pos_elec_course (A).
pos_schedule ("gen.elec", "gen.elec", "gen.elec", "gen.elec").
Упражнения:
-
Какие изменения нужно внести в программу “Помощник студента”, чтобы курсы могли иметь альтернативные предварительные курсы?
-
Создать модуль, используемый совместно с программой “Помощник студента” и эффективно задающий вопросы об изученных и сданных студентом курсах.
-
Реализовать пример ЭС, которая составляла бы оптимальное меню для ресторана, используя как образец программу “Помощник студента”.
-
Реализовать пример ЭС, которая составляла бы комплекс утренней гимнастики на основе индивидуальной подготовки человека.