我有一些笛卡尔坐标定义:
point(a, 5, 1).
point(b, 4, 2).
point(c, 3, 3).
point(d, 2, 4).
和“路线”定义:
route(path1, [a, c, b, d]).
然后我有一个函数来计算两点之间的距离,如下所示:
distance(P1, P2, D):-point(P1, X1, Y1), point(P2, X2, Y2),
Z is ((X2-X1)*(X2-X1))+((Y1-Y2)*(Y1-Y2)),
Z >= 0,
D is sqrt(Z).
如何计算路线的全程?
另外,如果我有几条路线,我怎样才能找到最长的路线?
答案 0 :(得分:1)
编辑:现在应该是正确的
首先,使用您提供的距离函数找到给定路线的长度:
path_len(Path, D) :- route(Path, [First|Points]), path_len(Points, First, 0, D).
path_len([], _Last, Dist, Dist).
path_len([P|Points], Prev, DAcc, Dist) :-
distance(Prev, P, D),
NDAcc is DAcc+D,
path_len(Points, P, NDAcc, Dist).
其中 DAcc 是到目前为止距离的累加器(用0初始化)。您可以使用
进行查询?- path_len(path1, D).
如果您已经定义了多条路线(我能正确理解吗?),path_len/2
将通过回溯来计算所有路线的总距离。然后,您可以构建距离 - 路径对并使用keysort/2
对它们进行排序,并使用reverse/2
将最后一个放在第一位:
longest_path(Path, Dist) :-
bagof(D-P, path_len(P, D), DPPairs),
keysort(DPPairs, Sorted),
reverse(Sorted, [Dist-Path|_]).
您也可以在谓词定义的最后一行使用last/2
而不是reverse/2
:
last(Sorted, Dist-Path).