Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Prolog] Поиск оптимального пути движения 
:(
    Опции темы
Kvax
Дата 19.12.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Не подскажите ка реализовать решение задачи:
В общем есть граф у которого у каждого ребра есть приоритет, нужно пройти по всем ребрам и найти оптимальый путь для очистки дорог с определенным приоритетом, причем дороги которые не соответствуют приоритету чистить не надо. Я написал программу поиска пути из из начальной в конечную точку, но препод сказел надо пройти по всем путям, в общем не принял, если нужно могу скинуть код....

Если у кого есть, или кто знает как писать, большая просьба посодействовать...
PM MAIL   Вверх
Kvax
Дата 21.12.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может кто знает в чем ошибка, написал кусок программы, теоретически он должен считать количество очищенных дорог, и если оно стало равным 5 то должен выйти, но программа вобще по другому работает, почему не пойму (((

DOMAINS
список=symbol* %Символьный список
пар_списка=integer*
PREDICATES
nondeterm принадлежит (symbol, symbol,список)
nondeterm граф (список)
nondeterm приоритеты (пар_списка)
nondeterm путь (symbol, symbol, список)
nondeterm путь1 (symbol, список,список, список, список,integer)
nondeterm чистка(список,symbol, symbol,список, integer,integer,список)
%nondeterm оптимальный_путь (symbol,список,integer,integer)
%nondeterm список(список, integer)
%nondeterm путь_короче (symbol,symbol,integer,integer)
  nondeterm получить_значение_по_индексу(integer,integer,пар_списка,integer)
  nondeterm получить_индекс        (symbol,symbol,список,integer,integer)
  nondeterm получить_приоритет        (symbol,symbol,список,integer)
  %nondeterm получить_длину        (symbol,symbol,список,integer)
  nondeterm смежные            (symbol,symbol,список)
  
CLAUSES

%Отыскание ветви в направленном графе
%принадлежит (Y,Z,[Y,Z|_]).
%принадлежит (Y,Z,[_,_|Хвост]):-принадлежит (Y,Z,Хвост).

граф ([a,b,  b,d,  b,c,  c,e,  e,d,  b,e,  e,a]). %факт1

приоритеты ([1,    1,    1,    1,    1,    1,    1]). %факт2






%Функция возвращает в Значение приоритет(длина) дороги по номеру Index в заданном графе.
  получить_значение_по_индексу(Индекс,ТекИндекс,[Голова|Хвост],Значение):-    % если Иднекс=ТекИндекс, и Значение=Голова, то нужный индекс найден
                                        Индекс=ТекИндекс,        % правило4
                                                                     Значение=Голова,!;
                                                                     % Иначе, увеличиваем индекс и опять проверяем
                                                                     НовыйИндекс=ТекИндекс+1,
                                                                     получить_значение_по_индексу(Индекс,НовыйИндекс,Хвост,Значение).
%-----------------Начало

%Функция, возвращающая в Index номер дороги между пунктами A и B в заданном графе.
% Если А,B (В,А) явл. головой списка, то возвращаем полученны Индекс, иначе ищем дальше
  получить_индекс(A,B,[A,B|_],ТекИндекс,Индекс):-    Индекс=ТекИндекс.                    % правило7
%Дороги предполагаются в обе стороны.
  получить_индекс(A,B,[B,A|_],ТекИндекс,Индекс):-        Индекс=ТекИндекс.                % правило8
% Изменяем зн. Индекса, отбрасываем Голову и ищем дальше
  получить_индекс(A,B,[_,_|Хвост],ТекИндекс,Индекс):-        НовыйИндекс=ТекИндекс+1,
                                                   получить_индекс(A,B,Хвост,НовыйИндекс,Индекс).    % правило9
%-----------------Конец

%Функция, возвращающая в "Приоритет" приоритет дороги между пунктами A и B.
  получить_приоритет(A,B,Граф,Приоритет):-        получить_индекс(A,B,Граф,1,Индекс),        % правило10
                                         приоритеты(Набор_Приоритетов),
                                         получить_значение_по_индексу(Индекс,1,Набор_Приоритетов,Приоритет).



%чистка(Очищено,СчОчищеныхДорог,НовСчОчищДорог,Y,Z):-    НовСчОчищДорог=СчОчищеныхДорог+1,
%                            Очищено=[Y,Z|Очищено].
чистка(ТекЧистка,Y,Z,[Y,Z|ТекЧистка],СчОчищеныхДорог,НовСчОчищДорог,Граф):-    
                                    получить_приоритет(Y,Z,Граф,ПриоритетДороги),
                                    ПриоритетДороги=1,%write ("\n"),write(ПриоритетДороги),write ("\n"),
                                    %НовСчОчищДорог=СчОчищеныхДорог+1,write ("\n"),write(НовСчОчищДорог),write ("\n").
                                    НовСчОчищДорог=_.                    




путь (A,Z,Путь):-    граф(Граф),
                    
                    путь1 (A,[Z],Граф,Путь,[],0). %правило1

путь1 (A,[A|Путь1],_,Путь1,_,5):-    СчОчищеныхДорог=0. %факт3
путь1 (A,[Z|Путь1],Граф,Путь,ТекЧистка,СчОчищеныхДорог):-    %СчОчищеныхДорог<6,
                                смежные (Y,Z,Граф),
                                     
                                %not (принадлежит(Z, Y, Путь1)),
                                %not (принадлежит(Y, Z,Путь1)),
                                %чистка(Очищено,СчОчищеныхДорог,НовСчОчищДорог,Y,Z),
                                чистка(ТекЧистка,Y,Z,Очищено,СчОчищеныхДорог,НовСчОчищДорог,Граф),%write ("\n"),write(НовСчОчищДорог),write ("\n"),
                                НовСчОчищДорог=СчОчищеныхДорог+1,write ("\n"),write(НовСчОчищДорог),write ("\n"),
                                путь1 (A,[Y,Y,Z|Путь1],Граф,Путь,Очищено,НовСчОчищДорог). %правило2

принадлежит (Y,Z,[Y,Z|_]). %факт4
принадлежит (Y,Z,[_,_|Хвост1]):-            принадлежит (Y,Z,Хвост1). %правило3

смежные (Y,Z,Граф):-    принадлежит (Y,Z,Граф); 
                    принадлежит (Z,Y,Граф). %правило4

%оптимальный_путь (A,Путь,Номер,Итоговое_время):-        путь (A,A,Путь,Номер,Итоговое_время).
%оптимальный_путь (A,Путь,Номер,Итоговое_время):-        путь (A,A,Путь,Номер,Итоговое_время),
                                %Номер=0.
                                %not(путь_короче(A,A,Номер,Итоговое_время)),
                                %список(_, Путь, Счётчик).
                                
%список(Ф,[Ф|_], Счётчик).                            % факт1
%список([_|Хвост], Счётчик):-    список(Хвост, Счётчик), Счётчик=Счётчик+1.            % правило1

%путь_короче (A,Z,Номер,Итоговое_время):-путь (A,Z,_,Номер,Итоговое_время1),Итоговое_время1<Итоговое_время.

GOAL

%Отыскание ветви в направленном графе
%принадлежит (Y,Z, [a,b, b,d, b,c, c,d, c,e, e,d, b,e, e,a]).
%принадлежит (Y,e, [a,b, b,d, b,c, c,d, c,e, e,d, b,e, e,a]).
%смежные (a,b, [a,b, b,d, b,c, c,d, c,e, e,d, b,e, e,a]).

путь (a,a,Путь).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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