РефератыИнформатика, программированиеЭкЭкспертная система для решения задачи о коммивояжере

Экспертная система для решения задачи о коммивояжере

Саратовский государственный технический университет


Кафедра СИИ


Курсовая работа


по Методам искусственного интеллекта


Экспертная система для решения задачи о коммивояжере


Выполнил:


Проверил:


Саратов 2009 г.


Содержание


1.Постановка задачи


2.Идентификация проблемы


3.Извлечение знаний


4.Формализация


5.Описание программы


6.Тестирование программы


7.Литература


1. Постановка задачи

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


2. Идентификация проблемы

Задача о коммивояжере довольно распространенная задача. Применительно к производству ее можно интерпретировать так, имеется один станок и набор деталей. Время обработки деталей на станке одинаковое, но время переналадки станка разное. Требуется обработать все детали, но за минимальный срок. Так же ее можно адаптировать к поиску минимально короткого пути на карте между двумя пунктами. Например, в системе GPS-навигации для автомобилей, ищущей кратчайший путь между двумя пунктами на карте, имея карту дорог.


Данная проблематики имеет широкое применение в повседневной жизни.


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


Необходимые ресурсы:


­ Литература по кибернетике


­ ПК с системой Prolog


­ Эксперт


Источниками знаний в данном случае выступают:


­ Книги по кибернетике


­ Эксперт - профессор каф. СИИ Петров С.В.


3. Извлечение знаний

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


Излечение знаний будем производить путем анализа литературы по кибернетике. Для дополнительного уточнения прибегнем к консультациям эксперта.


Представим карту в виде графа. Граф - это сеть, состоящая из узлов, соединенных дугами (рис.1). Узлами в данном случае являются городами, а дуги - будут являться городами, соединяющие соответствующие узлы (города). Наличие дороги между городами означает наличие дуги между соответствующими узлами.



Рис. 1


Поиск кратчайшего пути между двумя городами означает поиск кратчайшего пути между двумя узлами графа.


В процессе поиска, как правило, возникает проблема, как обрабатывать альтернативные пути поиска.


В этой связи в Прологе существуют две основные стратегии:


1. Поиск в глубину


2. Поиск в ширину


Стратегия поиска в ширину


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


Общие принципы построения поиска в ширину:


1) Если первый элемент (вершина) первого пути (в списке путей) - это целевая вершина, то взять этот путь в качестве решения.


2) Иначе удалить первый путь и породить множество продолжений этого пути на один шаг.


Множество продолжений добавляется к списку путей в конец.


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


Стратегия поиска в глубину


Программы искусственного интеллекта имеют специфическую организацию: имеется начальное состояние; и необходимо найти путь, приводящий к конечному состоянию, т. е. цели. Где конечное состояние может представлять собой набор приемлемых состояний.


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


Стратегия поиска в глубину основана на тщательном исследовании последовательности одного варианта выбора до изучения других вариантов.


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


Поиск в глубину наиболее адекватен рекурсивному стилю программирования.


4. Формализация

Формализация знаний — разработка базы знаний на языке представления знаний, который, с одной стороны, соответствует структуре поля знаний, а с другой — позволяет реализовать прототип системы на следующей стадии программной реализации.


Исходя из полученных знаний, в пункте 3, знания можно представить в виде продукционной модели:


Если
есть дорога из А в Б, то
из А можно переехать в Б.


Причем информация о наличие дорог не избыточна, что выражено в том, что если есть дорога из А в Б, то можно переехать из А в Б, но наоборот невозможно, то есть из Б в А. Для преодоления данного затруднения можно пойти двумя путями:


1. Добавить еще одно утверждение в продукционной модели, что если есть дорога из А в Б, то можно переехать не только из А в Б, но и из Б в А.


2. Программно реализовать, чтобы система понимала, что наличие дороги о

значает, что можно переехать из А в Б, но и наооброт.


5. Описание программы

Определим отношение


path(A,Z,P,
D
)
,


где P - ациклический путь между вершинами A и Z в графе, представленном следующими дугами:


arca(a,b,1).


arca(a,c,1).


arca(b,e,1).


arca(b,d,1).


arca(c,d,1).


arca(c,g,1).


arca(c,f,1).


arca(d,e,1).


arca(e,f,1).


arca(f,x,1).


Дуги прописаны согласно рис.1.


Для реализации метода поиска выберем метод поиск в глубину, который основан на следующих соображениях:


­ Если A = Z, то положим P = [A];


­ Иначе нужно найти ациклический путь P1 из произвольной вершины Y в Z, а затем найти путь из A в Y, не содержащий вершин из P1.


Введем отношение


path1(A,P1,P,
D
),


означающее, что P1 - завершающий участок пути P.


Между path и path1 имеет место соотношение:


