搜索获得的结果,并找到序言中最低的值

  • 本文关键字:结果 搜索 prolog
  • 更新时间 :
  • 英文 :


我是prolog的新手,所以放手,我制定了一条规则,使我返回了几个结果,我想浏览这些结果并找到最低的值,但我不知道如何做。

Path is a list.
Cost is variable.

成本不是列表的长度,成本是累积变量。我只想在获得的结果中找到较低价值的可变成本。查找最低值的可变成本并获取列表。

%graph non-directed
route(a,b,1).
route(a,d,1).
route(a,h,1).
route(b,c,1).
route(b,a,1).
route(b,e,1).
route(c,b,1).
route(c,f,1).
route(c,e,1).
route(d,e,1).
route(d,a,1).
route(d,g,1).
route(e,b,1).
route(e,c,1).
route(e,d,1).
route(f,c,1).
route(f,i,1).
route(f,h,1).
route(g,d,1).
route(g,j,1).
route(g,l,1).
route(h,a,1).
route(h,f,1).
route(h,k,1).
route(i,f,1).
route(i,l,1).
route(i,k,1).
route(j,g,1).
route(j,m,1).
route(j,o,1).
route(k,h,1).
route(k,i,1).
route(k,n,1).
route(l,i,1).
route(l,o,1).
route(l,m,1).
route(l,g,1).
route(m,j,1).
route(m,l,1).
route(m,n,1).
route(n,m,1).
route(n,o,1).
route(n,k,1).
route(o,l,1).
route(o,n,1).
route(o,j,1).
travessiaCusto(A, B, Visitados,[B|Visitados], Custo1) :-route(A, B, Custo1).
travessiaCusto(A, B, Visitados, Cam, Custo) :-route(A, C, Custo2),
                                            C == B,
                                            + member(C, Visitados),
               travessiaCusto(C, B, [C|Visitados], Cam, CustoResto),
               Custo is Custo2 + CustoResto.

caminhoCusto(A, B, Path, Cost) :-travessiaCusto(A, B, [A], Path, Cost).
copy(L,R) :- accCp(L,R).
accCp([],[]).
accCp([H|T1],[H|T2]) :- accCp(T1,T2).

上面的规则通过图从两个点运行,并为其找到所有可能的路线。我想使用该规则:

caminhoCusto(A, B, Path, Cost) :-travessiaCusto(A, B, [A], Path, Cost).

我第一次尝试仅获得一个结果,但在IF条件下包含递归错误。

caminhoCustoMinimo(A,B,Path,Cost):-Cost is 100000000,
              ,caminhoCusto(A,B,Path1,Cost1)
              ,Cost1 =< Cost -> 
              (Cost is Cost1,copy(Path1,Path)).

在上述规则中,我尝试将结果值与我最初设置的值进行比较,但没有成功。

findall(Y,caminhoCusto(A,B,_,Y),Costs)找到每一个路线,并将成本放在列表中。

sort(Costs,[Cost|_])将成本从最小到最大,然后采用第一个(即最小)元素 - 这本质上是最小功能,因此,如果效率是关键,则可以重写。

findall(X,caminhoCusto(A,B,X,Cost),[Path|_])以最低成本找到每一个路线,然后以第一个为单位 - 这是满足"唯一的一个路线"要求。

caminhoCustoMinimo(A,B,Path,Cost) :-
    findall(Y,caminhoCusto(A,B,_,Y),Costs),
    sort(Costs,[Cost|_]),
    findall(X,caminhoCusto(A,B,X,Cost),[Path|_]).

如果您希望它以最低成本返回每条路线,一次,我们将[Path|_]替换为Paths,然后使用member(Path,Paths)以最低成本查找每个路线:

caminhoCustoMinimo(A,B,Path,Cost) :-
    findall(Y,caminhoCusto(A,B,_,Y),Costs),
    sort(Costs,[Cost|_]),
    findall(X,caminhoCusto(A,B,X,Cost),Paths),
    member(Path,Paths).

最新更新