【发布时间】:2017-05-03 09:41:42
【问题描述】:
嗨,所以在我被告知这个问题已经被问过很多次之前,我已经查看了一堆问题,但没有一个与 Prolog 相关。这就是我遇到的困难。
我试图找到棋盘上两点之间的最短路径。我拥有的代码专门用于骑士。到目前为止,这是我的代码:
move1( (X1,Y1), (X2,Y2) ) :- up1( X1, X2 ), up2( Y1, Y2 ).
move1( (X1,Y1), (X2,Y2) ) :- up2( X1, X2 ), up1( Y1, Y2 ).
move1( (X1,Y1), (X2,Y2) ) :- up1( X1, X2 ), down2( Y1, Y2 ).
move1( (X1,Y1), (X2,Y2) ) :- up2( X1, X2 ), down1( Y1, Y2 ).
move1( (X1,Y1), (X2,Y2) ) :- down1( X1, X2 ), up2( Y1, Y2 ).
move1( (X1,Y1), (X2,Y2) ) :- down2( X1, X2 ), up1( Y1, Y2 ).
move1( (X1,Y1), (X2,Y2) ) :- down1( X1, X2 ), down2( Y1, Y2 ).
move1( (X1,Y1), (X2,Y2) ) :- down2( X1, X2 ), down1( Y1, Y2 ).
up1( U, V ) :- successor( U, V ).
up2( U, W ) :- successor( U, V ), successor( V, W ).
down1( U, V ) :- up1( V, U ).
down2( U, V ) :- up2( V, U ).
successor( 1, 2 ).
successor( 2, 3 ).
successor( 3, 4 ).
successor( 4, 5 ).
edge((X1,Y1) , (X2,Y2)) :- move1( (X1,Y1), (X2,Y2) ).
path((X1,Y1), (X2,Y2),N,[(X1,Y1), (X2,Y2)]) :- N > 0, edge((X1,Y1), (X2,Y2)).
path((X1,Y1), (X3,Y3),N,[(X1,Y1)|P1]) :- N > 0, N1 is N-1, path((X2,Y2), (X3,Y3),N1,P1), edge((X1,Y1), (X2,Y2)), nonmember((X1,Y1),P1).
shortest((X1,Y1),(X2,Y2),P) :- path((X1,Y1),(X2,Y2),24,P),!.
visit((X1,Y1),P,N) :- path((X1,Y1), (X2,Y2),N,P),N2 is N+1,len(P,N2).
len([],0).
len([_|T],N) :- len(T,X), N is X+1.
nonmember(X,[]).
nonmember(X,[U|Y]) :- X \= U, nonmember(X,Y).
如您所见,我只找到第一条路径而不是最短路径。我不确定如何在 prolog 中编写代码并找出获得所有最短路径的方法。我正在考虑列出所有可能的路径,然后通过并找到最短的路径,但我似乎无法编写代码。
findAll((X1,Y1),(X2,Y2),P,L) :- path((X1,Y1),(X2,Y2),24,P),length(P,L).
给我每条路径的长度,但我不确定如何处理它。 任何关于如何在 Prolog 中编码以找到最短路径的帮助都会非常有帮助,这就是我正在寻找的。
【问题讨论】:
标签: prolog combinatorics shortest-path