path(A,Z,P,D) :- path1(A,[Z],P,D)
.


Рекурсивное определение отношения path1 вытекает из следующих посылок:


­ "граничный случай": начальная вершина пути P1 совпадает с начальной вершиной A пути P;


­ в противном случае должна существовать такая вершина X, что: 1) Y - вершина, смежная с X, 2) X - не содержится в P1, 3) для P выполняется отношение path(A,[Y|P1],P).


Отношение можно реализовать согласно:


path(A,Z,Path,C):- path1(A,[Z],0,Path,C).


path1(A,[A|Path1],C,[A|Path1],C).


path1(A,[Y|Path1],C1,Path,C):- arca(X,Y,CXY),


not(member(X,Path1)),C2=C1+CXY,path1(A,[X,Y|Path1],C2,Path,C).


Где отношение member - определяет принадлежит ли элемент списку, реализованное следующим кодом:


member(Head,[Head|_]).


member(Head,[_|Tail]):- member(Head,Tail).


Для реализации выбора оптимального выбора (минимальная длина) среди перечня путей введем отношение db0 и db:


db0(X,Y) :-path(X,Y,P,C), assert(db_path(X,Y,P,C)).


db(X,Y):-db_path(X,Y,P,C), path(X,Y,MP,MC), MC<C,!,


retract(db_path(X,Y,P,C)), assert(db_path(X,Y,MP,MC)), db(X,Y).


Отношение db0 инициализирует первый возможный путь. Если данный путь не единичен, то db инициализирует следующий путь, и в то же время сравнивает длины двух данных путей. В процессе последующих рекурсий и сравнения остается только один путь, длина которого минимальна.


Текст
программы
:


domains


i=integer


s=symbol


list=s*


database


db_path(s,s,list,i)


predicates


path(s,s,list,i)


path1(s,list,i,list,i)


member(s,list)


arca(s,s,i)


db0(s,s)


db(s,s)


run(s,s)


start


goal


start.


clauses


start:-makewindow(1,7,7,"Expert System",1,3,22,71),clearwindow,


write("Enter the name of cities"),nl,


write("The first city: "), readln(First),nl,


write("The second city: "), readln(Second),nl,


run(First,Second),readchar(_).


arca (a,b,1).


arca(a,c,1).


arca(b,e,1).


arca(b,d,1).


arca(c,d,1).


arca(c,g,1).


arca(c,f,1).


arca(d,e,1).


arca(e,f,1).


arca(f,x,1).


run(Start,End):-db0(Start,End), db(Start,End), db_path(Start,End,MP,MD),


write("Optimum way: "),write(MP),nl,


write("Length of an optimum way="),write(MD),


nl,nl.


path(A,Z,Path,C):- path1(A,[Z],0,Path,C).


path1(A,[A|Path1],C,[A|Path1],C).


path1(A,[Y|Path1],C1,Path,C):- arca(X,Y,CXY), not(member(X,Path1)),C2=C1+CXY, path1(A,[X,Y|Path1],C2,Path,C).


member(Head,[Head|_]).


member(Head,[_|Tail]):- member(Head,Tail).


db0(X,Y) :-path(X,Y,P,C), assert(db_path(X,Y,P,C)).


db(X,Y):-db_path(X,Y,P,C), path(X,Y,MP,MC), MC<C,!,


retract(db_path(X,Y,P,C)), assert(db_path(X,Y,MP,MC)), db(X,Y).


db(_,_).


6. Тестирование программы

а) Пусть имеем следующий граф:








Рис.2 Рис.2а

Ищем оптимальный путь из a
в х
, согласно графу оптимальный путь содержит следующие узлы: a
c
f
x
, что изображено на рис.2а.


Программа:



Данные ручного расчета и программы совпадают.


б) Изменим длину ребра a
-
c
:








Рис.3 Рис.3а

Ищем оптимальный путь из a
в х
, согласно графу оптимальный путь содержит следующие узлы: a
b
e
f
x
, что изображено на рис.3а.


Программа:



Данные ручного расчета и программы совпадают.


в) Изменим длину ребра b
-
d
:








Рис.4 Рис.4а

Ищем оптимальный путь из a
в х
, согласно графу оптимальный путь содержит следующие узлы: a
b
d
e
f
x
, что изображено на рис.4а.


Программа:



Данные ручного расчета и программы совпадают.


Литература

1. И 57. Использование Турбо-Пролога: Пер. с англ.-М.:Мир, 1990.-410 с., ил.


2. Б 87. Братко. Программирование на языке Пролог для искусственного интеллекта: Пер. с англ. -М.: Мир, 1990.- 560 с., ил

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Экспертная система для решения задачи о коммивояжере

Слов:1287
Символов:12841
Размер:25.08 Кб.