Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Постановка 11

Побудова остовного дерева

Q([],0).

Edge(e, d, 9).

Edge(b, d, 0).

Edge(c, d, 12).

Edge(a, b, 3).

Edge(a,c,8).

Clauses

Q(slist,integer).

Cyclic.

Lenght(slist,integer).

Member(string,slist).

E(string,string,integer).

Edge(string,string,integer).

Predicates

Domains

Постановка 10.

Append(Tail,B,NewTail).

Append(Tail,Temp,New),weight(A,New,Ans).

Edge(e, d, 9).

Edge(b, d, 0).

Edge(c, d, 12).

Edge(a, b, 3).

Edge(a,c,8).

Clauses

Append(l,l,l).

N(slist,slist).

Weight(string,l,slist).

Short_path(string,string,slist).

Member(string,slist).

E(string,string,integer).

Edge(string,string,integer).

Predicates

Domains

Постановка 9.

Placeone(X,Tail,NewTail).

placeone(X,[],[X]).

 

Зауваження: вбудований предикат findall(X, P, L) породжує список L всіх об'єктів X, що задовольняють Р. Якщо P завершується неуспіхом, то й findall завершується неуспіхом.

 

Побудова на графі G, заданому неявно, найкоротшого short_path(Х,Y,L) за кількістю ребер шляху L між вершинами Х та Y.

 

slist=string*

l=slist*

way=w(integer,slist) %Зберігає вартість шляху і шлях

wlist=way*

e(A,B,C):-edge(A,B,C);edge(B,A,C). %граф не є орграф

short_path(A,B,P):-weight(A,[[B]],P).

weight(A,[[A|T]|_],[A|T]):-!.

weight(A,[H|Tail],Ans):- findall(B,n(H,B),Temp),!,

weight(A,[_|Tail],Ans):-weight(A,Tail,Ans).

append([],B,B).

append([H|Tail],B,[H|NewTail]):-

n([H|Tail],[B,H|Tail]):- e(H,B,_),not(member(B,Tail)).

Встановлення циклічності cyclic графа перевіркою умови: граф є циклічним, якщо кількість M його дуг більша за кількість N вершин, зменшених на одиницю.

 

slist=string*

l=slist*

way=w(integer,slist) %зберігає вартість шляху і шлях

wlist=way*

e(A,B,C):-edge(A,B,C);edge(B,A,C). % граф не орграф

cyclic:-findall(X,e(X,_,_),L),q(L,N),lenght(L,M),M>(N-1).

lenght([],0).

lenght([_|Tail],L):- lenght(Tail,L1),L=L1+1.

q([H|Tail],N):-member(H,Tail),!,q(Tail,N).

q([_|Tail],N):-q(Tail,N1),N=N1+1.

Находим список всех ребер, считаем число N вершин, число M ребер, и проверяем віполнимость критерия.

 

Граф є зв'язним, якщо між будь-якими двома його вершинами існує шлях. Нехай G = <V, Е> - зв'язний граф з множинами вершин V і ребep Е, тоді остовне дерево графа G - це зв'язний граф Т = <V, Е'>, де Е' - підмножина множини Е така, що

(1) Т - зв'язний граф,

(2) у Т нема циклів.

Виконання цих двох умов гарантує, що Т є деревом. Для графа рис. 1(а) існує три остовних дерева, що відповідають наступним трьом спискам ребер:

tree1 = [а-b, b-c, c-d]

tree2 = [а-b, b-d, d-c]

tree3 = [а-b, b-d, b-c]

де терми форми X-Y позначають ребра між вершинами Х і Y. За корінь можна взяти довільну з вершин списку. Остовні дерева становлять інтерес, наприклад у задачах проектування мереж зв'язку, оскільки дозволяють мінімальним число ліній встановити зв'язок між будь-якими двома вузлами, що відповідають вершинам графа.

Визначимо процедуру tree_column(G,Т), де Т - остовне дерево зв'язного графа G, побудови остовного дерева в такий спосіб:

· почати з порожньої множини ребер і поступово додавати такі нові ребра, що не утворюють цикли;

· цей процес продовжувати, поки можна приєднувати ребра;

· отримана множина ребер буде остовним деревом.

 

Відсутність циклів забезпечується правилом:

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

Програма використовує відношення (розширити): expand(Tree1, Tree, G), всі аргументи якого є множинами ребер у формі: [а-b, b-с, b-d, c-d]

 

tree_column(G, Tree):- % Тree - остовне дерево

member(Edge, G),

expand ([ Edge ], Tree, G).

 

expand(Tree1, Tree, G):-

<== предыдущая лекция | следующая лекция ==>
Edge(e, d, 9) | Алкоголь і алкоголізм. Нікотин і нікотиноманія
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 309; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.