Reputation: 77
In Prolog, how can I implement graph algorithm in order to find all path in order to implement travel salesman problem in directed graph ?
example :
graph
expected input expected output X -----> Y
start X X Y X Z Y -----> T
end Z Y T X Y Z T -----> Z
T Z X Y T Z Y -----> Z
Y Z X -----> Z
X Z
As you know, in directed graph, there could be a cycle. However, no need to pass same point two times.
graph expected output
X ----> Y
Y ----> X X Y Z
Y ----> Z
Why I am elimineting this case is because ;
output :
X Y X Y ... Z
^^^
god knows this length ( when program terminates )
termination is np problem
Upvotes: 2
Views: 2854
Reputation: 60014
I placed some comment that explain what the code does...
% your directed graph
edge(x, y).
edge(y, t).
edge(t, z).
edge(y, z).
edge(x, z).
% get a path from start to end
path(Start, End, Path) :-
path(Start, End, [Start], Path).
% when target reached, reverse the visited list
path(End, End, RPath, Path) :-
reverse(RPath, Path).
% take non deterministically an edge, check if already visited before use
path(Start, End, Visited, Path) :-
edge(Start, Next),
\+ memberchk(Next, Visited),
path(Next, End, [Next|Visited], Path).
test:
?- path(x,z,P).
P = [x, y, t, z] ;
P = [x, y, z] ;
P = [x, z] ;
false.
Upvotes: 2
Reputation: 13356
Keep a list of nodes you have already visited. In each step, check if the endpoint of the edge exists in the list or not.
Upvotes: 2