本文介绍了如何访问有向图中的每个点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Prolog中,如何实现图算法以便找到所有路径以便在有向图中实现旅行商问题?例如:



 
预期输入预期输出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

如您所知,在有向图中,可能存在一个循环。但是,不需要两次通过同一点。

 图表预期输出
X ----> Y
Y ----> X X Y Z
Y ----> Z

为什么我要取消这种情况是因为;

 输出:

XYXY ... Z
^^^
上帝知道这个长度(程序终止时)
终止是np问题


解决方案

解释代码的作用......

 %有向图
edge(x,y)。
edge(y,t)。
edge(t,z)。
edge(y,z)。
edge(x,z)。

%获得从开始到结束的路径
路径(开始,结束,路径): -
路径(开始,结束,[开始],路径)。

%达到目标时,反向访问列表
path(End,End,RPath,Path): -
reverse(RPath,Path)。

%非确定性地采用边缘,检查在使用前是否已经访问过
路径(开始,结束,已访问,路径): -
edge(Start,Next),
\ + memberchk(Next,Visited),
path(Next,End,[Next | Visited],Path)。

测试:

 ? -  path(x,z,P)。 
P = [x,y,t,z];
P = [x,y,z];
P = [x,z];
false。


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
解决方案

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.

这篇关于如何访问有向图中的每个点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-14 14:34