我希望有人可以帮我解决我的问题。
我有3架飞机A
,B
,C
时间间隔为: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]).
有人可以帮助我吗?
答案 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