【问题标题】:how to visit each point in directed graph如何访问有向图中的每个点
【发布时间】:2012-05-29 10:58:41
【问题描述】:

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

例子:

                                                                         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

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

             graph             expected output             
           X ----> Y            
           Y ----> X               X Y Z
           Y ----> Z 

我之所以取消这个案例是因为;

      output :

      X Y X Y ...   Z
              ^^^
              god knows this length ( when program terminates )
              termination is np problem

【问题讨论】:

    标签: prolog graph-theory


    【解决方案1】:

    我添加了一些注释来解释代码的作用......

    % 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).
    

    测试:

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

    【讨论】:

    • 当我使用你的代码时,我只得到第一个路径作为输出并且它没有被终止。看起来像一个无限循环。你知道我错过了什么吗?
    • @DaveChandler:抱歉,不知道。我的代码尽可能简单......你介意发布你正在尝试的代码吗?
    • @DaveChandler:你能检查一下 all 你的 edge/2 事实是否正确吗?也就是说,那里没有变量...
    【解决方案2】:

    保留您已经访问过的节点列表。在每一步中,检查边缘的端点是否存在于列表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      相关资源
      最近更新 更多