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之间最便宜的票价:

  • 反复浏览您的数据,列出从a到某处的所有航班
  • 对于每个某处的航班,列出从那里到其他目的地的所有航班。 等等
  • 在相应地整理数据之后,任何最便宜总价的查找都将在固定时间内进行

    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等。。。