Prolog查找最便宜的价格

时间:2015-01-01 03:41:46

标签: 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,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).

flight(FROM,TO,EST,PRICE).

现在我需要创建一个规则来查找两个城市之间最便宜的票价。如果有人可以帮助我,这将意味着世界。

提前致谢。

2 个答案:

答案 0 :(得分:2)

graph :-
    forall(flight(From,To,_,_), writeln(From -> To)).

显示拓扑,我们可以欣赏图形是非循环的: enter image description here

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)].

如您所见,此类查询非常简单......

答案 1 :(得分:0)

如果您想确定最便宜的票价,那么距离字段就变得无关紧要了。策略是找到从A到C然后到B的停留点C比直接从A到B便宜。你找不到最便宜的票价,然后,没有以某种方式'检查'所有可能性。

您可以通过将数据组织到哈希表的哈希表中来有效地执行此操作,并在两个城市A和B之间找到最便宜的票价:

  1. 浏览您的数据,列出从A到SOMEWHERE的所有航班。
  2. 对于每个SOMEWHERE,列出从那里到其他目的地的所有航班。 所以...
  3. 在相应地安排您的数据后,任何最便宜的总PRICE的查找都将处于不变的时间。