搜索获得的结果,并在prolog中找到最低值

时间:2017-02-18 13:58:57

标签: prolog

我是prolog的新手,所以我们去吧,我制定了一条规则,让我得到了几个结果,我想通过这些结果找到最低值,但我不知道怎么做。< / p>

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

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

1 个答案:

答案 0 :(得分:0)

findall(Y,caminhoCusto(A,B,_,Y),Costs)找到每条路线,并将费用列入清单。

sort(Costs,[Cost|_])将成本从最小到最大排序,然后取第一个(即最小的)元素 - 这实际上是一个min函数,所以如果效率是关键,那么可以重写。

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