【问题标题】:Prolog Pathfinding with Prioritisation带优先级的 Prolog 寻路
【发布时间】:2014-12-07 09:59:24
【问题描述】:

我的任务是编写一个 Prolog 程序,该程序列出两个地下(地铁)站之间的路径,但它应该支持线路变化较少的路径(在切换线路之前,它应该尽可能长时间地停留在同一线路中)。

我想出了一个模拟场景,这段代码虽然正确列出了一些路径(我知道我仍然需要编写循环检测代码),但它并没有按应有的优先级排列同一行段。

我的路由器是:

route(X,Y,[drive(X,Y,L)],_) :- road(X,Y,L).

%route(From, To, Directions, Lines_Visited).
route(X,Y,[drive(X,Z,L)|R],Ls) :-
    take(Ls,L,_),     %prioritise same-line paths
    road(X,Z,L),  
    route(Z,Y,R,Ls), !.

route(X,Y,[drive(X,Z,L)|R],Ls) :-
    road(X,Z,L),       %if no same-line pathes exist, try different line
    route(Z,Y,R,[Ls|L]).

take/3 在哪里

take([H|T], H, T).

一个测试场景是:

road(a,b,x).
road(b,c,x).
road(c,d,x).
road(d,e,x).
road(e,f,x).
road(b,f,y).
road(f,g,x).

%a - b - c - d - e - f - g
%    |_______________|

如果我尝试路线(a,f,X)。我会得到路径 a -> b -> f ,它会换行一次,然后是单行路径 a->b->c->d->e->f。

显然我的优先级不起作用,我无法想出不同的方法。有人可以阐明一下并指出我更有效地解决这个问题的方向吗?

【问题讨论】:

    标签: prolog path-finding


    【解决方案1】:

    您的代码需要大量重组。基本上,您根本没有使用有关当前路径中使用哪一行的信息(take/3 是无用的,因为它不绑定第三个参数)。这是我对此的看法。添加循环检测,现在您已经拥有“到目前为止看到”的节点...

    %route(From, To, Directions, Lines_Visited).
    route(X,X,RPath,Path) :- reverse(RPath,Path).
    route(X,Y,[Last|R],Ls) :-
        Last = [drive(X,Z,L)|_], %prioritise same-line paths
        road(X,Z,L),  
        route(Z,Y,R,Ls).
    route(X,Y,PathSoFar,Ls) :-
        road(X,Z,L),       %if no same-line pathes exist, try different line
        route(Z,Y,[road(X,Z,L)|PathSoFar],Ls).
    

    测试:

    ?- route(a,f,[],X).
    X = [road(a, b, x), road(b, c, x), road(c, d, x), road(d, e, x), road(e, f, x)] ;
    X = [road(a, b, x), road(b, f, y)] ;
    false.
    

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多