![]() |
|
Модераторы: Poseidon |
![]()
|
|
| Kvax |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 19.12.2008 Репутация: нет Всего: нет |
Здравствуйте!
Не подскажите ка реализовать решение задачи: В общем есть граф у которого у каждого ребра есть приоритет, нужно пройти по всем ребрам и найти оптимальый путь для очистки дорог с определенным приоритетом, причем дороги которые не соответствуют приоритету чистить не надо. Я написал программу поиска пути из из начальной в конечную точку, но препод сказел надо пройти по всем путям, в общем не принял, если нужно могу скинуть код.... Если у кого есть, или кто знает как писать, большая просьба посодействовать... |
|||
|
||||
| Kvax |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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,Путь). |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |