【发布时间】: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