如何获得两架飞机之间的最大距离

时间:2017-01-11 22:11:35

标签: prolog clpfd

我希望有人可以帮我解决我的问题。

我有3架飞机ABC时间间隔为:A[0..12]B[7..18]C[11..23]。现在我需要找到每架飞机一个接一个降落的最佳时间

结果应该是这样的:

?- air_traffic_control(A,B,C).
A = 0,
B = 11,
C = 22.

我现在唯一写的是

air_traffic_control(A,B,C) :-
    A in 0..12,
    B in 7..18,
    C in 11..23,
    label([A,B,C]).

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

一旦定义了距离的含义并相应地约束变量Distance,SWI-Prolog允许您使用labeling([max(Distance)], [Distance])最大化它。

修改:在您澄清了如何对此进行建模之后,很容易做到:=<关系在CLPFD中写成#=<,并且连接(“和” )只是像Prolog一样使用逗号,编写。所以你可以写这样的约束:

flights_distance([A, B, C], MinDistance) :-
    A in 0..12,
    B in 7..18,
    C in 11..23,
    MinDistance #> 0,
    MinDistance #=< B - A,
    MinDistance #=< C - B.

请注意,此谓词包含约束但不调用labeling。它是一个所谓的核心关系,它包含一个模型,但它与搜索分开。这被视为good practice

核心关系和搜索可以组合在另一个谓词中:

flights_scheduled(Flights) :-
    flights_distance(Flights, MinDistance),
    labeling([max(MinDistance)], [MinDistance|Flights]).

在SWI-Prolog中,这将评估模型的所有解决方案,首先是具有最大距离的解决方案:

?- flights_scheduled(Flights).
Flights = [0, 11, 22] ;
Flights = [0, 11, 23] ;
Flights = [0, 12, 23] ;
Flights = [1, 12, 23] ;
Flights = [0, 10, 20] ;
Flights = [0, 10, 21] ;
Flights = [0, 10, 22] ;
Flights = [0, 10, 23] ;
Flights = [0, 11, 21] ;
Flights = [0, 11, 22] .

如果您只想要第一个解决方案,可以将整个事情包裹在once(...)中,或者在通话结束后进行剪切。

答案 1 :(得分:0)

我猜这三者之间的最小距离D是:

D =< ((B-A) and D) =< C-B.

还是我错了? 如果没有,我怎么能在prolog中写这个?

答案 2 :(得分:0)

是的,您只需将D设置为#=这两个距离(A,B)和(B,C),然后最大化D. hth