分析ECLiPSe CLP?

时间:2016-04-01 12:44:29

标签: clpfd eclipse-clp

我做了两个实现来解决Shikaku谜题。一个使用Top,Left,Width和Height(TLWH)作为每个矩形的参数,另一个使用Top,Left,Bottom,Right(TLBR)。

出于某种原因,使用TLBR的人要快得多,但我不确定为什么。所以我想知道是否有办法在TLWH实现中看到什么约束花了这么长时间。

有没有办法分析ECLiPSe CLP解决方案?

我目前在Windows上使用TkEclipse。

1 个答案:

答案 0 :(得分:3)

CLP程序的典型特征是代码之间存在没有简单的关系(特别是模拟问题的部分)和执行性能。最明显的例子是,通过添加冗余约束,通常可以彻底减少运行时。

CLP表现的主要因素是搜索树的大小和形状,幸运的是,这取决于很多因素。幸运的是,因为它为我们提供了许多影响搜索树的选项。不幸的是,因为它会使预测性能变得困难。

第二个因素是约束传播的强度,它与模型的制定方式有更直接的联系。例如,单个“全局”约束(一次对许多变量起作用)通常比具有许多较小约束的等效公式提供更强的传播。传播强度又会影响搜索树的大小。

因此,要找出为什么两个实现的行为如此不同,第一步是比较它们的搜索树。最简单的方法是查看查找解决方案所需的回溯的数量。如果您使用search/6库谓词,则可以通过Options参数获取计数:

search(Xs, ..., ..., ..., ..., [backtrack(BT)]),
printf("Solution found after %d backtracks%n", [BT]),

我使用this Sikaku code作为我的TLBR模型,使用修改后的版本作为TLWH模型。为了找到p(15,1)问题的解决方案,需要

TLBR: 0 backtracks
TLWH: 171 backtracks

显然,这两个程序做的事情非常不同。特别是,TLBR模型似乎“更紧”,不需要太多搜索!

为了找出原因,我在搜索阶段开始之前比较了计算状态(我刚刚删除了对搜索例程的调用,并打印了网格及其部分结果 - 你可以还可以使用跟踪器和术语检查器工具或其他可视化工具)。事实证明,在TLBR模型中,许多矩形已经有了它们的最终位置(即它们的坐标变量已经被实例化),而在TLWH模型中它们都没有(它们的变量仍然可以采用多个值)。

仔细研究一个子问题可以说明原因。仅考虑水平坐标,假设L是左边缘,R是右边缘,W是矩形的宽度。给出L和W的域,矩形必须覆盖点9.在TLBR模型中,这会导致约束:

?- L::6..9, W::1..4, R#=L+W-1, L#=<9, 9#=<R.
L = L{6..9}
W = W{1..4}
R = R{9..12}
There is 1 delayed goal.
Yes (0.00s cpu)

在TLWH模型中,我们必须以不同方式编写最后一个约束,因为此时我们没有可用的R变量:

?- L::6..9, W::1..4, Rimplicit#=L+W-1, L#=<9, 9#=<L+W-1.
L = L{6..9}
W = W{1..4}
Rimplicit = Rimplicit{6..12}
There are 2 delayed goals.
Yes (0.00s cpu)

我们在TLWH模型中看到右边缘的域,当从L+W-1计算时,并不反映它必须至少为9的信息。我们已经失去了一些传播强度而没有考虑到L+W-1子表达式,我认为这是传播较弱的主要原因。

搜索树存在差异的另一个原因是,我们只是标记了不同的变量:在一种情况下为[L,R],在另一种情况下为[L,W]。特别是在使用域敏感变量选择启发式时,这会导致非常不同的行为。