簡體   English   中英

ECLIPSe-CLP 中不可控的自動傳播行為是什么?

[英]What is the uncontrollable automatic propagation behavior in ECLIPSe-CLP?

我正在嘗試研究、評估和比較 ECLIPSe-CLP 中的一些搜索方法。 評估所述系統中方法的復雜性和有效性的關鍵方法是計算回溯,使用來自 lib(ic_search) 的謂詞 search/6 實現。 但是,在我的測試中,我注意到Eclipse軟件在進入搜索之前自動應用了一些類似於域傳播的過程,我無法控制,這顯然解決了某些問題而沒有任何回溯。 這阻礙了我對搜索方法的評估,因為當它進入搜索時,我無法控制域和/或問題陳述。 我想知道所采用的流程是什么,以及是否可以禁用它或者我是否可以解決它。 下面附上一個非常原始的示例代碼及其跟蹤。 SEND + MORE = MONEY 和澳大利亞的 Map 着色問題等問題可以類似地用 0 回溯解決。

提前致謝!

Eclipse代碼

:- lib(ic), lib(ic_global), lib(ic_search).
    
go :-
    simpleproblem(Vars).

simpleproblem(Vars) :-
    Vars = [A,B],
    Vars :: [0..1],
    A + B #= 2,
    search(Vars,0,input_order,indomain,complete,[backtrack(Backtracks)]),
    writeln(backtracks:Backtracks),
    writeln(Vars).

跟蹤日志

(1) 1 CALL  go
(2) 2 CALL  simpleproblem(_598)
(3) 3 CALL  ... = ...
(3) 3 EXIT  ... = ...
(4) 3 CALL  '::_body'([_1028, _1030], [0 .. 1], eclipse)
(4) 3 EXIT  '::_body'([_1476{[0, ...]}, _1490{[...]}], [0 .. 1], eclipse)
(5) 3 CALL  _1490{[0, ...]} + _1476{[0, ...]} #= 2
(9) 4 CALL  wake
(6) 5 RESUME<2>  0 #= 0
(6) 5 EXIT<2>  0 #= 0
(9) 4 EXIT  wake
(5) 3 EXIT  1 + 1 #= 2
(10) 3 CALL  search_body([1, 1], 0, input_order, indomain, complete, [backtrack(_3046)], eclipse)

約束編程的有效性的真正原因是交錯傳播與搜索的原理。 因為這確實是 CP 的精髓,所以我不確定你孤立地看待搜索方法是否有意義。

交錯傳播和搜索

通過實施每個單獨的約束以數據驅動的方式執行傳播:每當變量域發生變化時,例如在初始約束設置期間或通過搜索決策,約束將嘗試傳播結果。 這可能會導致更多的域更改,從而導致進一步的傳播,等等,直到達到一個固定點。

一旦沒有進一步的傳播是可能的,搜索控制再次接管,查看約束網絡和當前變量域,並決定下一個猜測。 當進行猜測時(以變量實例化、域拆分等形式),再次觸發傳播。

在實現方面,有一個明確的分離:傳播是由各個約束完成的(僅在您的示例中#=/2 ),而搜索控制算法在search/6謂詞中。 但是,它們之間存在很強的相互依賴性,因為它們通過約束網絡來回通信。

請注意,大多數搜索技術,例如流行的首次失敗啟發式算法,嚴重依賴於傳播結果,否則他們無法做出明智的猜測。 雖然原則上您可以對所有約束使用非傳播實現(例如,等待它們的所有變量都被實例化,然后才測試是否滿意),但這會使許多搜索選項毫無意義,並且您不會學習通過計算回溯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM