0

我有一些笛卡尔坐标定义:

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

如何计算路线的完整距离?

另外,如果我有几条路线,我怎样才能找到最长的一条?

4

1 回答 1

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).
于 2013-05-06T09:57:52.310 回答