Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск пути макс. веса в графе (Visual Prolog 5.2), Решить нужно с использованием списков 
V
    Опции темы
prognovichok
Дата 9.1.2011, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



Помогите решить задачку на Прологе:

В графе, ребрам которого приписаны веса, написать
программу поиска пути максимального веса, соединяющий заданную пару 
вершин. Вес пути равен сумме весов ребер, входящих в этот путь.
Граф задается с помощью предиката ребро(Имя_ребра, Вершина_начало_ребра, Вершина_конец_ребра, Вес_ребра).

Заранее спасибо!
PM MAIL   Вверх
Грымзик
Дата 9.1.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 7.10.2009

Репутация: 6
Всего: 6



Книга Сошникова "Парадигма логического программирования". В ней есть реализация поиска для весового графа. Там минимальный путь, но это очень легко изменяется на максимальный, путем замены знака в предикате placeone.
PM MAIL   Вверх
prognovichok
Дата 10.1.2011, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



С другом сделали... даже работает) если кому пригодится, буду рад)

domains
    list = integer*
predicates
    nondeterm ребро (symbol, integer, integer, integer) % ребро графа
    nondeterm ребро2 (symbol, integer, integer, integer) % обратное ребро (т.к. граф неориентированный)
    nondeterm concatenation (list, list, list) % конкатенация
    nondeterm belongs (integer, list) % предикат принадлежности вершины списку
    nondeterm solution (integer, integer, list, list, integer) % предикат решение (определяет пути и их длины)
    nondeterm maxElementOfList (list, integer) % поиск максимального элемента списка
    nondeterm max (integer, integer, integer) % определение максимального элемента
    nondeterm maxSolve (integer, integer, list, integer) % определение пути максимального веса

clauses
    ребро (a, 1, 2, 6).
    ребро (b, 2, 3, 3).
    ребро (c, 3, 4, 7).
    ребро (d, 4, 5, 2).
    ребро (e, 5, 1, 4).
    ребро (f, 5, 6, 3).
    ребро (h, 4, 7, 1).
    ребро (g, 6, 7, 5).
    
    ребро2 (X, Y, Z, V) :-  ребро (X, Y, Z, V); ребро (X, Z, Y, V).
    
    max (X, Y, MAX):- X >= Y, MAX = X, !.
    max (X, Y, MAX):- Y > X, MAX = Y.
    
    maxElementOfList ([X], X) :- !.
    maxElementOfList (X, M) :- X = [H|T], maxElementOfList (T, M2), max (H, M2, M).
        
    concatenation ([], List, List).
    concatenation ([M|NewList], NewList2, [M|N]):- concatenation (NewList, NewList2, N).
    
    belongs (X, [X|_]) :- !.
    belongs (X, [H|T]) :- belongs (X, T).
    
    % при отсутствии промежуточных вершин:
    solution (InitialVertex, TerminalVertex, PassedList, Path, Length) :-
        ребро2 (_, InitialVertex, TerminalVertex, Weight),
        concatenation ([InitialVertex], [TerminalVertex], Way),
        Path = Way,
        Length = Weight.
    % с учетом промежуточных вершин:    
    solution (InitialVertex, TerminalVertex, PassedList, Path, Length) :-
        ребро2 (_, InitialVertex, IntermediateVertex, Weight),
        not(belongs(IntermediateVertex, PassedList)),
        concatenation ([InitialVertex], PassedList, PassedList1),
        concatenation ([TerminalVertex], PassedList1, PassedList2),
        solution (IntermediateVertex, TerminalVertex, PassedList2, Path2, Length2),
        concatenation ([InitialVertex], Path2, Path),
        Length = Length2 + Weight.
    
    maxSolve(InitialVertex, TerminalVertex, Path, MaxLength):-
        findall (Length, solution(InitialVertex, TerminalVertex, [], _, Length), ListLenght),
        maxElementOfList (ListLenght, MaxLength),
        solution (InitialVertex, TerminalVertex, [], Path, MaxLength).
    
goal
    maxSolve(7, 3, Path, Length).

Кстати, программа работает и на минимальный вес, нужно только в предикате max поменять знак с ">" на "<". Ну и для наглядности переименовать max в min))

Это сообщение отредактировал(а) prognovichok - 10.1.2011, 18:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.0820 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.