Prolog找到最便宜的价格
我有以下事实:Prolog找到最便宜的价格,prolog,Prolog,我有以下事实: flight(kul,syd,495,2205). flight(jhb,kul,45,321). flight(pen,kul,55,346). flight(lgk,kul,65,381). flight(lgk,pen,35,215). flight(kul,sin,65,760). flight(lgk,sin,90,1058). flight(sin,bki,150,1492). flight(kul,bki,155,526). flight(kul,lbu,145,4
flight(kul,syd,495,2205).
flight(jhb,kul,45,321).
flight(pen,kul,55,346).
flight(lgk,kul,65,381).
flight(lgk,pen,35,215).
flight(kul,sin,65,760).
flight(lgk,sin,90,1058).
flight(sin,bki,150,1492).
flight(kul,bki,155,526).
flight(kul,lbu,145,436).
flight(lbu,bki,30,127).
flight(bki,per,340,1835).
flight(kul,per,330,1835).
flight(myy,bki,55,167).
flight(kul,myy,130,511).
flight(lbu,myy,45,108).
flight(sin,per,310,2289).
flight(sin,syd,475,3118).
这是航班(从,到,美国东部时间,价格)。
现在我需要创建一个规则来查找两个城市之间最便宜的票价。如果有人能在这件事上帮助我,那将意味着整个世界
提前感谢。如果您想确定最便宜的票价,那么距离字段就变得无关紧要了。策略是找到C点,从A点到C点再到B点比直接从A点到B点便宜。因此,如果不“检查”所有可能性,你就找不到最便宜的票价 通过将您的数据组织到哈希表的哈希表中,您可以高效地这样做,并找到两个城市A和B之间最便宜的票价:
graph :-
forall(flight(From,To,_,_), writeln(From -> To)).
显示拓扑,我们可以看出图形是非循环的:
OT:要显示边缘信息,请执行以下操作:
graph_dist_cost :-
forall(flight(From,To,Dist,Cost),
format('~q [label="~w\\n~w"];~n', [From -> To, d=Dist,c=Cost])).
现在,由于它是非循环的,我们可以说:
path(To,To,[]).
path(From,To,[Step|Rest]) :-
Step = flight(From,ToTemp,_Dist,_Cost),
call(Step),
path(ToTemp,To,Rest).
我们得到:
?- path(jhb,myy,P).
P = [flight(jhb, kul, 45, 321), flight(kul, lbu, 145, 436), flight(lbu, myy, 45, 108)] ;
P = [flight(jhb, kul, 45, 321), flight(kul, myy, 130, 511)] ;
false.
现在,很容易得到数值
path_cost(P, C) :-
aggregate_all(sum(Cost), member(flight(_,_,_,Cost), P), C).
?- path(jhb,myy,P),path_cost(P,C).
P = [flight(jhb, kul, 45, 321), flight(kul, lbu, 145, 436), flight(lbu, myy, 45, 108)],
C = 865 ;
P = [flight(jhb, kul, 45, 321), flight(kul, myy, 130, 511)],
C = 832 ;
false.
然后,最低限度:
path_min_cost(From, To, Min, Path) :-
aggregate(min(C,P), (path(From,To,P),path_cost(P,C)), min(Min,Path)).
?- path_min_cost(jhb,myy,P,MC).
P = 832,
MC = [flight(jhb, kul, 45, 321), flight(kul, myy, 130, 511)].
如您所见,此类查询非常简单…您能展示您解决此问题的尝试吗?@IzzatAmir请不要在评论中显示您的编码尝试。它很难阅读,也不容易被帮助你解决问题的其他人注意到。你应该编辑你的原始问题,并使用正确的格式添加你的编码尝试。哇,它确实奏效了。。但是我需要一些关于你怎么做的解释。有些人建议我使用setof或bagof,因为它更有效。但是无论如何,非常感谢你,先生!我不敢相信你经历了这一切。更不用说拓扑了。。哇,语言无法形容我是多么的感激。事实上,我试图保持尽可能的简单。在担心性能和优化之前,先看看您是否能够理解问题的分解方式。搜索——这个问题面临的广泛主题,是序言的核心。算术,我们需要的数值,它是欠发达的-所以我展示了最惯用的代码,基于库(聚合)。在内部,库(聚合)使用setof/3、findall/3等。。。