Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2docx-1.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
2.27 Mб
Скачать

27. Представления графов. Алгоритмы поиска пути (в глубину, в ширину).

Df Направлений граф (U, V) пара, где U – мн-во вершин, V U х U – мн-во дуг. Для предст-я графов обычно исп-т матр.см-ти или динамич-е списочные структуры. В ЛП удобнее предс-ть граф в виде пар дуг. Это похоже на исп-ие матр.см-ти, но удобнее, естественнее и экон-е. +вЛПможно задавать дуги правилами.DfПуть в графе G=<U, V> из a\inU в b\inUпосл-ть {x_i}^n, где x_i\inU, x_0=a, x_n=b, i<x_{i-1}, x_i> \in V.

  1. % Граф

  2. door(a, b).

  3. door(b, c). door(b, d).

  4. door(c, d).

  5. door(d, e). door(d, f).

  6. door(f, g).

  7. door(h, i).

  8. % Движение по графу

  9. move(X, Y):- door(X, Y), door(Y, X).

Задача поиска в графе: пусть имеется граф G, заданный предикатом move/2. Необх-мо по 2м заданным вершинам a и b найти все пути/один путь/кратчайший путь и т.д. из a в b в графе G. В глубину Для исследования пути l_max и дерева с коэф-м ветвления b: time=O(l_max), space=O(b^{l_max}). В процессе поиска путь из нач. верш. продлева-ется одним из возможных способов, пока не будет продлён в конечную вершину. Углубляется по дереву. Аль­тернативный путь - только в случае неудачи.

    1. search_depth(A,B,P):-

    2. depth([A], B, L), reverse(L, P).

    3. depth([X|T], X, [X|T]).

    4. depth(p, F, L):-

    5. prolong(P, P1), depth(P1, F, L).

    6. prolong([X| T], [Y, X |T])

    7. move(X, Y), not(member(Y, [X | T])).

В ширину Для иссл-я нек. пути l и дерева с коэф-м ветвления b:TIME=O(b^l)= SPACE. Рассм. очередь путей, содержащие путь из нач.верш. На кажд. шаге: 1.берем путь из нач.очереди, 2.продляем его (всеми способами) и вставляем в конец. 3.Если путь в нач.очереди - решение, - ПРИНЯТЬ. Не виснет. Ищет кратч.реш. раньше ост. Идеи сходны с алг-м фронта волны, но матр. смежности заменены продлением списков. Это позволяет проводить выч-е на графах, где матр.cмеж. уже неприменимы из-за объёма.

1 search_bdth(X, Y, P):-

  1. bdth([[X]], Y, P), reverse(P, L).

  2. bdth([[X|T]|_], X, [X|T]).

  3. bdth([P|QI], X, R):-

  4. findall(Z, prolong(P, Z), T),

  5. append(QI, T, QO),!,

  6. %% append(T, QI, QO) ставим это вместо предыдущей строки => в глубину

  7. % очередь путей в стек

  8. bdth(QO, X, R).

  9. bdth([_|T],Y,L) :-

  10. bdth(T,Y,L).

28. Метод генерации и проверок для решения задач. Метод ветвей и границ. Явный и неявный перебор в Пролог-программах.

Метод генерации и проверок: •Один предикат генерирует множество исходных данных. •Второй проверяет на соответствие с условиями задачи. -Успех - возвращаем. -НеУспех - backtracking.\\ На самом деле любое док-во так или иначе использует этот метод. При этом промежуточные этапы проверки отсекают дальнейшие ветки от пол-ного дерева пе­ребора, реализуя метод ветвей и границ. Метод ветвей и границ Части общего дерева решения отсекаются на ранних этапах или вообще не генерируются То, насколько много веток отсекается, определяет эффективность решения задачи. Важно •Выбрать удобное представление состояния задачи; • Построить перебор методов ветвей и границ, чтобы отсекать наиболее объёмные ветки дерева; •Иногда неявный перебор и правильный выбор способа представления знаний позволяет решить задачи в чисто декларативном стиле. \\ При исп-и явного перебора — производится полная конкретизация реше­ний — а потом их проверка. Неявный перебор использует метод ветвей и границ — генерация очередной порции решений производится после частичной конкретизации решения.