![]() |
|
![]() ![]() ![]() |
|
Student00 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 22.11.2007 Где: Барнаул Репутация: нет Всего: нет |
В универе задали сделать экспертную систему. Интерфейс на Delphi я реализовал.
Но самое сложное - это так называемый решатель. Т.е. набор правил на которых основывается программа при выборе решения. Конечно м/б бы реализовать тупо через If then, как обычный тест. Но соль в том, что нужно сделать так, что бы пользователь-администратор (при работе с готовой программой) мог изменить набор этих привил, без вмешательства в исходный код программы. Вопрос: Ребят, подскажите, пожалуйста, как организовать подобную весч. |
|||
|
||||
Student00 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 22.11.2007 Где: Барнаул Репутация: нет Всего: нет |
Неужели никто никогда на создавал экспертную систему и базы знаний?
|
|||
|
||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Ну во первых это далеко не тривиальная задача
![]() В основе экспертной системы лежит if-then, но в коде так не реализовать. Есть список задач, в который добавляются все промежуточные цели. Цель это правило, для удовлетворения if-then, при чём может быть направлена не только от причины к следствию, но и наоборот. В обоих случаях получаем массы вариантов, в которых система ищет различия и собирает варианты в группы. При чём не тупо отслеживая первые причины от текущего следствия, но и включая гипотезы (статически наиболее частые правила к примеру). Всё это со временем растёт, конфликты исключаются. Раз интерфейс есть, тогда самое сложное позади ;-) Есть цель - набор существительных с требуемыми свойствами (к примеру, человек:[сытый, счастливый]), выведенное к примеру из "хочу жрать!". Есть входное состояние (может быть пустым). Есть здоровенная база, состоящая из (ключь-причина) -> (описание, ключь-следствие), где ключь это набор состоящий из {существительных (что) и прилагательных (какие)} (для полноты вводят текущее состояние (действие, глагол)). В итоге по ключу переходим в следующий ключь с конкретными инструкциями для человека, как добиться этого результата. По началу ищем по (ключь-следствие), до тех пор пока (ключь-причина) не совпадёт с начальными условиями. Заметим, что текущее следствие может быть составным, т.е. быть результатом параллельных (или ранее выполненных) действий нескольких причин. Твоя задача разбить текущее следствие на все возможные комбинации и искать по ним причины. Найденные ключь-причины группируются по совпадениям (а также может каким специальным подсказкам), затем у человека спрашиваем уточнение, что бы резко уменьшить количество вариантов. Пример:
Как видим, если частичное (причина -> следствие) совпало, то цель упрощается, иначе для следствия ищем причину (замещение). Любое требование без условия (eg. "сытый") можно представить как условие, принимающее любой ключ-причину. Ключ можно разбить на (cartesian product) пары [(один термин причины -> один термин следствия)]:"связанное действие", но связь (принадлежность к своему ключу) конечно же терять нельзя. В итоге хранить инфу можно в SQL базе (sqlite к примеру), но за скорость не отвечаю ![]() P.S. а хотел в две строчки описать... ![]() -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
Student00 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 22.11.2007 Где: Барнаул Репутация: нет Всего: нет |
Сложно это конечно все. но попытаюсь разобраться че к чему.
Спасибо! )) |
|||
|
||||
Todd |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 14.3.2006 Где: Одесса Репутация: нет Всего: нет |
У меня усть готовая программа на java, если надо - скину
![]() |
|||
|
||||
Student00 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 22.11.2007 Где: Барнаул Репутация: нет Всего: нет |
Скинь пожалуйста. )) [email protected] |
|||
|
||||
Student00 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 22.11.2007 Где: Барнаул Репутация: нет Всего: нет |
Вобщем куча проблем и очень мало решений...
--- Понятное дело сделать её никого не прошу, а скидываю лишь, что бы м/б хотябы представлять что к чему... Программа пишется на Delphi 7 --- Опишу ситуацию: 1) Сама программа предполагает: Выбор бытовой техники. Когда пользователь не разбирающийся что к чему путем ответов на наводящие вопросы придет к оптимальному решению. 2) Интерфейс, как можно увидеть - вроде бы создан. Подгружаются вопросы. Сохраняются ответы (answers.ini) 3) Как можно увидеть формат записи (больше я ничего не придумал) текущих ответов RadioGroup1Click такой:
где [Item0] - группа товаров. Q0 - номер вопроса. 0, 1, 2 - индексы ответов. 4) Первостепенная проблема такая: Надо как-то суммировать все варианты ответов, но при этом, организовать код, так, чтобы if then свести к минимуму. Т.е. проще говоря, что бы пользователь-админ мог без вмешательство в код Delphi добавлять или удалять вопросы (с ответами конечно). А программа не кричала, что мол не найден вопрос. Что касается самого добавления и удаления - это потом. Главное сейчас организовать процедуру, которая как бы считывала из answers.ini параметры (текущий вид товара, количество вопросов по этому виду, ну и какие индексы ответов в текущий момент имеются), что бы вернувшись назад и снова ответив на вопросы новые индексы опять считывались и исходя из этого выдавался соответствующий ответ. Как все это организовать в Delphi я понятия не имею. Возможна имеющаяся структура ini файлов не позволят это сделать? Поэтому прошу, пожалуйста, товарищи, помогите!!!!!!!! Это сообщение отредактировал(а) Student00 - 3.2.2008, 12:49 Присоединённый файл ( Кол-во скачиваний: 54 ) ![]() |
|||
|
||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Student00, ты бы определился, экспертная это у тебя система, или problem solving софтина. Первое обучается "само по себе", т.е. разными техниками находит причино-следственные связи, избегая/разрешая при этом конфликты - штука сложная, активно пересекающаяся с теориями искусственного интеллекта. Второе это тупо wizard, на манер тех, что помогают создать тебе ярлык в виндах или создать новый проект в дельфях - оно реально не обучаемое.
Если второе (а я вижу что это именно так), то тебе нужны деревья решений, каждый узел которых - вопрос. Дерево естественным образом представляется в XML. Каждый узел (нода) содержит вопрос, исходящие рёбра - это ответы. Также узел содержит тэг(и) свойства , которое опрашивал вопрос родительского узла. Искомые обьекты помечаются наборами таких тегов. Пройдя по дереву мы собираем теги, т.е. ограничиваем будущую выборку объектов. Человеку не обязательно проходить по дереву до самых листьев, просто с каждым новым уточнением множество выбранных объектов уменьшается (либо пере-сортируется, так, что бы объекты с наибольшим числом совпавших тегов выходили выше в результатах). Сами объекты лучше хранить в какой нибудь готовой БД, на подобии sqlite, т.к. выборка по произвольному набору тегов - задача не тривиальная (но интересная в реализации ;-) ). Проход по деревьям решений это просто проход по DOM дереву, тут ничего сложного нет. P.S. что-то проблемы у тебя совсем детские... чтение .ini файла... я думал тут серьёзное что намечается... :| -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
Student00 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 22.11.2007 Где: Барнаул Репутация: нет Всего: нет |
А что может намечаться в университете. Мне б лишь бы сдать её притом троечка устроит. Но раз препод называет это задание Экспертная система, то нужно хотябы немного сделать видимость. Хотя конечно до реальной ЭС - далеко. Просо если я тупо ИФами буду перебирать варианты ответов, то это получиться обычный тест, за который он и тройки не поставит. А вот если замутить все в одной процедурке (скорее всего использовать придестя цикл), то м/б на троечку и наберется. А ini разве не подойдут для этого? Чтобы изних собирать ответы? Это сообщение отредактировал(а) Student00 - 2.2.2008, 11:10 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
касательно чтения ini-файла: советую создать новую тему в разделе Delphi - там люди ближе к нему, скорее и детальнее подскажут (если я не ошибаюсь, там даже какой-то компонентик есть)
а тут лучше обсуждать более теоретические вопросы по ЭС, которые возникнут... -------------------- qqq |
|||
|
||||
Student00 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 22.11.2007 Где: Барнаул Репутация: нет Всего: нет |
Может быть действительно перенести в один из разделов по Delphi Тогда просьба модераторов, чтобы не плодить похожие ветки, пожалуйста, перенести эту темку в подходящий раздел! )) |
|||
|
||||
Wowa |
|
|||
Эксперт ![]() Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
одна тема - один вопрос. Правила форума: http://forum.vingrad.ru/index.php?act=boardrules Интересует что-то по дельфи- спрашивай там. Эта тема остается тут. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Маскирование. Каждый вопрос имеет несколько вариантов ответа, каждый из которых кодируется своей группой битов в суммарной битовой маске выбора. А каждый возможный окончательный вариант выбора характеризуется своим соответствующим ему набором битовых масок. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
думаю, время поднять тему
![]() у меня то же самое задание, что и у автора, но я даже тему не могу выбрать ![]() кто-нибудь может подсказать? ![]() -------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |