繁体   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