Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2010, 15:31   #1
Nata220
 
Регистрация: 20.05.2010
Сообщений: 5
По умолчанию Нахождение кратчайшего пути в графе

Помогите, пожалуйста, написать программу, которая находит кратчайший путь из одной вершины до другой в
произвольном графе на Visual Prolog 7.2.
Я нашла и переделала программу на Visual Prolog 5.2 под свою. И мне помогли написать программу поиска оптимального пути в обычном графе,т.е. который не содержит весов. Помогите пожалуйста переделать программу на языке Visual Prolog 5.2 на Visual Prolog 7.2 или доделать программу на 7.2, которая у меня есть.
Nata220 вне форума Ответить с цитированием
Старый 20.05.2010, 15:32   #2
Nata220
 
Регистрация: 20.05.2010
Сообщений: 5
По умолчанию

Код:
domains /*программа на 5.2*/
  gr	 = symbol
  grlist = gr*
  d = integer
 

predicates
  nondeterm road(gr,gr,d)
clauses
  road("h","g",100).
  road("h","k",120).
  road("t","k",80).
  road("t","m",20).
  road("g","m",30).
  
 

predicates
  nondeterm connected(gr,gr,d)
clauses
  connected(X,Y,Dist):-
	road(X,Y,Dist).
  connected(X,Y,Dist):-
	road(Y,X,Dist).
 

predicates
  determ member(gr,grlist)
clauses
  member(X,[X|_]):-!.
  member(X,[_|L]):-
	member(X,L).
 

predicates
  nondeterm route(gr,gr,grList,grList,d)
clauses
  route(Gr,Gr,VisitedGrs, VisitedGrs, 0) :-
	!.
  route(Gr1,Gr2,VisitedGrs,ResultVisitedGrs,Distance):-
	connected(Gr1,X,Dist1),
	not(member(X,VisitedGrs)),
	route(X,Gr2,[X|VisitedGrs],ResultVisitedGrs,Dist2),
	Distance=Dist1+Dist2.


predicates
  procedure showAllRoutes(gr,gr)-(i,i)
  procedure write_rote(gr FirstGr,grList,d)
  procedure reverse_list(grList InList, grList Tmp, grList Reversed)

clauses
  showAllRoutes(Gr1,Gr2):-
	write(Gr1," to ",Gr2," are:\n"),
	route(Gr1,Gr2, [Gr1] ,VisitedGrs, Dist),
	write_rote(Gr1,VisitedGrs,Dist),nl,
	fail.
  showAllRoutes(_,_).

  write_rote(Gr1,[Gr1|VisitedGrs],Dist):-
	!,
	Grs = [Gr1|VisitedGrs],
	write("  ",Grs," --> ",Dist),nl.
  write_rote(_,VisitedGrs,Dist):-
	reverse_list(VisitedGrs, [], VisitedGrs_Reversed),
	write("  ",VisitedGrs_Reversed," --> ",Dist),nl.

  reverse_List([],LIST,LIST):-!.
  reverse_List([H|SeenListRest],Interm,SeenList):-
	reverse_List(SeenListRest,[H|Interm],SeenList).
	
 

predicates
  procedure showShortestRoutes(gr,gr)-(i,i)
  determ shorterRouteExist(gr,gr,d)-(i,i,i)
 
clauses
  showShortestRoutes(Gr1,Gr2):-
	write(Gr1," to ",Gr2," is:\n"),
	route(Gr1,Gr2, [Gr1] ,VisitedGrs, Dist),
	not(shorterRouteExist(Gr1,Gr2,Dist)),
	write_rote(Gr1,VisitedGrs,Dist),nl,
	fail.
  showShortestRoutes(_,_).
 
  shorterRouteExist(Gr1,Gr2,Dist):-
	route(Gr1,Gr2, [Gr1] ,_, Dist1),
	Dist1<Dist,!.
 

goal
  showAllRoutes("g", "t"),nl,
  showShortestRoutes("g", "t").

implement main /*Программа на 7.2*/
    open core, console, list, std
constants
    className = "main".
    classVersion = "".

class facts
c : integer := 0.
gr : char* := ['h','g','h','k','t','k','t','m','g','m'].
start : char := 'g'.
finish : char := 't'.
class predicates    
   way : (char**) -> char**.
   step : (char,char*) -> char nondeterm.
clauses
  classInfo(className, classVersion).

way(A) = [[start|X]|| [start|X]=getMember_nd(A)] :- c=1, !. 
way([]) = [] :- !.   
way(A) = way([[D,B|C]|| [B|C]=getMember_nd(A), D=step(B,gr), not(isMember(D,C)), if D=start then c:=1 end if]).

step(A,[A,B|_]) = B.
step(A,[B,A|_]) = B.
step(A,[_,_|B]) = step(A,B).

run():- init(), Ws=way([[finish]]), 
   if Ws=[] then write("No way\n\n") 
   else c:=0, forall(Ws,{(W):- c:=c+1, write(c,":  "), forall(W,{(Q):- write(Q,' ')}), nl, nl}), write("The End") 
   end if, _=readchar().

end implement main
goal
   main::run.

Последний раз редактировалось Stilet; 20.05.2010 в 15:38.
Nata220 вне форума Ответить с цитированием
Старый 20.05.2010, 15:45   #3
Nata220
 
Регистрация: 20.05.2010
Сообщений: 5
По умолчанию

Код:
implement main ./*программа на 7.2*/
    open core, console, list, std
constants
    className = "main".
    classVersion = "".

class facts
c : integer := 0.
gr : char* := ['h','g','h','k','t','k','t','m','g','m'].
start : char := 'g'.
finish : char := 't'.
class predicates    
   way : (char**) -> char**.
   step : (char,char*) -> char nondeterm.
clauses
  classInfo(className, classVersion).

way(A) = [[start|X]|| [start|X]=getMember_nd(A)] :- c=1, !. 
way([]) = [] :- !.   
way(A) = way([[D,B|C]|| [B|C]=getMember_nd(A), D=step(B,gr), not(isMember(D,C)), if D=start then c:=1 end if]).

step(A,[A,B|_]) = B.
step(A,[B,A|_]) = B.
step(A,[_,_|B]) = step(A,B).

run():- init(), Ws=way([[finish]]), 
   if Ws=[] then write("No way\n\n") 
   else c:=0, forall(Ws,{(W):- c:=c+1, write(c,":  "), forall(W,{(Q):- write(Q,' ')}), nl, nl}), write("The End") 
   end if, _=readchar().

end implement main
goal
   main::run.
Nata220 вне форума Ответить с цитированием
Старый 21.05.2010, 17:19   #4
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

С вижуал прологом, к сожалению, не помогу, но про алгоритмы поиска кратчайших путей во взвешенном графе могу рассказать. Интересует?
O(n)
sabbathist вне форума Ответить с цитированием
Старый 29.11.2010, 14:54   #5
Танюня
 
Регистрация: 28.05.2010
Сообщений: 6
По умолчанию

а есть где-нибудь на форуме реализация метода ветвей и границ для нахождения кратчайшего пути в графе, только на Си или Си++?
Танюня вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Беллмана-форда,нахождение кратчайшего пути bakir Помощь студентам 1 13.01.2010 02:31
Поиск кратчайшего пути в графе методом полного перебора в глубину. Метод ветвей и границ Олинька Помощь студентам 1 24.12.2008 16:22
1) Поиск кратчайшего пути в графе методом полного перебора в ширину(очередь) Serega123 Помощь студентам 3 30.10.2008 22:26
применить Алгоритм Дейкстры для поиска кратчайшего пути в графе Эдгар Microsoft Office Excel 13 24.10.2008 21:01