Почитав пару статей, несколько глав книги про экспертные системы, описание языка CLIPS, я
задался целью создать свою систему. Цель
проекта была ясна – создание некоторой модели мышления робота посредством языка CLIPS в среде Windows как приложение (старец в роли Эйнштейна сказал, чтобы С, С++ я не использовал
ни под каким предлогом, после недолгой дискуссии я согласился). Теперь поделюсь мыслями старца. CLIPS – это и есть доработанная версия С, но только под определенную задачу – создание экспертных систем. Плюсов много – это и многоплатформенность:
1. MacOS
2. OpenVMS(куда уж без него)
3. Windows
4. UNIX (что именно подразумевается под данной мыслью - непонятно)
5. DOS
Так что проблем с выбором оси вообще не должно быть. И еще заметный плюс – свободные версии под Win и Unix. А то терпеть не могу нелицензионное ПО.
Только даже не надейся увидеть привычный стиль и лексику – все изменено, причем весьма. Конечно, я пойму слова читателя: “я хорошо знаю: C, FORTRAN, Python. Зачем мне вообще учить какой-то левый язык, и то ради интереса, ведь реальных задач, которые можно выполнять в жизни, не доведется решать посредством CLIPS!” К сожалению, я полностью согласен со словами говорящего. Хотя большинство операторов позаимствовано из FORTRAN’a (я всегда верил в этот язык).
Но сама тема какова! Я думаю только ради этого можно выучить язык CLIPS (к сожалению, я пока не могу более подробно описать язык. Так, галопом… Но если заинтересованные люди есть, то я обязательно уделю языку 1 – 2 статьи. Все зависит только от
вас, пишите всюду, где можно :))
Задача
Разработать Экспертную систему с главным предназначением – Боевые действия.
Система должна разделять людей на «Враг», «Союзник», «Нейтрал». Так как я страшный милитарист, обожаю армию и военные разработки, то в систему будет заложено в силу политических событий определение «американец» - враг, житель России – «нейтрал». Основные функции:
1. Ведение боевых действий (огонь, перемещение, маскировка, отступление).
2. Разведка.
3. Охрана (защита, защита любой ценой).
Необязательно – справочная система (кто – что захочет).
Самым важнейшим критерием является самообучение (одно из главных отличий ЭС от любого другого программного продукта). Одним из главных факторов «тормозов» будет представление знаний. Саму систему можно написать и на Pascal’e. А вот 2 последние задачи весьма тяжелые и будут реализовываться на CLIPS. В необязательную часть я включу тестирование системы после боя (точнее уже механической модели).
Теория
Теория будет встречаться на протяжении всех серий. В первых 2-х статьях особенно. Самое проблематичное – это еще и логика: ведь задача может поменяться за доли секунды, основываясь на входных данных, а если воспользоваться простым эвристическим методом, то робот зависнет посреди поля. Тут многие простые и очевидные вещи для робота представляют совершенно неразрешимую задачу. Допустим, союзник собирается открыть огонь, следовательно, требуется открыть ответный огонь, а не стоять как тупой бот. Также, что наиболее важно, в задачу может входить и идти к цели с группой прикрытия, разумеется, есть вероятность «дружеского» огня, поэтому просто необходимо разработать правила, позволяющие определять поведение объекта и квалифицировать их прямо на месте. Разумеется, все здесь довольно сыро, поэтому если бы я и начал создавать робота, я бы 98% времени тестировал робота (вероятность, что он выйдет из под контроля и начнет вести сплошной огонь просто огромна). Конечно, с финансированием туго (мой энтузиазм), но если бы повезло, я после создания теоретической модели принялся бы создавать физическую, на базе OpenVMS (я был бы уверен, что хоть какой-то контроль над роботом будет). И поставил бы поначалу ограничение на получение ресурсов (вдруг придется “ловить” творение). Я придаю весьма большое внимание выходу робота из-под контроля, так что эта задача будет встречаться всегда. Вообще робот-солдат это только один спектр применения ЭС. Представь, если разработать всего одного бота для какой-нибудь стрелялки, который каждый раз изменял свое поведение, да и еще бы обучался новой тактике. Это будет хит! Если честно, я бы доверил роботу и законодательную функцию и роль бюрократического аппарата – лет через 5 по уровни жизни Россия обогнала бы Кувейт, и слетали куда-нибудь дальше Луны.
Символические вычисления
Перейдем к символическим вычислениям (кто знает теорию, может начать читать только 2 статью).
С помощью символических вычислений решаются основные задачи: представление знаний. Это наилучший вариант, когда можно реализовать систему порождающих правил и благодаря именно символическим вычислениям в CLIPS можно всего парой команд добавлять новые факты при разработке:
CLIPS> (assert (small river))
<Fact-0>
Эх… Обещал поменьше практики. (Примечание: CLIPS> - это стандартное диалоговое окно приложения, почти как приглашение $ ком. интерпретатора DCL, assert – функция добавления нового факта, в нашем случае small river. <Fact-0> - это уже ответ среды, что факт создан). В данном примере показано, что факт small river занесен в память, и в случае использования системы порождающих правил (отражение, прозрачность, почва, географические данные), наш испытуемый попробует перейти реку, чтобы не терять время (возможность реального случая данного примера просто огромна – приблизительно 60-70 %).
Теперь главная гипотеза, на которую опирается сама возможность использования символических вычислений:
физическая символическая система имеет все необходимые и достаточные средства для того, чтобы осуществлять осмысленные действия.
Эта гипотеза была разработана еще в 1976 году Ньюэллом и Саймоном. Вероятно, что найдутся индивиды, которые согласны с гипотезой, но считают, что ее надо доработать. Пишите, я с великим удовольствием выслушаю
вас, и может приму вашу сторону. Обращение к читателям: я уверен, что среди читателей найдутся инженеры, знающие PROLOG. Этот язык тоже превосходно подойдет для символических вычислений. Для работы с символическими вычислениями наиболее подходит модель “данные-списки”. Т.е. данные реализовываются в виде списков. Данную задачу можно решить и языком
C (т.е. работа со списками). Но у CLIPS есть весомый аргумент – автоматическое распределение памяти, т.е. проблема buffer overflow не будет стоять, а в случае возникновения проблем при работе со списками, то лучше использовать обыкновенный массив. На этом я заканчиваю, надеюсь, основной смысл применения символических вычислений понятен.
Представление знаний
Само представление знаний будет производиться путем формального описания информации (данных или массивов данных – кому как) символическими вычислениями. Т.е. не типичные математические вычисления, а работа с символьной информацией.
Я постараюсь раскрыть эту тему только поверхностно. Рассмотрим теперь представление простейших ситуаций на примере, как это организовано в системе STRIPS (она была разработана давно, и была предназначена для
перемещения ящиков из разных комнат).
at (Player, room1)
Т.е. это означает, что Player находится в комнате 1. Под Player понимается сам робот. Приставка at служит как раз для указания использования системы “аргумент-предикат”.
Я особо не хочу останавливаться на этой теме. Это практическая часть, и вернусь я к ней чуть позже.
Приобретение знаний
План:
1.Способы
2.Проблемы
3. Маленькие примеры
1. Существует 2 основных способа приобретения знаний.
а) Специалисту (в нашем случае военному) задаются вопросы. Эксперт отвечает на них вслух, и рассуждает тоже вслух. Позже специалист уходит, а
вы остаетесь и вместе с помощником анализируете информацию. После кропотливо разрабатываете правила для каждого конкретного случая и описываете все это в создаваемой ЭС.
б) Второй – это дополнение первого с использованием современных средств. Т.е. знания формируются и предыдущим способом и с использованием современных программных средств. Второй способ проще, но денег на покупку спец программного продукта у меня нет, поэтому, придется действовать первым методом, тем более по надежности второй способ пока уступает, все равно придется усиленно тестировать систему, практически выигрыш во времени незначительный.
Так что приобретение знаний не сложный процесс, когда знания собираются в один массив, и потом используются, как это кажется, а просто разработка соответствующих правил на каждый факт, действие, ситуацию.
2. Проблемы. Проблем будет много, т.к. придется практически все ситуации просчитывать. Простой пример – робот поскальзывается на грязи, а так как мы вероятнее всего используем 64-битный процесс, то робот должен найти соответствующий факт и посмотреть на правило, которое относится на этот факт. А теперь: что он там найдет? Да ничего. Правил нет. Робот создал факт, но не может ничего сделать. Выход: приглашение каскадера и долго его опрашивать по схеме: “наклон-действие”. Опрос будет длиться несколько часов и поначалу принесет мало результатов. И таких проблем очень много – и все надо рассчитать. Обычной ЭС в виде приложения этого не нужно, но у нас ЭС в виде приложения только пока…
3. Примеры. Рассмотрим простой пример:
(defrule help
“The help to a landing”
(salience 10000)
(Landing under fire)
(There has come the order on the help)
(The distance is less than 2000 meters up to a landing) =>
(assert (help landing)
(assert (Fire to enemy)
(assert (The help at any cost)
Теперь рассмотрим сам пример. Здесь обращение к функции defrule –help это чисто символическое название, и назвать можно было Vladimir. Salience 10000– это обыкновенный приоритет, чем выше – тем больше шансов, что интерпретатор выполнит его первым. “The help to a landing” - Помощь десанту. Дальше идут сами факты - “Десант под огнем”, “Пришел приказ о помощи”, “Расстояние меньше 2000 метров до десантников”. Как добавлять факты в базу фактов – я рассказывал. Если факты совпадут – ЭС добавит в базу следующие 3 факта – “помощи десанту”, “огонь по врагу”, “ помощь любой ценой”. И выполнит 3 факта. Последний факт – это я уже выделываюсь, это совершенно непонятный факт, и его надо хорошо расписать. Я описал пример – не опрашивая эксперта и слабые места в коде видны сразу же.
Сстатья подходит к концу. Я описал самую маленькую и ничтожную часть. Надеюсь, я заинтересовал тебя. Как видишь CLIPS не сложный язык, выучи функции, процедуры, математические функции взяты из FORTAN. Язык не сложный – лепи операторы, где хочешь, лексика не сложна.
Заключение
Это не конец. Это только начало. Очень часто на университетских ftp-архивах можно получить довольно много интересных утилит. Советую тебе почитать про оболочку MYCIN и EMYCIN, также про STRIPS. Может тебе посчастливится найти непосредственно уже готовый shell, на основе этих Экспертных Систем. До нового года я постараюсь написать еще одну статью. Основное внимание я уделю рассмотрению эвристику, т.к. при выборе соответствующих решений и правил, часто мы будем опираться на эвристики. Удачи! Мы победим!