2017-02-18 111 views
0

最低值我是新的序言,所以讓我們去,我做了我返回結果的幾個規則,我想通過這些結果,找到的最低值,但我不知道該怎麼做。搜索的結果,發現在序言

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

在上述規則中,我嘗試將結果的值與最初設置的值進行比較,但沒有成功。

+0

這是非常不清楚的。你正在描述一個通用的成本和路徑。然後,您將顯示帶有4個變量的示例查詢,結果顯示兩個變量。沒有顯示任何代碼嘗試,也沒有關於您給定數據的信息。很多信息缺失。如果你已經嘗試了一些東西,你應該顯示該代碼。 – lurker

+0

@lurker我現在編輯了一下。 –

+0

您顯示的查詢無法提供您顯示的結果。該查詢中的「A」和「B」發生了什麼? – lurker

回答

0

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

如果您希望它在同一時間以最低的成本來回報每航,一,我們與Paths取代[Path|_],然後用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). 
+0

非常感謝。 –