平面上点之间的最短路径

时间:2019-04-14 10:59:58

标签: prolog shortest-path

我有一项任务是查找所有点之间的最短路径并返回path的值。由于不要求我在最短时间内完成,因此我选择将所有可能的路径放入列表中,然后查找该列表中的最小元素。 它应该像这样工作(例如3分):

 point1->point2->point3 (nowhere to go, store value, get back)
 point1->point3->point2 (nowhere to go, store value, get back)
 point2->point1->point3
 point2->point3->point1
 point3->point1->point2
 point3->point2->point1 (nowhere to go, return list, find min element, return it)

到目前为止,我已经能够访问所有可能的点并计算路径的总值,但是我找不到关于如何将其存储到列表中然后通过更改点重做步骤的解决方案。
代码:

point(1,1).
point(4,1).
point(3,2).

getRange(ListOfRanges):-
    getStart(R, ListOfPoints, []).

getStart(R, ListOfPoints, ListOfRanges):-
    point(A,B),
    point(C,D),
    ((A\=C);(B\=D)),
    getRangeBetweenPoints(A,B,C,D,R),
    getTwoPoints(C,D,R, [[C,D],[A,B]|[]], ListOfRanges).


getTwoPoints(C,D,R, ListOfPoints, ListOfRanges):-
    point(Anew,Bnew),
    \+(member([Anew,Bnew], ListOfPoints)),
    getRangeBetweenPoints(C,D,Anew,Bnew,R1), R2 is R+R1,
    getTwoPoints(Anew, Bnew, R2, [[Anew,Bnew]|ListOfPoints], ListOfRanges).

getRangeBetweenPoints(C,D,A,B, R1):-
    R1 is sqrt((C-A)*(C-A) + (D-B)*(D-B)).

我已经做了2天了,不胜感激。

0 个答案:

没有答案