2012-01-14 54 views
1

這完美的作品:序言避免道路,城市

%connection(Num,Ori,Dest,Distance,RoadNumber) 

connection(1,cityA,cityB,20,235). 
connection(2,cityB,cityC,23,235). 
connection(3,cityB,cityD,30,272). 

%road(num,speedlimit) 

road(235,50). 
road(272,90). 
road(273,120). 

dest(Z):- 
     A = mystartcity, 
    route(A,[Z],0,Path,Cost). 

    route(A,[A|Path1],Cost1, [A|Path1], Cost1). 
    route(A,[Y|Path1], Cost1,Path, Cost):- 
     connection(_,X,Y,Dist,N,E), 
     roadtype(N,Vmed,_), 
     CostXY is Dist/Vmed, 
     Cost2 is Cost1 + CostXY, 
     route(A,[X,Y|Path1],Cost2, Path, Cost). 

我的問題是,我想,以避免某些道路(例如:如果道路是不可用,因爲一個意外的),我無法弄清楚怎麼樣。

我想我需要的東西可以讓我改變可用於不可用的道路的「狀態」,並且當它不可用時,路由功能應該避免並選擇另一種方式。但我無法解決這個問題,我在努力。

回答

0

您可以創建封閉的道路通過ID的列表,並使用不可證明運營商,像這樣:

closed(2). 
closed(5). 

available(X) :- \+ closed(X). 

route(A,[Y|Path1], Cost1,Path, Cost):- 
    connection(ID,X,Y,Dist,N,E), 
    available(ID), 
    ... 
+0

dasblinkenlight,謝謝,它工作:)模糊,我沒有明白你的好,謝謝:)現在生病嘗試不同的方式沒有「+ /」 – user1148875 2012-01-14 15:31:17

0

另外,還可以作爲參數傳遞給一個dest/2謂詞的原始參數+一包含要避免的道路數量的列表。有了這些,在connection/6調用後應該寫一個簡單的\+ member(ID, ListOfNumsToAvoid)。當然,route/5將不得不變成route/6

然後,編碼完成後,您可以通過調用帶有空列表的通用版本作爲「迴避列表」參數來提出1參數版本。